Spark SQLを使用してparquet
ファイルを書き込もうとしています。
デフォルトではSpark SQLはgzip
をサポートしていますが、snappy
やlzo
などの他の圧縮形式もサポートしています。
これらの圧縮形式の違いと、Hive
の読み込みに最適な形式はどれですか。
データで試してみてください。
lzoとsnappyは高速コンプレッサーと非常に高速なデコンプレッサーですが、gzipと比較して圧縮率は低くなりますが、圧縮速度は少し遅くなります。
パフォーマンスを向上させるためにディスク使用量を増やすことができる場合(CPUとSplittableが低い場合)、Snappyを使用します。
SparkがデフォルトでGZIPからSnappyに切り替えられたとき、これが理由でした:
私たちのテストに基づいて、gzip解凍は非常に遅い(100MB /秒未満)ため、クエリの解凍は制限されます。 Snappyは、単一コアで約500MB /秒で解凍できます。
スナッピー:
GZIP:
1) http://boristyukin.com/is-snappy-compressed-parquet-file-splittable/
圧縮率: GZIP圧縮は、SnappyまたはLZOよりも多くのCPUリソースを使用しますが、圧縮率は高くなります。
一般的な使用法: GZipは、アクセス頻度の低いcoldデータに適しています。 SnappyまたはLZOは、頻繁にアクセスされるhotデータに適しています。
SnappyはしばしばLZOよりもパフォーマンスが優れています。有意差を検出するかどうかを確認するには、テストを実行する価値があります。
Splittablity:圧縮データを分割可能にする必要がある場合、BZip2、LZO、およびSnappy形式は分割可能ですが、GZipは分割できません。
GZIPは、Snappyデータを消費するデータと比較して、GZIPデータを読み取るときに、データをSnappyと比較して30%多く、CPUを2倍圧縮します。
LZOは、CPU使用率が低い場合の解凍速度と、CPU使用量を増やして圧縮率を高くすることに重点を置いています。
longterm/staticストレージの場合、GZip圧縮がさらに優れています。
私は1つの回答(@Mark Adler)に同意し、いくつかの調査情報[1]を持っていますが、2つ目の回答(@Garren S)[2]には同意しません。 [2] Parquet splitable with all supported codecs: gzipされたParquetファイルはHDFS for Sparkで分割可能ですか? 、Tom WhiteのHadoop :The Definitive Guide、第4版、第5章:Hadoop I/O、106ページ。[1]私の研究:ソースデータ-205 GB。テキスト(分離フィールド)、圧縮されていません。出力データ:
<!DOCTYPE html>
<html>
<head>
<style>
table,
th,
td {
border: 1px solid black;
border-collapse: collapse;
}
</style>
</head>
<body>
<table style="width:100%">
<tr>
<th></th>
<th>time of computing, hours</th>
<th>volume, GB</th>
</tr>
<tr>
<td>ORC with default codec</td>
<td>3-3,5</td>
<td>12.3</td>
</tr>
<tr>
<td>Parquet with GZIP</td>
<td>3,5-3,7</td>
<td>12.9</td>
</tr>
<tr>
<td>Parquet with SNAPPY</td>
<td>2,5-3,0</td>
<td>60.4</td>
</tr>
</table>
</body>
</html>
変換は、2 m4.16xlargeで構成されるEMRでHiveを使用して実行されました。変換-複数のフィールドによる順序付けですべてのフィールドを選択します。もちろん、この研究は標準的なものではありませんが、少なくとも少しは実際の比較を示しています。他のデータセットでは、計算結果が異なる場合があります。