27

Hadoop 処理のためにファイルを GZip 形式でアーカイブすることはあまり良い考えではないことに、少し遅れて気づきました。GZip は分割可能ではありません。参考までに、繰り返さない問題を以下に示します。

私の質問は、BZip2 は、単一のアーカイブ ファイルを Hadoop で並行して処理できるようにする最適なアーカイブ圧縮ですか? Gzipは間違いなくそうではありません。私の読書によると、LZOにはいくつかの問題があります。

4

4 に答える 4

29

BZIP2は Hadoop で分割可能です。非常に優れた圧縮率を提供しますが、圧縮は CPU を大量に消費するため、CPU 時間とパフォーマンスから最適な結果が得られません。

LZOは Hadoop で分割可能です - hadoop-lzoを利用すると、分割可能な圧縮された LZO ファイルがあります。並列処理できるようにするには、外部の .lzo.index ファイルが必要です。ライブラリは、これらのインデックスをローカルまたは分散方式で生成するすべての手段を提供します。

LZ4は Hadoop で分割可能です - hadoop-4mcを利用すると、分割可能な圧縮 4mc ファイルが得られます。外部のインデックス作成は必要ありません。提供されているコマンド ライン ツールまたは Java/C コードを使用して、hadoop の内部/外部でアーカイブを生成できます。4mc は、あらゆるレベルの速度/圧縮比で Hadoop LZ4 を利用できるようにします: 500 MB/秒の圧縮速度に達する高速モードから、GZIP とほぼ同等の圧縮比を高める高/ウルトラ モードまで。

于 2014-09-17T10:43:35.067 に答える
6

gzipを使用する5つの方法、3つはインデックスが必要、2つはインデックスが必要ない方法を次に示します。

zran.cのように、特別に作成されていないgzipファイルのインデックスを作成することができます。次に、ブロック境界で解凍を開始できます。インデックスには、各エントリポイントでの32Kの非圧縮データ履歴が含まれます。

gzipファイルを作成している場合は、定期的なエントリポイントを使用して作成できます。これらのエントリポイントでは、インデックスが非圧縮の履歴を必要としないため、インデックスが小さくなります。これは、zlibのZ_FULL_FLUSHオプションを使用して実行されます。deflate()

Z_SYNC_FLUSHまた、そのような各ポイントでaZ_FULL_FLUSHを実行して、2つのマーカーを挿入することもできます。次に、9バイトのパターン00 00 ff ff 00 00 00 ff ffを検索してそれらを見つけることができます。これは、bzip2ファイルで6バイトのマーカーを検索するのと同じですが、9バイトで誤検知が発生する可能性がはるかに低い点が異なります。その場合、個別のインデックスファイルは必要ありません。

gzipとxzはどちらも単純な連結をサポートしています。これにより、別の方法で並列解凍用のアーカイブを簡単に準備できます。要するに:

gzip < a > a.gz
gzip < b > b.gz
cat a.gz b.gz > c.gz
gunzip < c.gz > c
cat a b | cmp - c

比較が成功します。

次に、目的のサイズのチャンクに単純に圧縮して、結果を連結できます。各gzipストリームの開始のオフセットにインデックスを保存します。それらのオフセットから解凍します。アプリケーションに応じて、チャンクのサイズを好みに合わせて選択できます。ただし、小さくしすぎると、圧縮に影響します。

gzipファイルを単純に連結すると、各チャンクを非圧縮サイズに固定した場合、インデックスを削除することもできます。次に、各チャンクは同じ4バイトで終了し、圧縮されていない長さはリトルエンディアンの順序で終了します。たとえば、1 MiBチャンクの場合は、次のチャンク(gzipヘッダーの開始)が00 00 10 00続きます。1f 8b 08その7バイトのマーカーは、bzip2マーカーと同じように検索できますが、誤検知の可能性は低くなります。

ヘッダーが7バイトである連結xzファイルでも同じことができますfd 37 7a 58 5a 00 00

于 2013-02-11T23:54:51.273 に答える
6

これによると、他の答えが正しいとは考えていません.bzip2:

http://comphadoop.weebly.com/

分割可能です。LZO も索引付けされている場合です。

したがって、答えはイエスです。ファイルよりも多くのマッパーを使用したい場合は、bzip2 を使用する必要があります。

これを行うには、単純な MR ジョブを作成してデータを読み取り、それを再度書き出すことができますmapred.output.compression.codecorg.apache.hadoop.io.compress.BZip2Codec

于 2014-04-14T17:10:21.370 に答える
1

私の2セント、bzipは書き込みが非常に遅いです。Apache Spark 1.6.2、Hadoop 2.7 でテストし、50Go の単純な JSON ファイルを圧縮すると、gzip より bzip で 2 倍の時間がかかります。

しかし、bzip では、50Go ==> 4 Go!

于 2018-09-07T10:13:35.437 に答える