ローカル ファイル システムからマッパーに入力を与えました。Eclipse からは正常に実行されていますが、クラスターからは実行されていません。入力パスが存在しないと言って、ローカル入力パスを見つけることができません。マッパーにローカル ファイル パスを指定して、クラスター内で実行できるようにし、hdfs で出力を取得できるようにします
7 に答える
これは非常に古い質問です。最近、同じ問題に直面しました。ただし、このソリューションがどの程度正しいかはわかりません。これに欠点がある場合は注意してください。私がやったことは次のとおりです。
mail-archives から解決策を読んで、からfs.default.name
変更hdfs://localhost:8020/
するfile:///
とローカルファイルシステムにアクセスできることに気付きました。ただし、すべての mapreduce ジョブにこれを使用したくはありませんでした。そこで、ローカル システム フォルダに のコピーを作成しcore-site.xml
ました (MR jar を に送信する場所と同じhadoop jar
です)。
そして、私のDriver
クラスでMR
私が追加したのは、
Configuration conf = new Configuration();
conf.addResource(new Path("/my/local/system/path/to/core-site.xml"));
conf.addResource(new Path("/usr/lib/hadoop-0.20-mapreduce/conf/hdfs-site.xml"));
はMR
ローカル システムから入力を受け取り、出力をhdfs:
クラスターで実行するには、データを分散ストレージ (HDFS) にロードする必要があります。最初に使用して HDFS にデータをコピーしてからhadoop fs -copyFromLocal
、HDFS 内のデータのパスを指定してジョブを再度切り捨てます。
質問は興味深いものです。S3 にデータがあり、ジョブを実行する前に HDFS に明示的にコピーすることなく、このデータにアクセスできます。wordcount の例では、次のように指定します。
Hadoop jar の例.jar ワードカウントs3n://bucket/input s3n://bucket/output
これで何が起こるかというと、マッパーは S3 から直接レコードを読み取ります。
これが S3 で実行できる場合、s3n の代わりにこの構文を使用して、同様に Hadoop を実行しないのはなぜですか?
file:///input file:///output
?
しかし、経験的に、これは興味深い方法で失敗しているようです。実際に入力ディレクトリにあるファイルに対して、Hadoop がファイルが見つからないという例外を与えることがわかります。つまり、ローカル ディスクの put ディレクトリにあるファイルを一覧表示できるように見えますが、それらを開いてレコードを読み取ろうとすると、ファイルが見つかりません (またはアクセスできません)。
MapReduceジョブがデータを処理するには、データがHDFS上にある必要があります。そのため、ローカルファイルシステム、ネットワークパス、Webベースのストア(AzureBlobStorageやAmazonBlockstoageなど)などのソースがある場合でも、最初にHDFSでデータをコピーしてから、ジョブを実行する必要があります。つまり、最初にデータをHDFSにプッシュする必要があり、データソースに応じていくつかの方法があります。ローカルファイルシステムからなど、ソースからHDFSへのデータ転送を実行するには、次のコマンドを使用します。
$ hadoop -f CopyFromLocal SourceFileOrStoragePath _HDFS__Or_directPathatHDFS_
このように入力パスを設定してみてください
FileInputFormat.addInputPath(conf, new Path(file:///ローカル ファイル システムのディレクトリ));
ファイル拡張子を指定すると、ローカルシステムからファイルにアクセスできます