❄️

Snowflake x Wasabi x Iceberg ( S3互換ストレージ)

がく@ちゅらデータエンジニアです。

こんばんわ!
ずいぶん涼しくなって過ごしやすくなってきましたね!
ご飯も美味しくて・・・あれ、また0.1トンになr・・・・(ぎゃーーー

概要

以前、S3互換ストレージの検証で、Cloudflare R2について行いました。
https://zenn.dev/churadata/articles/c5de5bd35f9b05

今回は、S3互換ストレージのWasabiについて検証をしてみたいと思います。

  • 単純な外部Stageとして
  • 外部ボリュームとして、Icebergテーブルが作成などのオペレーションができるか?

を確認してみます。

wasabiの設定

https://wasabi.com/ja

まずは、30日トライアルアカウントの作成しました

ちなみに、wasabiとSnowflakeの連携ってのでこんな記事を見つけました♪
(設定どうするか?ってのは書いてなかった)
https://wasabi.com/ja/blog/tech-partners-ja/wasabi-snowflake-data-storage

wasabiでバケットを作る

バケット名:chura-snowflake-wasabi-external-test
地域を選択する:Tokyo ap-northeast-1 ( s3.ap-northeast-1.wasabisys.com )
s3.ap-northeast-1.wasabisys.com

バケットのバージョン管理
オブジェクトロック(バージョン管理を有効にする必要があります)

何もしないで、次へ

バケットのログ

何もしないで、次

一旦こんな感じでバケットを作成

でけた

アクセスキー

一旦ルートユーザで作ってみる

でけた

Snowflake側の設定

Stageを作ってみる(Storage Integrationなしで)

use database gaku_training_db;
use schema public;

CREATE STAGE my_wasabi_s3compat_stage
  URL = 's3compat://chura-snowflake-wasabi-external-test/'
  ENDPOINT = 's3.ap-northeast-1.wasabisys.com'
  CREDENTIALS = (AWS_KEY_ID = '*************' AWS_SECRET_KEY = '************************************')
;

でけた

list @my_wasabi_s3compat_stage

ちゃんと見れました!

中も閲覧可能

Icebergテーブルを作る

https://docs.snowflake.com/ja/user-guide/tutorials/create-your-first-iceberg-table

こんなチュートリアルがあるからやってみる

外部ボリュームを作ってみる

チュートリアルでは、AWS S3を使ったチュートリアルなので、
https://docs.snowflake.com/ja/sql-reference/sql/create-external-volume#examples

今回はその部分だけ「S3互換ストレージ」を参考に作ってみました。
※例では、ALLOW_WRITESがFalseになっていたので、True2変更しています。

CREATE OR REPLACE EXTERNAL VOLUME ext_vol_s3_compat_on_wasabi
  STORAGE_LOCATIONS = (
    (
      NAME = 'my_s3_compat_storage_location_on_wasabi'
      STORAGE_PROVIDER = 'S3COMPAT'
      STORAGE_BASE_URL = 's3compat://chura-snowflake-wasabi-external-test'
      CREDENTIALS = (
        AWS_KEY_ID = '************'
        AWS_SECRET_KEY = '******************************************'
      )
      STORAGE_ENDPOINT = 's3.ap-northeast-1.wasabisys.com'
    )
  )
  ALLOW_WRITES = TRUE;

でけた
※今回は、IAMにおけるアクセス制御はしていない

標準構文を使用してテーブルを作成する

CREATE OR REPLACE ICEBERG TABLE customer_iceberg (
    c_custkey INTEGER,
    c_name STRING,
    c_address STRING,
    c_nationkey INTEGER,
    c_phone STRING,
    c_acctbal INTEGER,
    c_mktsegment STRING,
    c_comment STRING
)
    CATALOG = 'SNOWFLAKE'
    EXTERNAL_VOLUME = 'ext_vol_s3_compat_on_wasabi'
    BASE_LOCATION = 'customer_iceberg';

でけた

wasabi側をみてみると

ってのができておる

customer_iceberg.QIsY7Wgt
└ metadata
 └ 00000-6b44916b-28b5-478d-************.metadata.json

なんてオブジェクトができました

データベースのカタログ統合と外部ボリュームを設定する

パラメータを設定すると、変更後に作成される すべて のIcebergテーブルに、選択した特定のカタログと外部ボリュームを使用するようにSnowflakeに指示

ってのをやります

ALTER DATABASE gaku_training_db SET CATALOG = 'SNOWFLAKE';
ALTER DATABASE gaku_training_db SET EXTERNAL_VOLUME = 'ext_vol_s3_compat_on_wasabi';

CTASを使用してテーブルを作成する

CREATE OR REPLACE ICEBERG TABLE nation_iceberg (
  n_nationkey INTEGER,
  n_name STRING
)
  BASE_LOCATION = 'nation_iceberg'
  AS SELECT
    N_NATIONKEY,
    N_NAME
  FROM snowflake_sample_data.tpch_sf1.nation;
select * from nation_iceberg;

wasabiのバケットを見ると

nation_iceberg.tyJdCPQ8
├ data
│ └ d1
│  └ snow_fvsfLtl_2Mc_AGiuN1nIaBg_0_2_002.parquet
└ metadata
 ├ 00001-8f829b73-26b0-4ec5-bca2-cce74be2e811.metadata.json 
 ├ 1758875963535000000-eTFM5Wj2jIqZxHKd8bis2w.avro
 └ snap-1758875963535000000-3306bee8-40dd-4ff1-9acc-fc64b78dab22.avro

こんなファイルができておった

データをロードしてテーブルをクエリしてみる

customer_iceberg というIcebergテーブル(空)にINSERTしてみます

INSERT INTO customer_iceberg
  SELECT * FROM snowflake_sample_data.tpch_sf1.customer;

150000件INSERTされました

チュートリアルにあるSQLで確かめる

SELECT
    c.c_name AS customer_name,
    c.c_mktsegment AS market_segment,
    n.n_name AS nation
  FROM customer_iceberg c
  INNER JOIN nation_iceberg n
    ON c.c_nationkey = n.n_nationkey
  LIMIT 15;

でけた

データを削除

テーブルの中にある c_mktsegmentで集計をしてみました
その中の「AUTOMOBILE」を削除してみます。

select c_mktsegment, count(*) from customer_iceberg group by all;

DELETE FROM customer_iceberg WHERE c_mktsegment = 'AUTOMOBILE';

AUTOMOBILEだけをDELETEしましょう

消えましたね。

まとめ

AWS S3互換ストレージのwasabiについて、外部ステージ、外部ボリュームについて検証してみました。
パフォーマンス検証とかは今回はスコープ外
機能的なテストを行ってみました

wasabiなどのS3互換ストレージは、AWS S3に比べるとデータ転送などのコストが掛からないので、使う価値はありますね!

ちゅらデータ株式会社

Discussion