🧊

Iceberg 1.8.0の変更点

2025/02/16に公開

Iceberg 1.8.0が2月13日にリリースされたので変更点をまとめてみます。すべての変更点はこちらのリンクから参照できます。

互換性周りの問題がいくつか見つかっており、特にクエリエンジンの開発者はアップグレードするかどうかは慎重に判断した方が良さそうです。Trinoでは1.8.0はスキップして1.8.1を待つことを検討中です。

  • RESTカタログでエンドポイントに対する追加のチェックが入ったため、1.8.0から古いRESTカタログに接続しにいくといくつかのエンドポイントでエラーとなります #11756。有名なカタログを例にあげるとPolarisおよびUnityカタログは対象に含まれています。
  • AWSのSDKが最近新しいintegrity protectionsを導入した(aws-sdk-java-v2#5848)影響でMinIO(2025年より前のバージョン)、Vast、Dell ECSなどのストレージを利用している場合、DeleteObjectsRequestなどいくつかのリクエストが失敗します。

Sparkにrewrite_table_pathプロシージャを追加

テーブルのメタデータを指定したディレクトリにコピーするプロシージャです。Icebergのメタデータファイル内では絶対パスが利用されているので、コピー後のファイルはプレフィックスを書き換えられたものが作成されます。データファイル以外がコピーの対象となっており、メタデータファイル、マニフェストリスト、マニフェストファイル、削除ファイルが対象です。

以下の例ではmy_tableのメタデータをs3://bucket/backupへ修正しています。

CALL catalog_name.system.rewrite_table_path('my_table', 's3://bucket/my_table', 's3://bucket/backup');

デフォルトでは指定したテーブルのmetadataディレクトリ配下にcopy-table-staging-{UUID}というディレクトリが作成され、その配下にメタデータファイル群が生成されます。ステージングの場所を変更したい場合はstaging_location引数を指定できます。

└── metadata
    ├── 00000-eb20ffb5-3a13-4666-97f3-a52f987f1368.metadata.json
    └── copy-table-staging-60508edb-0c6a-46d0-8b81-7151cb337094
        ├── 00000-eb20ffb5-3a13-4666-97f3-a52f987f1368.metadata.json
        └── file-list
            ├── _SUCCESS
            └── part-00000-6959629c-7cdd-4fd0-aa19-66706ee6a5bd-c000.csv

デフォルトでは全バージョンのメタデータがコピーされます。一部のバージョンのみをコピーしたい場合はstart_versionend_version引数を指定します。

CALL catalog_name.system.rewrite_table_path(
 table => 'my_table',
 source_prefix => 's3://bucket/my_table',
 target_prefix => 's3://bucket/backup',
 start_version => 'v5.metadata.json',
 end_version => 'v10.metadata.json');

Sparkにcompute_table_statsプロシージャを追加

NDV(Number of Distinct Values)を収集してPuffinファイルを生成するプロシージャです。特定のスナップショットや一部のカラムのみの統計情報を収集することも可能です。シンタックスは以下の通りです。テーブル名は必須で、snapshot_idcolumns引数はオプションです。

my_tableの最新のスナップショットの統計情報を収集する。

CALL catalog_name.system.compute_table_stats('my_table');

my_tablesnap1スナップショットの統計情報を収集する。

CALL catalog_name.system.compute_table_stats(table => 'my_table', snapshot_id => 'snap1' );

my_tablesnap1スナップショット内のcol1およびcol2カラムの統計情報を収集する。

CALL catalog_name.system.compute_table_stats(table => 'my_table', snapshot_id => 'snap1', columns => array('col1', 'col2'));

デフォルトバリュー

内部的には2つのフィールドで構成さています。どちらも既存のデータファイルに変更を加えることなく、デフォルトの値はユーザーに提供する機能です。

  • initial-default: フィールドが追加された後にデータを読み込む際に利用されるデフォルトの値です。
  • write-default: フィールドが追加された後にデータを書き込む際に利用されるデフォルトの値です。

Deletion Vectors

V3スペック向けにDeletion VectorsのAPIが追加されました。こちらについては別のポストで説明しています。
https://zenn.dev/ebyhr/articles/52f7e8db8cc229

Hiveランタイムモジュールの削除

Hiveバージョン4からはHiveのリポジトリ側でIcebergのサポートがビルトインで開発されています。Iceberg側ではHive 2, 3向けの機能が開発されていましたが、関連するコードが1.8.0で削除されました。

ParallelIterableのデッドロックの修正

Icebergを運用していると時々問題になるParallelIterableクラスの修正です。冒頭の互換性の問題がない環境であれば、重要な修正なのでバージョンアップを検討することをオススメします。

統計情報を更新するメソッドのsnapshot-id引数を非推奨に変更

Javaのライブラリを直接利用している開発者に影響のある変更です。
UpdateStatistics#setStatistics(long snapshotId, StatisticsFile statisticsFile)が非推奨となり、UpdateStatistics#setStatistics(StatisticsFile statisticsFile)が推奨されています。StatisticsFileクラスにsnapshotIdが含まれているので、新しいAPIではそちらが利用されます。

Discussion