Encoding, Compression, Parquet and Hive
CDH 5.14 クラスタで、parquet ファイル形式のテーブルに hive と impala を使用して挿入した場合のサイズ比較を行っていました。 両方のファイルフォーマットが同じであることから、(デフォルトの圧縮コーデックで)同じような動作をして、ほぼ同じサイズになるはずだと思っていました。
そこで、hive によって書かれた parquet ファイルを見始め、おそらくすべての初心者がエンコーディング対圧縮 (ここでは hive の hdfs テーブルに関連する) について混乱していたであろう点を理解するのに、実際に役立つ観察に出会いました。
エンコードと圧縮の一般的な違いは次のようなものだと思います。 これは、データ表現が変更されるアプリケーション レベルでの話です。
- 寄木細工のファイル形式でハイブを作成。
- 挿入の一部として約 1GB の寄木細工のファイルを作成したデータを挿入。
- 寄木細工のファイルを確認するために、ファイルを hdfs からローカルにコピーしてダンプしました (念のため – hdfs からダンプする方法もあります)。 その後、parquetファイルをダンプすることができるparquet-metaユーティリティを使用して検証しました。/parquet-meta <>
- ここでは、各カラムが様々なエンコードをしていることを示しています。 各カラムは、ランレングスやビットパックなど、さまざまなエンコーディング(ENCの値)技術でエンコードされていることがわかります(エンコーディング自体については説明しません)。 しかし、ハイブで書かれたparquetファイルは、デフォルトでは圧縮をしません。
次に
- 前述のテストで使用された切り捨てられたテーブル
- hive (beeline) のコマンド ラインで以下の設定を行い、圧縮コーデックを明示的に設定して、hive が書き込んだ寄木細工ファイルを圧縮するようにします。
SET hive.exec.compress.output=true;
SET parquet.compression=SNAPPY
- 同量のデータを挿入しました。
- 再度、hdfsからローカルにファイルをコピーし、parquet-metaユーティリティを使用してダンプしました。
- ここでは、以下のことがわかります。 これは、ファイルがエンコーディングとともにSNAPPYで圧縮されていることを示しています。
つまり、エンコーディングと圧縮は異なるものであり、別々に使用することも、一緒に使用することもできるということです。 私は hive (CDH 5.14) で観察したところ、parquet テーブルに書き込むとき、デフォルトではエンコーディングのみを使用し、圧縮は使用しませんでした。
SET hive.exec.compress.output=true;
SET parquet.compression=<Compression Codec>
そうすると、Impalaのインサートとほぼ同じサイズになります(Impalaはデフォルトでエンコードと圧縮の両方を行います)。