Flumeを使用してHDFSにログを収集しています。テストケースの場合、ログ収集プロセスは実際の使用のためにスケーリングされているので、私は小さなファイル(〜300kB)を持っています。小さなHDFSブロックを組み合わせる最も簡単な方法はどれですか?
これらの小さなファイルをHDFSブロックサイズ(64MB)に近い大きなファイルに簡単に結合する方法はありますか?
Flumeを使用してHDFSにログを収集しています。テストケースの場合、ログ収集プロセスは実際の使用のためにスケーリングされているので、私は小さなファイル(〜300kB)を持っています。小さなHDFSブロックを組み合わせる最も簡単な方法はどれですか?
これらの小さなファイルをHDFSブロックサイズ(64MB)に近い大きなファイルに簡単に結合する方法はありますか?
GNU coreutils 分割が可能です。
ソースデータがラインである場合 - 私の場合には、それらはある - そして一行は約84 bytes
、その後、HDFSのブロック64MB
が800000
ラインの周りに含まれている可能性がある:
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/
btw私は同じことをするhadoopコマンドを想像することができたので、もし誰かが興味があれば、質問はまだ開いています。 –
私の現在の解決策は、限られた数のレデューサーを持ちながら、効果的に何もしないMapReduceジョブを書くことです。各レデューサーはファイルを出力するので、これらのファイルは一緒に猫を飼う。各行に元のファイルの名前を追加して、どこから来たのかを確認することができます。
私が気づいていない標準的な、または実績のある最良の方法がある場合、私はまだ聞き取りに興味があります。
+1。それは私が過去に自分で使った解決策でもあります。 –
私の仕事も最高です。 –
これは私がやったことです。私は、SequenceFileInputFormatクラスのaddInputPathを使用して、私がクラッシュしたいファイルをすべて追加してから、そのジョブを実行します。 – PhillipAMann
media6degreesがオープンしているFile Crusherを見てください。少し古いかもしれませんが、ソースをダウンロードして変更や貢献をすることができます。 JARとソースは次の場所にあります。http://www.jointhegrid.com/hadoop_filecrush/index.jsp
これは基本的に小さなファイルをマージするためのマップ・リダクションの方法です。
ファイルを保存用に結合したいのですか、または地図作成ジョブ入力用に結合しますか? – wlk
マッパーの視点からそれらを組み合わせる方法はありますか? –
私はストレージのためにそれらを結合したいと思っています –