2013-08-26 3 views
9

フェーズを縮小したマップジョブでは、出力フォルダに「part-r-00000」のような名前のファイルが含まれていることがわかりました。Hadoop - 削減後に出力ファイルから結果を取得しますか?

これらのファイルをアプリケーションレベルで後処理する必要がある場合は、自然な命名順(part-r-00000、part-r-00001、part-r-00002)で出力フォルダ内のすべてのファイルを反復処理する必要がありますか? ...)仕事の結果を得るために?

または、私はいくつかの "iterator"を取得し、私のためにファイルの切り替えを処理することができるいくつかのhadoopヘルパーファイルリーダーを使用することができます(ファイルpart-r-00000が完全に読み込まれると、 )?

答えて

4

mapreduceでは出力フォルダを指定しますが、それに含まれるのはpart-rファイル(reduceタスクの出力)と_SUCCESSファイル(空)です。だから後処理をしたいのであれば、ジョブ2の入力ディレクトリとしてjob1の出力ディレクトリを設定する必要があるだけだと思います。

ここでは、ポストプロセッサに対処する必要があるかもしれません。出力ファイルを順番に処理するには?

ファイルをローカルで処理したい場合は、すべてmapreduceジョブの出力形式に依存します。これは、part-rファイルの構造を示します。次に、あなたは標準のI/Oを使うことができます。

+0

これらのファイルを別のホストに取得し、コンテンツをデータベースに変換/挿入する必要があります。クラスタにはデータベースへのアクセス権がないため、私は減らす段階でその挿入を行うことはできません。 – jdevelop

6

あなたはHadoopのファイルシステム(FS)シェルのgetmergeコマンドを使用することができます。

hadoop fs -getmerge /mapreduce/job/output/dir/ /your/local/output/file.txt 
+0

Javaコードでこれを行う必要があります。 – jdevelop

+0

@jdevelop:copyMergeメソッドを使用することができます。https://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileUtil.html – MicTech

1

おそらく一部-R-XXXXXファイルのアプリケーションから繰り返しを行うためのHadoop FileSystemを使用することができます。

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を見ることもできます。

+0

私は実際にこの機能の組み込み実装を探していましたHadoopで – jdevelop

+0

なぜFileSystemから使用しないのですか?[copyToLocal](http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileSystem.html#copyToLocalFile%28boolean,%20org.apache.hadoop.fs .Path、%20org.apache.hadoop.fs.Path%29)自身をあなたのローカルファイルシステムに入れたい場合や、[FileUtils](http://hadoop.apache.org/docs/current/api/org/ apache/hadoop/fs/FileUtil.html)、いくつかの方法がありますか? –

+0

このように、私はいくつかのファイルを扱わなければなりません。理想的には、HDFSパスとレコードリーダーを指定し、レデューサーによって作成されたファイルの数を気にせずにレコードのイテレータを取得したいと考えています。 – jdevelop

関連する問題