Hadoop処理のためにファイルをGZip形式でアーカイブすることはそれほど優れたアイデアではないことを少し遅れて気づきました。 GZipは分割可能ではありません。参考までに、ここでは繰り返さない問題を示します。
私の質問は次のとおりです。BZip2は、単一のアーカイブファイルをHadoopで並行して処理できる、最高のアーカイブ圧縮ですか? Gzipは間違いなくそうです、そして私の読書からLZOはいくつかの問題を抱えています。
BZIP2 はhadoopで分割可能です-非常に優れた圧縮率を提供しますが、圧縮はCPUを非常に消費するため、CPU時間とパフォーマンスから最適な結果が得られません。
[〜#〜] lzo [〜#〜] はhadoopで分割可能です-hadoop-lzo youを活用分割可能な圧縮LZOファイルがあります。並列処理を行うには、外部の.lzo.indexファイルが必要です。ライブラリは、ローカルまたは分散した方法でこれらのインデックスを生成するすべての手段を提供します。
LZ4 はhadoopで分割可能です-hadoop-4mcを活用して、分割可能な圧縮4mcファイルを作成しました。外部のインデックス作成は必要なく、提供されたコマンドラインツールを使用するか、hadoopの内部/外部でJava/Cコードを使用してアーカイブを生成できます。 4mcは、Hadoop LZ4であらゆる速度/圧縮比のレベルで利用できます。500MB /秒の圧縮速度に達する高速モードから、GZIPとほぼ同等の高い圧縮率を提供する高/超モードまで。
私は他の答えは正しいとは思わない、これによるとbzip2:
分割可能です。 LZOもインデックス付けされている場合です。
したがって、答えは「はい」です。ファイルよりも多くのマッパーを使用する場合は、bzip2を使用する必要があります。
これを行うには、単純なMRジョブを作成してデータを読み取り、再度書き出すだけです。次に、mapred.output.compression.codec
をorg.Apache.hadoop.io.compress.BZip2Codec
に設定する必要があります。
Gzipを使用する5つの方法を以下に示します。3つはインデックスを必要とし、2つはインデックスを必要としません。
zran.c のように、特別に作成されていないgzipファイルのインデックスを作成することができます。次に、ブロック境界で解凍を開始できます。インデックスには、各エントリポイントで32Kの非圧縮データ履歴が含まれます。
Gzipファイルを作成する場合は、定期的なエントリポイントを使用して作成できます。このエントリポイントでは、エントリポイントで圧縮されていない履歴が必要ないため、インデックスが小さくなります。これは、zlibのdeflate()
のZ_FULL_FLUSH
オプションを使用して行われます。
このような各ポイントでZ_SYNC_FLUSH
に続けてZ_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チャンクの00 00 10 00
の後に、gzipヘッダーの開始である次のチャンクの1f 8b 08
が続きます。この7バイトのマーカーは、bzip2マーカーと同じように検索できますが、誤検知の可能性は低くなります。
同じことは、ヘッダーが7バイトである連結されたxzファイル(fd 37 7a 58 5a 00 00
)でも行うことができます。
私の2セント、bzipは書き込みが非常に遅いです。 Apacheでテスト済みSpark 1.6.2、Hadoop 2.7、50Goの単純なJSONファイルを圧縮します。gzipよりもbzipの方が2倍の時間がかかります。
しかし、bzipを使用すると、50Go ==> 4 Go!