Apache Iceberg™ テーブルの自動リフレッシュ

新規または既存の外部管理 Apache Iceberg™ テーブル の自動メタデータリフレッシュを設定します。自動リフレッシュにより、Snowflakeはサーバーレスで継続的に外部Icebergカタログをポーリングし、メタデータを最新のリモート変更と同期します。

Icebergテーブルの自動リフレッシュは、クラウドプロバイダーの通知に依存しないため、ディレクトリテーブルや外部テーブルの自動リフレッシュとは動作が異なります。代わりに、以下の手順に従ってこの機能を構成します。

  1. :ref:` カタログ統合にリフレッシュ間隔を設定します <label-tables_iceberg_auto_refresh_configure_cat_int>`。Snowflakeは、以下の外部Icebergカタログオプションの自動リフレッシュをサポートしています。

    • Apache Iceberg REST OpenAPI 仕様に準拠した REST カタログ

    • Snowflake Open Catalog

    • オブジェクトストレージ(Delta Lakeのみ)

    • AWS Glue

  2. :ref:` カタログ統合を使用する1つ以上のIcebergテーブルを作成します<label-tables_iceberg_auto_refresh_create_table>`。

  3. :ref:` 各テーブルの自動リフレッシュは、AUTO_REFRESH パラメーター <label-tables_iceberg_auto_refresh_update>` で制御します。

このアプローチにより、カタログ統合を通じてリフレッシュ設定を一元管理しながら、必要に応じて個々のテーブルを制御できます。

カタログ統合のリフレッシュ間隔を設定する

CREATE CATALOG INTEGRATION コマンドを実行する際、 REFRESH_INTERVAL_SECONDS パラメーターに値を指定することができます。それ以外の場合、デフォルトのリフレッシュ間隔は30秒です。Snowflakeは、カタログ統合で定義されたIcebergテーブルがある場合にのみ、外部カタログをポーリングします。

次の例では、 AWS Glueのカタログ統合を作成し、リフレッシュ間隔を60秒に指定しています。

CREATE CATALOG INTEGRATION auto_refresh_catalog_integration
  CATALOG_SOURCE = GLUE
  CATALOG_NAMESPACE = 'my_catalog_namespace'
  TABLE_FORMAT = ICEBERG
  GLUE_AWS_ROLE_ARN = 'arn:aws:iam::123456789123:role/my-catalog-role'
  GLUE_CATALOG_ID = '123456789123'
  ENABLED = TRUE
  REFRESH_INTERVAL_SECONDS = 60;
Copy

カタログ統合のリフレッシュ間隔を更新するには、 ALTER CATALOG INTEGRATION コマンドを使用します。

例:

ALTER CATALOG INTEGRATION auto_refresh_catalog_integration SET REFRESH_INTERVAL_SECONDS = 120;
Copy

自動リフレッシュ機能付きIcebergテーブルの作成

CREATE ICEBERG TABLE コマンドを使用してIcebergテーブルを作成します。テーブルが自動メタデータリフレッシュを使用するように指定するには、 AUTO_REFRESH = TRUE を設定します。

以下の例では、 AWS Glueをカタログとして使用するIcebergテーブルを作成し、先に作成したカタログ統合(auto_refresh_catalog_integration)と、 AWS Glueの CATALOG_TABLE_NAME を指定しています。

CREATE OR REPLACE ICEBERG TABLE auto_refresh_iceberg_table
  CATALOG_TABLE_NAME = 'myGlueTable'
  CATALOG = 'auto_refresh_catalog_integration'
  AUTO_REFRESH = TRUE;
Copy

自動リフレッシュの有効化または無効化

注釈

  • テーブルがSnowflakeバージョン8.22より前に作成されたカタログ統合を使用している場合は、テーブルの自動リフレッシュを有効にする前に、 ALTER CATALOG INTEGRATION コマンドを使用して REFRESH_INTERVAL_SECONDS パラメーターを設定する必要があります。

  • Icebergテーブルの自動リフレッシュのオン/オフを頻繁に切り替えると、テーブルのメタデータのリフレッシュが遅くなります。

既存のIcebergテーブルの自動リフレッシュを有効または無効にするには、 ALTER ICEBERG TABLE コマンドを使用します。

例:

ALTER ICEBERG TABLE my_iceberg_table SET AUTO_REFRESH = FALSE;
Copy

自動リフレッシュステータスの監視

SHOW ICEBERG TABLES

複数のテーブルの自動リフレッシュステータスを取得するには、 SHOW ICEBERG TABLES コマンドを使用します。

SHOW ICEBERG TABLES;
Copy

コマンド出力には、 auto_refresh_status という列があり、アクセス権限を持っている各テーブルについて、 SYSTEM$AUTO_REFRESH_STATUS 関数と同じ情報が表示されます。

SYSTEM$AUTO_REFRESH_STATUS

特定のテーブルの自動リフレッシュステータスを取得するには、 SYSTEM$AUTO_REFRESH_STATUS 関数を呼び出します。

SELECT SYSTEM$AUTO_REFRESH_STATUS('my_iceberg_table');
Copy

この関数は、実行状態やスナップショットキューのサイズなど、Snowflakeがテーブルのリフレッシュを自動化するために使用するパイプに関する詳細を返します。実行状態 RUNNING は、自動リフレッシュが期待通りに実行されていることを示します。詳細については、 SYSTEM$AUTO_REFRESH_STATUS をご参照ください。

ICEBERG_TABLE_SNAPSHOT_REFRESH_HISTORY

特定のテーブルの最新の更新履歴に関するメタデータとスナップショット情報を取得するには、 ICEBERG_TABLE_SNAPSHOT_REFRESH_HISTORY 関数を使用します。

SELECT *
FROM TABLE(INFORMATION_SCHEMA.ICEBERG_TABLE_SNAPSHOT_REFRESH_HISTORY(
  TABLE_NAME => 'my_iceberg_table'
));
Copy

自動リフレッシュイベントのモニター

Snowflakeを設定して、Icebergテーブルの自動リフレッシュのステータスに関する情報を提供するイベントを記録できます。Snowflakeはイベントを :doc:`アクティブなイベントテーブル </developer-guide/logging-tracing/event-table-setting-up>`に記録します。たとえば、データベースに関連付けられたイベントテーブルがあるとします。SnowflakeがそのデータベースのIcebergテーブルを自動的に更新すると、Snowflakeはイベントをイベントテーブルに記録します。

自動リフレッシュイベントをモニターすると、以下の領域に対する洞察を得ることができます。

  • 自動更新の進行状況:自動リフレッシュプロセスによって、スナップショットがどのように移動するかを追跡します。

  • 集計統計:自動リフレッシュ操作の要約された統計を確認します。

また、以下の重大な状況に対するアラートを構成することもできます。

  • 更新エラー

  • 高いリフレッシュレイテンシ

注釈

自動リフレッシュのイベントログにはコストがかかります。詳細については、 テレメトリーデータ収集の費用 をご参照ください。

Snowflakeは、自動リフレッシュが開始、完了、またはエラーが発生したときにイベントを記録します。

イベントをキャプチャする重大度レベルを設定する

自動リフレッシュイベントをキャプチャするには、IcebergテーブルレベルまたはアカウントレベルでLOG_LEVELパラメーターを設定する必要があります。その LOG_LEVEL は、次の値に基づいてキャプチャするイベントを決定します。

  • ERROR:解決するために人間の介入を必要とする変更を示すイベント。

  • WARN:人間の介入なしに解決できる問題を示すイベント。

  • DEBUG:大量のイベント。

注釈

デフォルトの重大度レベルはありません。イベントをキャプチャするには、アカウントレベルまたはIcebergテーブルレベルで重大度レベルを設定する必要があります。

たとえば、特定のIcebergテーブルの レベルのDEBUG自動リフレッシュイベントをキャプチャするには、以下のコマンドを使用します。

ALTER ICEBERG TABLE <my_table_name> SET LOG_LEVEL = DEBUG;
Copy

詳細については、 ロギング、メトリクス、トレースのレベル設定 をご参照ください。

自動リフレッシュイベントのイベントテーブルをクエリする

自動リフレッシュイベントをクエリする前に、イベントテーブルを設定し、イベントキャプチャの重大度レベルを設定する必要があります

次の例は、スナップショットの処理中に生成されたIcebergの自動リフレッシュイベントを取得する方法を示しています。

SELECT record_type,
       record:"name" event_name,
       record:"severity_text" log_level,
       resource_attributes:"snow.database.name" database_name,
       resource_attributes:"snow.schema.name" schema_name,
       resource_attributes:"snow.table.name" table_name,
       resource_attributes:"snow.catalog.integration.name" catalog_integration_name,
       record_attributes:"snow.snapshot.id" snapshot_id,
       parse_json(value):metadata_file_location metadata_file_location,
       parse_json(value):snapshot_state snapshot_state
  FROM my_active_event_table
  WHERE record_type='EVENT' AND event_name='iceberg_auto_refresh_snapshot_lifecycle';
Copy

出力:

+-------------+-----------------------------------------+-----------+---------------+-------------+------------+--------------------------+---------------+------------------------+----------------+
| RECORD_TYPE | EVENT_NAME                              | LOG_LEVEL | DATABASE_NAME | SCHEMA_NAME | TABLE_NAME | CATALOG_INTEGRATION_NAME | SNAPSHOT_ID   | METADATA_FILE_LOCATION | SNAPSHOT_STATE |
+-------------+-----------------------------------------+-----------+---------------+-------------+------------+--------------------------+---------------+------------------------+----------------+
| EVENT       | iceberg_auto_refresh_snapshot_lifecycle | DEBUG     | TESTDB        | TESTSH      | TESTTABLE  | glue_integration         | 4281775564368 | metadata.json          | started        |
| EVENT       | iceberg_auto_refresh_snapshot_lifecycle | DEBUG     | TESTDB        | TESTSH      | TESTTABLE  | glue_integration         | 4281775564368 | metadata.json          | completed      |
+-------------+-----------------------------------------+-----------+---------------+-------------+------------+--------------------------+---------------+------------------------+----------------+

エラーの回復

自動リフレッシュ処理中にエラーが発生すると、Snowflakeは実行状態を以下の値のいずれかに更新します。

  • STALLED は、Snowflakeがエラーから回復しようとしていることを意味します。回復が成功した場合、自動リフレッシュプロセスは期待通りに実行され続け、実行状態は健全な RUNNING 状態に遷移します。

  • STOPPED は、自動リフレッシュプロセスで回復不能なエラーが発生し、テーブルの自動リフレッシュが停止したことを意味します。

    回復不能なエラーは、例えばSnowflakeがターゲットスナップショットと現在のスナップショットの間の直接の系列を確立できない場合に発生する可能性があります。

    STOPPED の状態から回復するには、以下の操作を行います。

    1. テーブル上の 自動リフレッシュをオフにします

    2. 手動でメタデータをリフレッシュします。手順については、 テーブルのメタデータをリフレッシュする をご参照ください。

    3. ALTER ICEBERG TABLE ... SET AUTO_REFRESH ステートメントを使用して、自動リフレッシュを再度有効にしてください。

    4. SYSTEM$AUTO_REFRESH_STATUS 関数を呼び出すことによって、自動リフレッシュが RUNNING 状態にあることを確認します。また、この関数を複数回呼び出して、キューに入れられたスナップショット(pendingSnapshotCount)の数が徐々に減っていくことを確認することもできます。

請求

SnowflakeはSnowpipeを使用してIcebergテーブルのリフレッシュを自動化するため、自動リフレッシュの料金はSnowpipeの料金と同じ項目で請求書に表示されます。イベントを使用して自動リフレッシュをモニターする にもコストがかかります。詳細については、:doc:`/developer-guide/logging-tracing/logging-tracing-billing`をご参照ください。

この機能にSnowpipeのファイル料金はかかりません。

Account Usage PIPE_USAGE_HISTORY ビュー を調べることで発生した料金を見積もることができます。pipe_name 列に Iceberg テーブル名が表示されます。

Delta・ベースのIceberg・テーブルでは、自動リフレッシュ・パイプに NULL パイプ名が表示されます。

Icebergテーブルの料金に関する詳細は、 Icebergテーブルの請求 を参照してください。

考慮事項と制約

自動リフレッシュを使用するIcebergテーブルを使用する場合は、以下の点を考慮してください。

  • Snowflakeバージョン8.22(またはDeltaベースのテーブルの場合は9.2)より前に作成されたカタログ統合では、そのカタログ統合に依存するテーブルの自動リフレッシュを有効にする前に、 REFRESH_INTERVAL_SECONDS パラメーターを手動でセットする必要があります。手順については、 ALTER CATALOG INTEGRATION ... SET AUTO_REFRESH をご参照ください。

  • オブジェクトストレージ用カタログ統合 の場合、自動リフレッシュは TABLE_FORMAT = DELTA との統合でのみサポートされます。

  • 更新頻度が高いテーブルでは、短いポーリング間隔 (REFRESH_INTERVAL_SECONDS) を使用するとパフォーマンスが低下することがあります。