Open Catalog の公式ドキュメントを読む上で、用語の統一がされておらず、読解に時間を要した。
迷ったポイントを、この記事で取り上げる。
読解のきっかけ
以下の確証を得ること。念のため、Snowflakeのサポートにも確認済み。
「Open CatalogのInternalタイプでカタログを構成すれば、Snowflakeに限らずIceberg Catalog REST API互換の外部エンジンから読み・書きできることが可能」
「外部」「内部」という言葉は、どの立場でカタログを見るかで逆転する
Snowflake の「外部」は Open Catalog の「内部」タイプである。
具体的には、
以下ドキュメント①(Snowflake)が言う「外部」は、「Snowflakeの外にカタログサーバー(REST API)が存在すること」を指しており、
公式ドキュメント①
Apache Iceberg™ テーブル
カタログオプション
Snowflakeは以下のIcebergカタログオプションをサポートしています。
- Snowflakeを Icebergカタログ として使用
- 外部Icebergカタログを使用
https://docs.snowflake.com/ja/user-guide/tables-iceberg#catalog-options
以下ドキュメント②(Open Catalog)が言う「外部」タイプは、「Open Catalog以外で生成されたメタデータをインポート(Open Catalogへ同期)すること」を指す一方で、「内部(Internal)」は、Open CatalogがIcebergカタログとしてメタデータを管理することを指す。
公式ドキュメント②
Snowflakeオープンカタログの概要
カタログの種類
カタログは以下の2つの種類のいずれかになります。
- Internal: The catalog is managed by Open Catalog. A third-party query engine can read and write to tables from this catalog. In addition, Snowflake can also read and write to tables from this catalog.
- 外部:カタログは、他のIcebergカタログプロバイダー(例えば、Snowflake、Glue、Dremio Arctic)によって外部管理されています。このカタログからのテーブルはOpen Catalogに同期されます。これらのテーブルは、オープンカタログでは読み取り専用です。現在のリリースでは、Snowflakeの外部カタログのみが提供されています。
https://docs.snowflake.com/ja/user-guide/opencatalog/overview#catalog-types
定義の整理
| メタデータ管理主体 | Snowflake (Horizon)での呼称 | Open Catalogでの呼称 | 仕組み | DDLイメージ |
|---|---|---|---|---|
| Snowflake | Internal (Managed Table) | External | Snowflakeがメタデータを生成し、Open Catalogへ同期(通知)する | ICEBERG TABLE ... CATALOG = 'SNOWFLAKE' |
| Open Catalog | External (Iceberg REST) | Internal | Open Catalogがメタデータを管理し、SnowflakeはREST API経由で参照する | CATALOG INTEGRATION + LINKED_CATALOG |
補足:外部(External)の用語比較
SnowflakeのDB用アカウント(ドキュメント①)の「SnowflakeをIcebergカタログとして使用」は、Open Catalog(ドキュメント②)の「外部(Extarnal)」のこと。
- Snowflake-managed Icebergテーブル を Open Catalog に同期して見せる旨が説明されている。ドキュメント①表内にも、「カタログとしてSnowflakeを使用: Snowflakeで管理されたテーブルを Open Catalog と同期して、他のコンピュートエンジンを使ってテーブルをクエリすることができます。」と説明されている
補足:内部(Internal) の用語比較
SnowflakeのDB用アカウント(ドキュメント①)の「外部Icebergカタログを使用」は、Open Catalog(ドキュメント②)の「内部(Internal)」のこと
- Open Catalog を外部カタログ(Iceberg REST)として参照するという旨が説明されている。ドキュメント①表内の「外部カタログの使用: Snowflakeを使用して、 Open Catalog で管理されているIcebergテーブルに対してクエリや書き込みを行うことができます。」と説明されている
- なお、「現在のリリースでは、Snowflakeの外部カタログのみが提供されています。」という箇所でちょっとドキッとするが、Open Catalogとしての「内部(Internal)」カタログは作成可能。実際、カタログ作成時に設定可能な「External」というトグルスイッチをOFFのままにすれば、内部(Internal)として作成される。
Open Catalogが管理するテーブルへの書き込み可否の揺らぎ
Snowflake公式の Open Catalog ガイド側に、Snowflake は Open Catalog が管理するテーブルへは書き込めないという記述が残っている。
Snowflakeで Snowflake Open Catalog を使用して Apache Iceberg™ テーブルを使用する
テーブルアクセス
- Open Catalog と同期したSnowflake管理Icebergテーブルは、 Open Catalog では読み取り専用です。
- Snowflakeはクエリはできますが、 Open Catalog が管理するテーブルへの書き込みはできません。
その一方で、外部 Iceberg REST カタログ(例:Open Catalog を含む)に対して、catalog-linked DB 経由で書き込みができる旨も説明されている。
外部管理 Apache Iceberg™ テーブル テーブルへの書き込みサポートにより、外部Iceberg REST カタログで管理されているテーブルに対して書き込み操作を実行できます。
https://docs.snowflake.com/ja/user-guide/tables-iceberg-externally-managed-writes
Internal: The catalog is managed by Open Catalog. A third-party query engine can read and write to tables from this catalog. In addition, Snowflake can also read and write to tables from this catalog.
https://docs.snowflake.com/ja/user-guide/opencatalog/overview#catalog-types
上記読解による違いはあるものの、実際以下のようにした場合は、書き込みは可能。
-- カタログ統合
CREATE OR REPLACE CATALOG INTEGRATION open_catalog_int
CATALOG_SOURCE = POLARIS
TABLE_FORMAT = ICEBERG
CATALOG_NAMESPACE= 'xxx_namespace'
REST_CONFIG = (
CATALOG_URI = 'https://xxx_open_catalog.snowflakecomputing.com/polaris/api/catalog'
CATALOG_NAME = 'catalog-blob-endpoint'
ACCESS_DELEGATION_MODE = EXTERNAL_VOLUME_CREDENTIALS
)
REST_AUTHENTICATION = (
TYPE = OAUTH
OAUTH_CLIENT_ID = '...'
OAUTH_CLIENT_SECRET = '...'
OAUTH_ALLOWED_SCOPES = ( '...' )
)
ENABLED = TRUE;
-- catalog-linked DB
CREATE OR REPLACE DATABASE iceberg_linked_db
LINKED_CATALOG = (
CATALOG = 'open_catalog_int'
ALLOWED_WRITE_OPERATIONS = ...
)
EXTERNAL_VOLUME = '...'
CATALOG_CASE_SENSITIVITY = CASE_SENSITIVE;
--- リンクDB配下でDDL
USE ROLE ...;
USE DATABASE iceberg_linked_db;
GRANT USAGE ON DATABASE iceberg_linked_db TO ROLE ...;
GRANT CREATE SCHEMA ON DATABASE iceberg_linked_db TO ROLE ...;
CREATE SCHEMA xxx_namespace;
USE SCHEMA xxx_namespace;
CREATE OR REPLACE ICEBERG TABLE xxx_table (col1 INT);
--- 参照確認用
INSERT INTO xxx_table VALUES (1);
SELECT * FROM xxx_table;
つまり、
- Snowflake managedテーブルをOpen Catalogに見せるだけ=外部タイプのOpen Catalogの場合、一方向同期であるため、Open Catalog側からの書き込みは本質的に不可能(読み取り専用)
- 一方、CATALOG_INTEGRATIONを介した内部タイプの方法では、Snowflakeは外部カタログに対する正当なライターとなり、DML(INSERT/UPDATE等)が実行可能と言えるように思う
外部(External)カタログの制限について
Open Catalogの「外部(External)」タイプは、ストレージへのアクセス権限、カタログへのアクセス権限をDB用のSnowflakeから抽象化・分離するような限定的なユースケースに絞られる。
というのも、このタイプは、Snowflake(Horizon Catalog)からのメタデータ同期に完全に依存しており、かつ、2025年11月のアップデート(Preview)により、Snowflake Horizon 自体が Iceberg REST カタログとして振る舞えるようになった。これにより、外部エンジンからSnowflake管理のIcebergテーブルを参照する際、Open Catalog(外部タイプ)を仲介させる必要性が失われつつあると思われるため(使いどころ難しい..)