1

Hadoop で gzip として圧縮された大量の大きなウェブログ ファイルをコピーします。これらのファイルに対して多くの map/reduce を実行する必要があります。

私の理解では、ファイルごとに実行される Map/Reduce は 1 つだけです。私の場合、これらのジョブをできるだけ早く完了する必要があるため、受け入れられません。

できるだけ多くの map/reduce を実行できるように、gzip ファイルを (hadoop でコピーする前または後で) 小さいチャンクに分割するのが一般的ですか?

ご協力いただきありがとうございます。

4

2 に答える 2

2

lzop を使用して、ファイルの lzo 圧縮コピーを生成できます。圧縮率は gzip よりも低くなりますが、lzo は非常に高速に解凍します。

何かのようなもの;

gunzip --stdout file.gz | lzop -ofile.lzo

動作するはずです。

lzo ファイルを hdfs にコピーしてから、hadoop-lzo をインストールし、それを使用して lzo ファイルのインデックスを生成します。

hadoop jar (hadoop-lzo jar へのパス) com.hadoop.compression.lzo.LzoIndexer file.lzo

(必要に応じて com.hadoop.compression.lzo.DistributedLzoIndexer を使用することもできます)

これにより、lzo ファイルのインデックスが作成されます。

Hadoop は、MapReduce ジョブの分割を生成するときに (正しい入力形式で) インデックスを使用して、.lzo 圧縮ファイルを複数のマッパー/リデューサーに配布します。

より詳細な情報がここにあります。

https://github.com/twitter/hadoop-lzo

そして、いくつかの問題に対処するそのレポのフォークがここにあります。

https://github.com/kevinweil/hadoop-lzo

于 2013-04-02T20:57:25.247 に答える
1

私はあなたの質問についてまだはっきりしていないので、この質問に答えます。私が近いかどうか教えてください:

map/reduce パラダイムを使用して大きな gzip ファイルを解凍するにはどうすればよいですか?

gzip ファイルがこのために特別に準備されていない限り、解凍ジョブをマップすることはできません。解凍は連続して行う必要があります。bzip2 で圧縮されたデータは既に個別に圧縮解除可能なブロックになっていますが、それらをポイントするために、すべてをシリアルに圧縮解除していないと、ブロックを見つけることができず、おそらく目的に反します。

あなたはLZOの「コンテナ」フォーマットについて言及していますが、私があなたを正しく理解していれば、gzipとbzip2でも同様に機能します。

これらの形式のいずれについても、分割して圧縮することにより、並列解凍用の gzip ストリームを準備できます。たとえば、各部分に 1 メガバイトまたは数メガバイトを使用して、圧縮を大幅に低下させないようにし、圧縮時に構築され、圧縮データ ファイルとともに送信または保存された部分へのインデックスを維持します。

gzip ストリームの連結自体は、個々のストリームの解凍の連結に解凍する有効な gzip ストリームです。bzip2 形式の場合も同様です。bzip2 の場合、断片は 900K の倍数にする必要があります。これにより、圧縮率の効率が低下する部分ブロックがなくなります。

その後、そのような gzip または bzip2 ファイルを作成し、各 gzip または bzip2 ストリームの開始位置のファイル オフセットのリストを保持できます。次に、reduce ステップが圧縮されていない結果を正しい順序で連結するだけの、それらの断片をマップ化できます。

于 2013-03-27T20:46:05.527 に答える