Mapフェーズとreduceフェーズのジョブを考えると、出力フォルダーに「part-r-00000」のような名前のファイルが含まれていることがわかります。
これらのファイルをアプリケーションレベルで後処理する必要がある場合、出力フォルダー内のすべてのファイルを自然な名前の順序(part-r-00000、part-r-00001、part-r-00002 ...)で繰り返す必要がありますか?仕事の結果を得るために?
または、Hadoopヘルパーファイルリーダーを使用して、「イテレーター」を取得し、ファイルの切り替えを処理することもできます(ファイルpart-r-00000が完全に読み取られたら、ファイルpart-r-00001から続行します)。
Mapreduceで出力フォルダーを指定すると、そこに含まれるのはpart-rファイル(reduceタスクの出力)と_SUCCESSファイル(空)だけです。したがって、後処理を実行する場合は、job1の出力ディレクトリをジョブ2の入力ディレクトリとして設定するだけでよいと思います。
ポストプロセッサには対処可能な要件があるかもしれません。たとえば、出力ファイルを順番に処理することは重要ですか?
または、ファイルをローカルで処理したいだけの場合は、すべてmapreduceジョブの出力形式に依存します。これにより、part-rファイルがどのように構造化されているかがわかります。次に、標準のi/oを簡単に使用できます。
Hadoopファイルシステム(FS)シェルのgetmergeコマンドを使用できます。
hadoop fs -getmerge /mapreduce/job/output/dir/ /your/local/output/file.txt
おそらく、Hadoop FileSystem を使用して、part-r-xxxxxファイルのアプリケーションから反復を実行できます。
FileSystem fs = FileSystem.get(new Configuration());
FileStatus[] status = fs.listStatus(new Path("hdfs://hostname:port/joboutputpath"));
for (int i=0;i<status.length;i++){
fs.open(status[i].getPath())));
}
ChainMapper /ChainReducerを調べることもできます。