Slide 1

Slide 1 text

2025/2/28 クラスメソッド株式会社 相樂 悟 Snowflakeの開発‧運⽤コストを Apache Icebergで効率化しよう! 〜機能と活⽤例のご紹介〜

Slide 2

Slide 2 text

⾃⼰紹介 2 ● 2020年9⽉ ⼊社 ○ Modern Data Stackに該当する製品の 技術⽀援‧プリセールスを担当 ○ 新しい技術情報を定期的に収集し、 ブログで情報発信 ● 部署‧役割 ○ Modern Data Stackチーム テックリード ● 名前(ニックネーム) ○ 相樂 悟 (さがら) ● 最近のトピック ○ 2025年もData Superheroに 選出頂きました!

Slide 3

Slide 3 text

⽬次 3 ● SnowflakeにおけるIceberg関連の機能 ● Snowflake×Icebergの活⽤例 ● まとめ 注記事項: 2025年2⽉時点の情報を元にお話します アップデートが⾮常に活発な分野のため、 最新情報は都度確認頂くことをお勧めします

Slide 4

Slide 4 text

⽬次 4 ● SnowflakeにおけるIceberg関連の機能 ● Snowflake×Icebergの活⽤例 ● まとめ

Slide 5

Slide 5 text

前置き:Snowflakeとは 5 ● クラウドのメリットを最⼤限活かしたデータウェアハウス AWS‧Google Cloud‧Azure、どのプラットフォーム上でも動作可能 コンピューティングと ストレージの分離 コピー・ETL不要な データシェアリング Streamlit in Snowflake によるデータアプリ

Slide 6

Slide 6 text

Snowflakeにおけるテーブルの種類 6 ● 標準テーブル ○ Read-Write ○ データの所在:Snowflake内部 ● 外部テーブル ○ Read-Only ○ データの所在:S3などの外部ストレージ ● Icebergテーブル ○ Read-Only(外部のカタログ利⽤) または Read-Write(Snowflakeのカタログ利⽤)  ○ データの所在:S3などの外部ストレージ ○ 注意:標準テーブルと⽐較して、⼀部使⽤できないSnowflake機能あり ■ https://docs.snowflake.com/en/user-guide/tables-iceberg#considerations-and-limitations

Slide 7

Slide 7 text

Icebergテーブル ※「外部のカタログ」利⽤ 7 ● Snowflake外のカタログとSyncし、カタログで定義されたテーブルへクエリ可能 ⇛Snowflakeへデータロードが不要で、すぐにクエリが出来る ● Read-Only ● 連携可能なカタログ ○ AWS Glue Data Catalog ○ metadataファイルの指定 ○ Iceberg REST API対応のカタログ 引⽤元:https://docs.snowflake.com/ja/user-guide/tables-iceberg

Slide 8

Slide 8 text

Icebergテーブル ※「Snowflakeのカタログ」利⽤ 8 ● Snowflake内でテーブルを定義するが、データはユーザー指定のS3などに保存し、 Snowflakeがメタデータやデータの更新を担ってくれる ● Read-Write(Snowflake内のクエリ限定) ● データのロード‧変換 ○ 標準テーブルと同じく、COPY INTO、 Snowpipe Streaming、Dynamic Table、 ゼロコピークローン(Preview)等をサポート ● 特記事項 ○ Snowflake Open Catalogと連携すると、 Snowflake外のクエリエンジンから Iceberg REST APIで連携し Read-Onlyのクエリが可能 引⽤元:https://docs.snowflake.com/ja/user-guide/tables-iceberg

Slide 9

Slide 9 text

Snowflake Open Catalog 9 ● Icebergのカタログである「Apache Polaris」のSaaS版 ● Apache Polarisとは ○ Snowflakeが2024年6⽉にPolaris Catalogを発表し、その後2024年8⽉に Apache Software Foundationへ寄贈した際にApache Polarisに名称変更 ● 特徴 ○ ロールベースのアクセス制御 ○ Iceberg REST APIのサポート ● 作成できるカタログの種類 ○ 「内部」と「外部」の2種類 ※次⾴から詳しく説明 引⽤元:https://other-docs.snowflake.com/en/opencatalog/overview#catalog-types

Slide 10

Slide 10 text

Snowflake Open Catalogの「内部」と「外部」の違い 10 ● 内部 ○ Open Catalogでカタログ情報を管理。Read-WriteはSpark等からAPI経由で⾏う ○ SnowflakeからはOpen Catalogを「外部カタログ」としてRead-Onlyでクエリ ● 外部(Open Catalogでカタログ作成時に「External」のトグルを有効化) ○ SnowflakeやGlueなど、Open Catalog外で 定義されたIcebergカタログを連携して管理 ○ 2025年2⽉時点「Snowflakeのカタログ」のみサポート ○ Read-Writeは定義元のSnowflakeやGlueで⾏う ● 注意:「Snowflakeのカタログ」と「Open Catalogのカタログ」は別物です 「内部」と「外部」に関する参考Docs:https://other-docs.snowflake.com/en/opencatalog/overview#catalog-types Open Catalogに関する考慮事項の参考Docs:https://docs.snowflake.com/en/user-guide/tables-iceberg-open-catalog#considerations

Slide 11

Slide 11 text

● Snowflake上で定義したIcebergテーブル をOpen CatalogにSyncし、Snowflake外 のSpark等からクエリ ○ Snowflakeから:Read-Write ○ 外部(Spark等)から:Read-Only Snowflake Open Catalogの「内部」と「外部」の使い分け 11 ● Snowflake外のSpark等から Open CatalogをカタログとしたIceberg テーブルを作成し、Snowflakeからクエリ ○ Snowflakeから:Read-Only ○ 外部(Spark等)から:Read-Write 引⽤元:https://other-docs.snowflake.com/en/opencatalog/tutorials/open-catalog-gs 「内部」の使⽤例 「外部」の使⽤例

Slide 12

Slide 12 text

● Snowflake上で定義したIcebergテーブル をOpen CatalogにSyncし、Snowflake外 のSpark等からクエリ ○ Snowflakeから:Read-Write ○ 外部(Spark等)から:Read-Only Snowflake Open Catalogの「内部」と「外部」の使い分け 12 ● Snowflake外のSpark等から Open CatalogをカタログとしたIceberg テーブルを作成し、Snowflakeからクエリ ○ Snowflakeから:Read-Only ○ 外部(Spark等)から:Read-Write 引⽤元:https://other-docs.snowflake.com/en/opencatalog/tutorials/open-catalog-gs 「内部」の使⽤例 「外部」の使⽤例 基本的には、Snowflake Open Catalogを使う際は「外部」として 利⽤するケースが多いと思います

Slide 13

Slide 13 text

Snowflake Open Catalogの「外部」の利⽤イメージ 13 1.Snowflake Open Catalogで「外部」のカタログを作成 2.Snowflakeで以下を定義   ‧Open Catalogのカタログに対するCatalog Integration   ‧S3などストレージへのExternal Volume 3.下記のようなクエリで、「Snowflakeのカタログ」を⽤いたIcebergテーブルを作成   ※「CATALOG_SYNC」で、定義したCatalog Integrationを指定することで、    「Snowflakeのカタログ」の情報が「Open Catalogのカタログ」にSyncされる CREATE OR REPLACE ICEBERG TABLE my_managed_iceberg_table (col1 INT) CATALOG = 'SNOWFLAKE' EXTERNAL_VOLUME = 'my_external_volume' BASE_LOCATION = 'my_managed_iceberg_table' CATALOG_SYNC = 'my_open_catalog_int';

Slide 14

Slide 14 text

余談:Snowflake Open Catalogに対する期待 14 ● SnowflakeからIcebergテーブルを作る際に直接Open Catalogのカタログを指定し、 Snowflakeからでも、外部のSpark等からでも、Read-Writeでクエリできるように なってほしい! ● Snowflake Open Catalogのそもそものコンセプトが 「どのクエリエンジンからでもRead-Writeできますよ」のはずなので… 引⽤元:https://docs.snowflake.com/en/user-guide/tables-iceberg-open-catalog#considerations 引⽤元:https://other-docs.snowflake.com/en/opencatalog/overview

Slide 15

Slide 15 text

⽬次 15 ● SnowflakeにおけるIceberg関連の機能 ● Snowflake×Icebergの活⽤例 ● まとめ

Slide 16

Slide 16 text

Snowflake×Iceberg活⽤のポイント 16 ● データロード観点 ○ Snowflake外のカタログをSnowflakeに連携すれば、Snowflakeへの データロードが不要で、ウェアハウスを使ってすぐにクエリ可能 (例:AWS Glue Data Catalogなど、Iceberg REST APIに対応したカタログ経由) ● データ活⽤観点 ○ Snowflakeで定義されたIcebergテーブルはSnowflake Open Catalogに連携すること で、Iceberg REST API経由で外部のクエリエンジンからRead-Onlyでクエリ可能 つまり… Snowflake×Icebergは、別のツールと連携してこそ真価を発揮する (次⾴から活⽤例を紹介)

Slide 17

Slide 17 text

データロード:Amazon Data FirehoseのIceberg形式での配信機能 17 ● 内容 ○ Amazon Data FirehoseのIceberg形式で配信できる 機能を⽤いて、そのIcebergをSnowflakeで直接 クエリする考え ○ Snowflakeからは、Glue Data Catalogに対する CATALOG INTEGRATIONやIAMの設定を⾏うことで、 Snowflakeへのデータロード不要でクエリが可能 ● 今後の期待 ○ S3 Tablesを使⽤することで⾃動でコンパクションなど やってくれるかも…?(未検証) ● 参考資料 ○ https://zenn.dev/datum_studio/articles/ae6f45d9d17a42 ※上記画像の引⽤元 ○ https://dev.classmethod.jp/articles/20241004-amazon-kinesis-firehose-for-iceberg/ ○ https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/apache-iceberg-destination.html

Slide 18

Slide 18 text

データロード:FivetranのS3をDestinationとしたデータ連携 18 ● 内容 ○ Fivetranは多くのコネクタを備える、 ELに特化したSaaS製品 ○ S3をDestination(出⼒先)とすると、 Glue Data Catalogをカタログとした Iceberg形式での出⼒が可能 ● 今後の期待 ○ Snowflake Open Catalogのカタログを⽤いた連携も開発することは発表済 ● 参考資料 ○ https://www.fivetran.com/blog/fivetran-supports-amazon-s3-as-a-destination-with-open-table-formats ※上記画像の引⽤元 ○ https://dev.classmethod.jp/articles/fivetran-s3-datalake-icebergtable-select-from-snowflake/

Slide 19

Slide 19 text

データロード:BigQueryで出⼒したIcebergをSnowflakeでクエリ 19 ● 内容 ○ BigQueryに出⼒したGA4やFirebaseのデータを Snowflakeでもクエリしたいというケースに対し、 パイプラインをIcebergにより効率化した事例 ○ GCS上のメタデータファイルを直接指定する⽅法の ため、テーブルが参照するメタデータファイルを 更新するプロシージャも定義している ● 今後の期待 ○ BigQuery metastoreが2025年1⽉にプレビュー。BigQuery metastoreをカタログとして BigQueryからIcebergテーブルの作成‧更新ができるようになることに期待 ● 参考資料 ○ https://dev.classmethod.jp/articles/bigquery-tables-for-apache-iceberg-to-snowflake-iceberg-table/ ○ https://medium.com/snowflake/eliminating-redundancies-in-etl-with-iceberg-tables-on-snowflake-cff678d49bd3 ※上記画像の引⽤元

Slide 20

Slide 20 text

データ活⽤:DatabricksからSnowflakeのIcebergテーブルを参照 20 ● 内容 ○ Snowflake Open Catalogの「外部」のカタログへ IcebergテーブルをSyncさせる設定を⾏いつつ、 Snowflake上でIcebergテーブルを作り、 下記のようにDatabricksのSpark configで設定し、クエリする ● 参考資料 ○ https://medium.com/snowflake/how-to-integrate-databricks-with-snowflake-managed-iceberg-tables-7a8895c2c724 spark.sql.catalog.polaris.uri https://..snowflakecomputing.com/polaris/api/catalog spark.sql.catalog.polaris org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.polaris.credential spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions spark.sql.catalog.polaris.type rest spark.sql.catalog.polaris.scope PRINCIPAL_ROLE:ALL spark.sql.defaultCatalog polaris spark.sql.catalog.polaris.warehouse spark.sql.catalog.polaris.header.X-Iceberg-Access-Delegation true

Slide 21

Slide 21 text

データ活⽤:BigQueryからSnowflakeのIcebergテーブルを参照 21 ● 内容 ○ SnowflakeでGCSをExternal Volumeとして定義した Icebergテーブルを作成し、⽣成されたメタデータを指定して BigQueryから「format = "ICEBERG"」のExternal Tableを作成してクエリする ● 今後の期待 ○ 「Snowflake側でBigQuery metastoreをカタログとしてRead-Writeを⾏えるIcebergテー ブルの定義」か「BigQuery側でSnowflake Open CatalogをカタログとしたIcebergテーブ ルの定義」このいずれかができるようになると、より運⽤が楽になる ● 参考資料 ○ https://github.com/GoogleCloudPlatform/data-analytics-golden-demo/blob/main/snowflake-bigquery-iceberg.sql

Slide 22

Slide 22 text

データ活⽤:DuckDBからSnowflakeのIcebergテーブルを参照 22 ● 内容 ○ SnowflakeのIcebergテーブルで保持された データはS3にあるため、それをDuckDBからクエリ ○ 活⽤例として、TableauからDuckDBを介した参照など、 断続的にSnowflakeのウェアハウスが起動して コストがかかるケースのコスト削減が考えられる ● 今後の期待 ○ DuckDBからIceberg REST APIに対応するカタログを 直接参照できると、最新のメタデータを元にクエリ可能 (Pull Requestはマージされてそう?) ● 参考資料 ○ https://qiita.com/abe_masanori/items/19701469e0ae4390109f ○ https://zenn.dev/cavernaria/articles/6a6fdc85cb53ad ※上記画像の引⽤元 ○ https://github.com/duckdb/duckdb-iceberg/pull/98 select * from iceberg_scan('s3://customers/meta data/xxxxxx.metadata.json');

Slide 23

Slide 23 text

⽬次 23 ● SnowflakeにおけるIceberg関連の機能 ● Snowflake×Icebergの活⽤例 ● まとめ

Slide 24

Slide 24 text

Snowflake×Icebergにより得られるメリット 24 ● 開発‧運⽤コストの削減 ○ 従来複数のDB‧DWH間でのデータ連携は⼀度ストレージにアンロードした 上でロードすることが⼀般的だったが、Icebergを介することでパイプラインを 簡素化でき、開発‧運⽤コストを削減できる ● DWHの利⽤コストの削減 ○ IcebergではDuckDBなど安価なクエリエンジンを使⽤できるため、 クラウドDWHのコンピュートコストを削減できる ○ 各DWH‧ストレージ、それぞれで重複データを管理することが不要となり、 Icebergで保持したデータをSSoTとすることができる

Slide 25

Slide 25 text

最後に 25 ● 「Icebergを導⼊したい!」と考えた時の注意点 ○ 各社、絶賛開発中の領域です(プレビュー機能や新機能が圧倒的に多い) ○ 当たり前ではあるのですが、常に最新情報を確認し、 本番相当のワークロードで検証した上で、導⼊することをオススメします ● 今後のIceberg界隈への勝⼿な期待 ○ 現状、Apache Polaris‧Unity Catalogを始めとしたOSSでのカタログ開発‧提供、 Icebergの基幹となるS3でのS3 Tablesの発表など、Icebergを軸とした基盤を 開発するための機能開発が進んできている ○ ⼀⽅で、現状はメタデータファイルを指定する⽅法でしかクエリできない場合も多い ○ 今後、あるカタログを指定したらどの製品からでもRead-Writeでき、 ⾃動でコンパクションなどのテーブル最適化処理も⾏ってくれるような、 未来を期待しています!!

Slide 26

Slide 26 text

ご清聴ありがとうございました! Special Thanks 本登壇の資料では、多くの⽅のブログ記事を引⽤させて頂きました。 この場をお借りして、御礼申し上げます。