Snowflake x Wasabi x Iceberg ( S3互換ストレージ)
がく@ちゅらデータエンジニアです。
こんばんわ!
ずいぶん涼しくなって過ごしやすくなってきましたね!
ご飯も美味しくて・・・あれ、また0.1トンになr・・・・(ぎゃーーー
概要
以前、S3互換ストレージの検証で、Cloudflare R2について行いました。
今回は、S3互換ストレージのWasabiについて検証をしてみたいと思います。
- 単純な外部Stageとして
- 外部ボリュームとして、Icebergテーブルが作成などのオペレーションができるか?
を確認してみます。
wasabiの設定
まずは、30日トライアルアカウントの作成しました
ちなみに、wasabiとSnowflakeの連携ってのでこんな記事を見つけました♪
(設定どうするか?ってのは書いてなかった)
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テーブルを作る
こんなチュートリアルがあるからやってみる
外部ボリュームを作ってみる
チュートリアルでは、AWS S3を使ったチュートリアルなので、
今回はその部分だけ「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