Articles

Encoding, Compression, Parquet and Hive

CDH 5.14 クラスタで、parquet ファイル形式のテーブルに hive と impala を使用して挿入した場合のサイズ比較を行っていました。 両方のファイルフォーマットが同じであることから、(デフォルトの圧縮コーデックで)同じような動作をして、ほぼ同じサイズになるはずだと思っていました。

そこで、hive によって書かれた parquet ファイルを見始め、おそらくすべての初心者がエンコーディング対圧縮 (ここでは hive の hdfs テーブルに関連する) について混乱していたであろう点を理解するのに、実際に役立つ観察に出会いました。

エンコードと圧縮の一般的な違いは次のようなものだと思います。 これは、データ表現が変更されるアプリケーション レベルでの話です。

  • 圧縮: 一般的には、下線データがすでにエンコードされているかどうかにかかわらず、与えられたデータのストレージをバイト単位で削減する技術です。
    • 寄木細工のファイル形式でハイブを作成。
    • 挿入の一部として約 1GB の寄木細工のファイルを作成したデータを挿入。
    • 寄木細工のファイルを確認するために、ファイルを hdfs からローカルにコピーしてダンプしました (念のため – hdfs からダンプする方法もあります)。 その後、parquetファイルをダンプすることができるparquet-metaユーティリティを使用して検証しました。/parquet-meta <>

    li

    parquet-のメタダンプからの抜粋。メタダンプからの抜粋
    • ここでは、各カラムが様々なエンコードをしていることを示しています。 各カラムは、ランレングスやビットパックなど、さまざまなエンコーディング(ENCの値)技術でエンコードされていることがわかります(エンコーディング自体については説明しません)。 しかし、ハイブで書かれたparquetファイルは、デフォルトでは圧縮をしません。

    次に

    • 前述のテストで使用された切り捨てられたテーブル
    • hive (beeline) のコマンド ラインで以下の設定を行い、圧縮コーデックを明示的に設定して、hive が書き込んだ寄木細工ファイルを圧縮するようにします。

    SET hive.exec.compress.output=true;

    SET parquet.compression=SNAPPY

    • 同量のデータを挿入しました。
    • 再度、hdfsからローカルにファイルをコピーし、parquet-metaユーティリティを使用してダンプしました。

    parquet-meta dumpからの抜粋。メタダンプからの抜粋
    • ここでは、以下のことがわかります。 これは、ファイルがエンコーディングとともにSNAPPYで圧縮されていることを示しています。

    つまり、エンコーディングと圧縮は異なるものであり、別々に使用することも、一緒に使用することもできるということです。 私は hive (CDH 5.14) で観察したところ、parquet テーブルに書き込むとき、デフォルトではエンコーディングのみを使用し、圧縮は使用しませんでした。

    SET hive.exec.compress.output=true;

    SET parquet.compression=<Compression Codec>

    そうすると、Impalaのインサートとほぼ同じサイズになります(Impalaはデフォルトでエンコードと圧縮の両方を行います)。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です