2012-05-14 3 views
1

マップ/リダクションを使用して同じディレクトリの下にあるいくつかの小さなファイルをマージしようとしています。誰かがストリーミングを使って非常にシンプルになると言いましたが、今はJAVAマップ/縮小しか使用できません。 私の解決策は1つのレコードを1つのレコードで読み込み、同じ出力ファイルに書き込んでいます。しかし、効率が悪いと思います。ファイル全体の内容をマッパーの値として使用できるので、I/O効率を向上できますか? 返信いただきありがとうございます!mapreduceを使っていくつかのファイルをマージするには?

hadoop fs -cat /path/to/files/*.txt | hadoop fs -put - /output/path/blobbed.txt 

あなたは、これがさらに大きなデータセットをうまく動作することがあります:

+0

マージの順序はあなたに関係しますか?これらのファイルは以前のMRジョブから出力されていますか?ソートされた出力を1つ作成するか、定義されていない順序で1つのファイルだけが必要ですか? –

+0

ファイルは既にHDFSまたは一部のローカルディスクにありますか? –

+0

私は命令を要求せず、すべてのファイルはHDFSにあります – wanghao

答えて

3

これを行うには「非効率的」な方法は、単に猫のファイルをアウト戻ってそれを書くことです。

+1

これは非効率的ではありませんが、mapreduceジョブによって並列処理を行うよりも遅いです。いくつの小さなファイルがあるかによっては、MRジョブよりも高速かもしれません。 –

+0

あなたは 'getmerge'と思いますか? –

+0

サイズやファイルの数によって異なります。しかし、ファイルごとに〜64mまでの高速化が必要です。 –

関連する問題