Cloud Hadoop Hiveでの Icebergテーブル管理

Prev Next

VPC環境で利用できます。

NAVERクラウドプラットフォーム Cloud Hadoopの Hiveでの Icebergテーブルを管理する方法を紹介します。

Apache Icebergの概要

Apache Icebergとは?

Icebergは膨大なデータを分析するための高性能テーブルフォーマットです。
SQLテーブルの安定性とシンプルさをビッグデータを使用する上で提供すると同時に、Spark、Flink、Hive、Trinoなど、広く使われているデータ処理フレームワークと簡単に統合できる機能を提供します。

Apache Icebergの特徴

  • Expressive SQL: データの読み取り、書き込み、更新に広く使われる SQLコマンドをサポートします。SQLコマンドに慣れている人なら誰でも新しい言語を学ぶことなく Apache Icebergを使用してデータレイクを構築し、ほとんどのデータレイクジョブを実行できます。
  • Data Consistency: データを読み書きするすべてのユーザーが同じデータを見るようにデータの整合性を保証します。
  • Full Schema Evolution: スキーマを変更してもテーブルを書き換える必要がありません。ユーザーが基盤データに触れることなく、データテーブルに列を追加したり、列名を変更したり、列を削除できます。
  • Hidden Partitioning: Icebergは列値を取得し、選択的に変換してパーティション値を作成します。ユーザーが直接維持管理する物理的なパーティションが必要ないため、パーティショニングを隠せます。
  • Time Travel and Rollback: ユーザーが時間の経過に伴うデータの変更内容を追跡できるデータバージョン管理をサポートします。したがって、ユーザーが以前のバージョンのデータにアクセスしてクエリし、アップデートジョブと削除ジョブ間で変更されたデータを分析する時間移動機能をサポートします。
  • Data Compaction: データ圧縮を基本的にサポートし、ファイルレイアウトとサイズを最適化するために、様々な機能でデータを最適化できます

Data Catalogでの Icebergの使用

  • Data Catalogコンソールでは、Icebergテーブルの作成と照会が可能で、以下のガイドに沿ってデータを管理できます。
  • 今後、Data compaction、snapshot管理、テーブル最適化などの様々な機能を提供する予定です(2025年下半期予定)。

Cloud Hadoop設定

Cloud Hadoopクラスタの Hive Metastoreストレージを Data Catalogに設定します。

Cloud Hadoop Ecosystemの Hueにアクセス

  1. クラスタアカウントをクリックし、クラスタ詳細情報画面で ドメイン アドレスを確認します。
  2. ウェブブラウザのアドレス入力欄に以下のようにドメインアドレスとポート番号を入力し、Hueウェブページにアクセスします。
https://{ドメインアドレス}:8081
参考

Hadoop User Experience(Hue)は、Apache Hadoopクラスタと共に使用される ウェブベースのユーザーインターフェースです。Hueは他の Hadoopエコシステムと一緒にグループ化され、Hiveジョブと Spark Jobなどを実行できます。

Data Catalogで作成した Database、Tableの確認

Data Catalogコンソールで作成した Databaseと Iceberg typeの Tableを Hueで確認できます。
Data Catalogコンソールでの Iceberg Tableの作成は、Tableガイドをご参照ください。

注意

Hiveで直接 Iceberg typeの Tableを作成する場合、external.table.purge=FALSE オプション設定が必要です。

# テーブル作成クエリの例
CREATE EXTERNAL TABLE `dct_iceberg_table`(
  `id` bigint,
  `name` string,
  `category` string)
ROW FORMAT SERDE
  'org.apache.iceberg.mr.hive.HiveIcebergSerDe'
STORED BY
  'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
LOCATION
  's3a://{table location}'
TBLPROPERTIES (
  'external.table.purge'='FALSE',
  'table_type'='ICEBERG');

Hiveクエリ実行のための設定

  1. add jarを利用して icebergライブラリを使用します。
add jar /usr/nch/3.1.0.0-78/hive/lib/iceberg-hive-runtime-1.2.1.jar;
  1. add jarを利用して libfbライブラリを使用します。
add jar /usr/nch/3.1.0.0-78/hive/lib/libfb303-0.9.3.jar;
  1. オプション値を設定します。
SET hive.vectorized.execution.enabled=false;
SET iceberg.engine.hive.lock-enabled=false;
SET hive.execution.engine=mr;
注意

オプション値を設定しない場合、Insertクエリの実行には問題がありませんが、テーブル照会時に Insertクエリの結果が反映されない場合があります。

  • hive.vectorized.execution.enabled: Icebergは Hiveのベクトル化機能と競合する可能性があるので、無効(false)にする必要があります。
  • iceberg.engine.hive.lock-enabled: Icebergが Hiveテーブルの lock機能を使用しないように無効にします。有効になると、書き込みジョブが制限される場合があります。
  • hive.execution.engine: Icebergが Hiveの Tez engineと完全に互換性がない場合があるので、mr(MapReduce)に設定します。

Hiveクエリの実行

  1. insertを利用してデータを入力します。
Insert into dct_iceberg_table values (1, 'John Doe', 'student');
  1. selectでデータを確認します。
select * from dct_iceberg_table;

クエリ実行による Icebergファイルの変化

  1. データファイル
  • Icebergはテーブルのデータを保存する際に Parquet、Avro、ORCなどのカラム型保存フォーマットを使用します(デフォルト値は Parquetです)。
  • Icebergの設定時に指定したファイルフォーマットよって、新しいデータファイルが作成されます。
  • s3a://{bucket name}/{table location}/data/ サブディレクトリに保存されます。
  • Icebergは固有の UUIDベースファイル名を使用して競合を防止します。
  1. マニフェストファイル(Manifest File)
  • 各データファイルに対するメタデータを保存するファイルです。
  • データファイルのパス、ファイルの最小/最大値(stats)、パーティション情報などが含まれます。
  • s3a://{bucket name}/{table location}/metadata/ 下位に保存されます。
  • ファイル名は一般的に {UUID}.avro 形式です。
  1. マニフェストリストファイル(Manifest List File)
  • マニフェストファイルのリストを管理し、新しい INSERTジョブが実行されると、Icebergは以前の Manifest Listに基づいて変更事項を反映します。
  • s3a://{bucket name}/{table location}/metadata/ 下位に保存されます。
  • ファイル名は一般的に snap-{snapshot-id}-{UUID}.avro 形式です。
  1. メタデータ JSONファイル(Metadata JSON File)
  • Icebergは各ジョブ(INSERT、DELETE、UPDATE)後にテーブルの新しいスナップショットを作成します。
  • このファイルはテーブルの全体ステータスを表し、ロールバックと Time Travel機能をサポートします。
  • s3a://{bucket name}/{table location}/metadata/ 下位に保存されます。
  • ファイル名は一般的に *.metadata.json 形式です。
  1. Icebergテーブルの構造変化
s3a://{bucket name}/{table-location}/
  ├── data/
  │   ├── {UUID}.parquet
  │   └── {UUID}.parquet
  └── metadata/
      ├── snap-{snapshot-id}-{UUID}.avro
      ├── {UUID}.avro
      ├── {UUID}.avro
      └── *.metadata.json

バージョンによるサポート機能の参考

  1. Hueでの hiveバージョンをご確認ください。
select version();
  • Hiveバージョンによっては、Delete、Updateなどがサポートされない場合があります。
注意

Hiveバージョンによっては、Delete、Updateなどがサポートされない場合があります。
Hiveのバージョンによる Icebergの SQLサポートは Icebergドキュメントをご参照ください。