2010-12-13 3 views
6

Flumeを使用してHDFSにログを収集しています。テストケースの場合、ログ収集プロセスは実際の使用のためにスケーリングされているので、私は小さなファイル(〜300kB)を持っています。小さなHDFSブロックを組み合わせる最も簡単な方法はどれですか?

これらの小さなファイルをHDFSブロックサイズ(64MB)に近い大きなファイルに簡単に結合する方法はありますか?

+0

ファイルを保存用に結合したいのですか、または地図作成ジョブ入力用に結合しますか? – wlk

+0

マッパーの視点からそれらを組み合わせる方法はありますか? –

+0

私はストレージのためにそれらを結合したいと思っています –

答えて

5

GNU coreutils 分割が可能です。

ソースデータがラインである場合 - 私の場合には、それらはある - そして一行は約84 bytes、その後、HDFSのブロック64MB800000ラインの周りに含まれている可能性がある:

hadoop dfs -cat /sourcedir/* | split --lines=800000 - joined_ 
hadoop dfs -copyFromLocal ./joined_* /destdir/ 

または--line-bytesオプション付き:

hadoop dfs -cat /sourcedir/* | split --line-bytes=67108864 - joined_ 
hadoop dfs -copyFromLocal ./joined_* /destdir/ 
+0

btw私は同じことをするhadoopコマンドを想像することができたので、もし誰かが興味があれば、質問はまだ開いています。 –

3

私の現在の解決策は、限られた数のレデューサーを持ちながら、効果的に何もしないMapReduceジョブを書くことです。各レデューサーはファイルを出力するので、これらのファイルは一緒に猫を飼う。各行に元のファイルの名前を追加して、どこから来たのかを確認することができます。

私が気づいていない標準的な、または実績のある最良の方法がある場合、私はまだ聞き取りに興味があります。

+1

+1。それは私が過去に自分で使った解決策でもあります。 –

+0

私の仕事も最高です。 –

+0

これは私がやったことです。私は、SequenceFileInputFormatクラスのaddInputPathを使用して、私がクラッシュしたいファイルをすべて追加してから、そのジョブを実行します。 – PhillipAMann

3

media6degreesがオープンしているFile Crusherを見てください。少し古いかもしれませんが、ソースをダウンロードして変更や貢献をすることができます。 JARとソースは次の場所にあります。http://www.jointhegrid.com/hadoop_filecrush/index.jsp

これは基本的に小さなファイルをマージするためのマップ・リダクションの方法です。

関連する問題