本記事はあくまで個人の実験結果をまとめたものであり、Snowflakeの性能を保証するものではありません。環境や条件によって結果は変わると思うので、その点をご理解いただければ幸いです。
前提
この記事では、Azure Data Lake Storage(ADLS)に保存されたTPC-DS sf=100000(100TB)のParquetファイルを、SnowflakeのテーブルにUNLOAD(ロード)した際の実行時間とコストについてまとめました。
かなりばらつきのある実験ではありますが、Snowflakeを使った大規模データの取り込みに関する参考情報として活用いただければ嬉しいです🙇
特に以下2点に注目して記録しています。
- 総コスト(クレジット数)
- WHサイズ変更による実行時間の変化
13TBクラスの取り込みを約1時間20分で完了できるケースもあり、Snowflakeの性能の高さとWarehouseサイズ設定の容易さをあらためて実感しました。
使用したコード
以下は、ADLSのParquetファイルをSnowflakeにロードする例(web_siteテーブル)
CREATE TABLE web_site(
web_site_sk INT,
web_site_id CHAR(16),
web_rec_start_date DATE,
web_rec_end_date DATE,
web_name VARCHAR(50),
web_open_date_sk INT,
web_close_date_sk INT,
web_class VARCHAR(50),
web_manager VARCHAR(40),
web_mkt_id INT,
web_mkt_class VARCHAR(50),
web_mkt_desc VARCHAR(100),
web_market_manager VARCHAR(40),
web_company_id INT,
web_company_name CHAR(50),
web_street_number CHAR(10),
web_street_name VARCHAR(60),
web_street_type CHAR(15),
web_suite_number CHAR(10),
web_city VARCHAR(60),
web_county VARCHAR(30),
web_state CHAR(2),
web_zip CHAR(10),
web_country VARCHAR(20),
web_gmt_offset NUMERIC(5, 2),
web_tax_percentage NUMERIC(5, 2)
);
--一回ステージを挟む
CREATE STAGE web_site_stage
URL='azure:/<storage_name>.blob.core.windows.net/datalake/tpcds-official-1tb-nopartition/tpc-ds/source_files_001TB_parquet/web_site/'
CREDENTIALS=(AZURE_SAS_TOKEN='<your token>')
FILE_FORMAT = ( TYPE = PARQUET);
--ステージから自分のテーブルに書き込める---
COPY INTO web_site
FROM @web_site_stage
PATTERN='.*\.parquet'
MATCH_BY_COLUMN_NAME = 'CASE_INSENSITIVE';
データ生成や構成について
TPC-DS(ADLS保存)をSnowflakeにアンロードする方法や
TPS-DSデータセットの生成方法は以下のリポジトリで公開しています。
結果
総コスト
▶️ 総クレジット:477.46
▽参考
WHサイズごとの実行時間
テーブル名 | Parquetファイルサイズ(バイト) | Parquetファイル数 | WHサイズ | 実行時間 |
---|---|---|---|---|
store_sales | 12,910,536,099,204 | 25,000 | 4Xlarege | 1h 21m 13s |
catalog_sales | 10,282,929,418,784 | 10,000 | 4XLage | 1h 5m 43s |
web_sales | 4,725,217,006,088 | 5,000 | 2Xlarege | 2h 4m 7s |
store_returns | 1,480,948,795,656 | 800 | 4Xlarege | 8m 31s |
catalog_returns | 995,968,187,799 | 1,000 | X-large | 36m 56s |
web_returns | 487,664,161,272 | 400 | 2Xlarege | 10m49s |
inventory | 1,036,259,413 | 1 | Xlarege | 6m 44s |
customer | 5,279,186,503 | 5 | medium | 4m 14s |
customer_address | 972,656,652 | 10 | Xlarege | 51s |
item | 47,354,876 | 1 | Large | 11s |
customer_demographics | 7,784,310 | 1 | Xlarege | 4.2s |
date_dim | 1,854,037 | 1 | Large | 3.7s |
time_dim | 1,129,050 | 1 | Large | 1.2s |
store | 170,728 | 1 | Large | 1.3s |
promotion | 149,104 | 1 | Large | 790ms |
web_page | 93,175 | 1 | Large | 1.8s |
household_demographics | 38,825 | 1 | Large | 619ms |
web_site | 21,636 | 1 | Large | 1.1s |
warehouse | 6,285 | 1 | Large | 695ms |
所感と学び
- WHサイズが大きければ処理時間は確実に短縮される
- COPY INTOによるロード処理は非常に安定しており、13TB超のデータでも1時間半程度で取り込めた
Snowflakeは大規模データの取り込みという観点でも非常に優秀だと感じました。
もし似た構成でデータ連携を考えている方がいれば、この記事が一つの参考になれば幸いです。
修正点・加筆リクエストなどあればお気軽にコメントください!
読んでいただきありがとうございました😊