Amazon AthenaからIceberg形式のGlueテーブルの削除済みのスナップショットにタイムトラベルできないことを確認する

Iceberg形式のGlueテーブルについて、スナップショットを削除してみて、タイムトラベルができなくなる場合を確認してみました。
2024.06.16

データアナリティクス事業本部 インテグレーション部 機械学習チームの鈴木です。

今回は簡単な例ですが、Iceberg形式のGlueテーブルに対して、どのような場合にタイムトラベルができて、どうすればできなくなるのかをAmazon Athenaから確認してみました。

はじめに

Amazon AthenaなどでサポートされているIcebergテーブルでは、スナップショットをもとに過去のデータの状態にタイムトラベルすることが可能です。

一方でスナップショットが残ってしまうことが課題となるケースもあります。例えば以下のSnowflakeの記事で紹介されているようなケースです。

これはEU一般データ保護規則(GDPR)で認められている忘れられる権利によって必要となる対応で、事業提供者はユーザーからの個人情報削除要求後、一般的に30日、場合によっては90日後に個人情報をデータベースから削除する必要があります。

タイムトラベルが便利だからといってあまりにも長い時間を設定しておくと、例えばこのような要件に対応ができなくなってしまうため、適切にテーブルのタイムトラベル期間を設計・設定しておく必要があります。

Amazon AthenaでもIceberg形式のGlueテーブルに対する操作を行うことができ、タイムトラベルもサポートされていますが、スナップショットがなくなると本当にタイムトラベルできなくなるのか確認してみました。

準備

以下のようにIcebergテーブルを用意しました。

早めにスナップショットを有効期限切れにしたいので、vacuum_max_snapshot_age_secondsを60秒にしています。

-- Icebergテーブルを作成する
CREATE TABLE target_table_iceberg_parquet (
  item_id string,
  item_value string)
LOCATION 's3://データを配置するS3バケット名/target_table_iceberg_parquet'
TBLPROPERTIES (
  'table_type'='iceberg',
  'write_compression'='snappy',
  'format'='PARQUET',
  'vacuum_max_snapshot_age_seconds'='60'
);

-- サンプルデータを格納する
INSERT INTO target_table_iceberg_parquet (item_id, item_value)
SELECT item_id, item_value
FROM sample_table;

作成したテーブルには以下のようにデータが格納されました。

作成したテーブル

スナップショットの有無は以下のようにIcebergテーブルメタデータをクエリすることで確認しました。

SELECT * FROM "データベース名"."target_table_iceberg_parquet$snapshots" LIMIT 10;

テーブル作成時のスナップショット

このとき、スナップショット作成時にタイムトラベルできることを確認しました。

テーブル作成時点にタイムトラベルできることを確認

タイムトラベル可否の確認

1. テーブルの変更のみ

UPDATE target_table_iceberg_parquet SET item_value='updated' WHERE item_id='1';

以下のように新しくスナップショットができたことが確認できました。

新しくできたスナップショットの確認

この時点ではまだスナップショット作成時にタイムトラベルできました。

テーブル更新後にまだタイムトラベルできることの確認

これにより、スナップショットの期限が切れている場合でもタイムトラベルで検索ができることが分かりました。

2. 最適化の実施後

テーブル作成時のスナップショットは期限切れなので、VACUUMで削除してからタイムトラベルしてみました。

VACUUM target_table_iceberg_parquet;

以下のようにスナップショットが消えたことを確認しました。

VACUUM後のスナップショット

この状態でタイムトラベルすると、INVALID_ARGUMENTS: No version history table "データベース名"."テーブル名" at or before タイムトラベル先の時間というエラーがでて、検索できないことが分かりました。

タイムトラベルできないことの確認

補足

今回VACUUMで削除するスナップショットはテーブルプロパティのvacuum_max_snapshot_age_secondsで指定しましたが、VACUUMコマンドのガイドにほかのパターンも記載されているためご確認ください。

Icebergテーブルメタデータのクエリについても、ガイドにて紹介されています。

おわりに

今回はIceberg形式のGlueテーブルに対して、どのような場合にタイムトラベルができて、どうすればできなくなるのかをAmazon Athenaから確認してみました。

基本的には想定通りの挙動ですが、期限切れのスナップショットであっても最適化コマンドを実行してスナップショットを削除しておかないとデータにアクセスできてしまう点は注意が必要そうでした。

また、タイムトラベルしたい場合にもスナップショットが残っていないとできなくなってしまうので、なにか調査したい場合にそろそろスナップショットが削除されそうだなと思ったらすかさず何かしらの方法でバックアップをとっておくことを覚えておきましょう。

参考になりましたら幸いです。