Snowflakeが今熱いらしいので試しに使ってみた

こんにちは。Customer Analytics Division所属データエンジニアの城戸です。最近Snowflakeというサービスが業界で話題になっています。社内の分析環境の選定にあたり、使い勝手やコストの観点からSnowflakeの導入検討を行ったので、その結果の一部をご紹介します。

Snowflakeとは

Snowflakeは、完全SaaS型のクラウドデータウェアハウスサービスです。SaaS型なので、ハードウェア、ソフトウェアの管理をする必要なく、すぐに利用できるというメリットがあります。

また2020年9月に米ソフトウェア業界史上最大規模でIPOするなど勢いがあり、楽天、アドビ、アシックスなど世界中の顧客にサービスを提供しています。

Beyond “Modern” Data Architecture

ただ、SaaSであるがゆえに、データもSnowflakeが管理するクラウドプロバイダ(AWS/GCP/Azure)アカウント配下に置かれてしまうので、特に機密度の高い顧客データなどを扱う際は会社のセキュリティーポリシーに違反しないかなど十分に考慮する必要があります。

さっそく使ってみる

SnowflakeはWebブラウザで操作できるUIが提供されており、アドホックな分析目的ではそれを使うのが手っ取り早いです。ログインURLにアクセスし、アカウントにログインします。

検証用ユーザー作成

Snowflakeでは、ユーザーを作成して権限管理することができます。せっかくなので、検証用にユーザーを作成して、検証用リソースを利用する権限を付与します。

# 検証用のデータベースとウェアハウスを作成
use role sysadmin;
create database kido_db;
create or replace WAREHOUSE kido_wh WITH WAREHOUSE_SIZE = 'XSMALL';

# 検証用ユーザーに割当てるロールを作成
use role securityadmin;
create or replace role kido_role;
grant role kido_role to role sysadmin;

# 作成したロールに検証用リソースの所有権を移す
use role sysadmin;
grant ownership on database kido_db to role kido_role;
grant ownership on schema kido_db.public to role kido_role;
grant ownership on warehouse kido_wh to role kido_role;

# 検証用ユーザーを作成
use role useradmin;
create or replace user kido password='password' default_role='kido_role' must_change_password=TRUE;

# 検証用ユーザーにロールを割り当てる
use role securityadmin;
grant role kido_role to user kido;

Snowflakeの権限モデルは、私が業務で慣れていたAWSのIAMと異なる部分が多かったので最初は戸惑いましたが、こちらの公式ドキュメントが分かりやすくて良かったです。https://docs.snowflake.com/en/user-guide/security-access-control-overview.html

テーブルの作成とデータのロード

検証用ユーザーとリソースが作成できたので、検証用ユーザーでログインし直してまずは実験用のデータをSnowflakeに取り込みます。今回はデータはSnowflakeがサンプルで提供しているものを利用しました。https://s3.amazonaws.com/snowflake-workshop-lab/Snowflake_free_trial_LabGuide.pdf

use role kido_role;
use database kido_db;
use schema public;
use warehouse kido_wh;

# テーブルを作成
create or replace table trips  
(tripduration integer,
  starttime timestamp,
  stoptime timestamp,
  start_station_id integer,
  start_station_name string,
  start_station_latitude float,
  start_station_longitude float,
  end_station_id integer,
  end_station_name string,
  end_station_latitude float,
  end_station_longitude float,
  bikeid integer,
  membership_type string,
  usertype string,
  birth_year integer,
  gender integer);

# S3に置いてあるデータを指定
create or replace stage citibike_trips URL = 's3://snowflake-workshop-lab/citibike-trips';

# データのファイルフォーマットを指定
create or replace file FORMAT CSV TYPE = 'CSV' COMPRESSION = 'AUTO' FIELD_DELIMITER = ',' RECORD_DELIMITER = '\n' SKIP_HEADER = 0 FIELD_OPTIONALLY_ENCLOSED_BY = '\042' TRIM_SPACE = FALSE ERROR_ON_COLUMN_COUNT_MISMATCH = FALSE ESCAPE = 'NONE' ESCAPE_UNENCLOSED_FIELD = '\134' DATE_FORMAT = 'AUTO' TIMESTAMP_FORMAT = 'AUTO' NULL_IF = ('');

# テーブルにデータをロード(実行時間は数秒かかります)
copy into trips from @citibike_trips
file_format=CSV;

これで準備完了です。

クエリの実行

作成したテーブルに対して、いろいろクエリを投げてみます。

select count(*) from trips;

結果は61,468,359行でしたが、処理時間は108msと一瞬でした。これは、Snowflakeが代表的な統計値はメタデータとして保持しているためです。

select count(*) from trips group by usertype;

この処理は682msかかりましたが、2回目以降は70~80msでした。これは、Snowflakeが実行結果をキャッシュしているためです。

基本性能検証

Snowflakeは、バーチャルウェアハウスという計算用リソースの上で処理が行われます。ワークロードに合わせて柔軟にウェアハウスサイズを変更できるというメリットがあるのですが、1つサイズを上げるごとに単価は2倍になります。そこでサイズの変化に対して性能はどれほど向上するのか、実験してみました。

実験対象クエリは、1~80GBのテーブル全部で10個をユニークなキーでjoinしていく処理です。

グラフから、1つサイズが上がるごとに、2倍とはいかないまでも性能が上昇し、ウェアハウスの最大サイズの4xlまで性能が伸び続けているのが分かります。最大サイズで49秒程度の処理でこの結果なので、もっと重い処理の場合はより性能向上が顕著になるのではないか?と思っています。

Data Sharing機能

Snowflakeの主要機能の一つに、Data Sharingがあります。これは、Snowflakeアカウント間でデータを共有する機能です。実際にデータはコピーされない、即時反映、読取専用であるなどの特徴があります。

また、共有方法も簡単で、共有する側とされる側で数行のコードを書くだけで実現できます。例えば、以下の図のようにアカウントab01234からアカウントxy56789にデータを共有したい場合のコードを示します。

Provider Account側

create share my_share;

// 共有するオブジェクトを指定
grant usage on database kido_db to share my_share;
grant usage on schema public to share my_share;
grant select on table trips to share my_share;

// 誰に共有するか指定
alter share my_share add accounts=xy56789;

Consumer Account

create database shared from share ab01234.my_share;

select * from shared.public.trips limit 10;

まとめ

Snowflakeの調査・試用結果の一部を共有しました。全体的にみて、完全SaaS型サービスであることからくる高いユーザビリティと機能面のメリットが大きいと思いました。一方で、競合となるDWH(弊社であれば、AWS環境と親和性の高いRedshift)との比較(特に性能/コスト面)は一度検証しておく必要があると思っています。また、Snowlfakeは今勢いがある企業なため、今後の成長にも期待したいです。

2021年4月現在、Snowflakeは30日限定のフリーアカウントを提供しています。お試し的に使ってみてはいかがでしょうか。

関連記事