Snowflake はクラウド上に構築されたデータプラットフォームです。基本的な使い方を記載します。
Snowflake Architecture
- Hadoop 等の big data プラットフォームは利用していません。
- 顧客管理ではなく、Snowflake 社が管理する AWS, GCP, Azure で稼働します。
- Snowflake アカウントは AWS, GCP, Azure のいずれかの、ある一つのリージョンで稼働します。
- リージョン内では 3 つの AZ を利用した構成が採用されています。
- 三つの層から構成されます。
- Cloud Services
- 認証、クエリ最適化、アクセス制御等。
- Query Processing
- MPP (massively parallel processing) compute clusters でクエリを実行します。
- Database Storage
- データはすべて圧縮されて保存されます。
- Cloud Services
利用料金について
- Snowflake には Edition があり、各層で利用できる機能が異なります。
- Edition、クラウドプロバイダ、リージョン によって、1 Credit あたりの料金が異なります。
- 三つの層を利用すると、各層の利用状況に応じて Credit が消費されます。
- Cloud Services の料金は、一般的な使い方をしている限りにおいては無料となります。
- Query Processing (Virtual Warehouses (Compute)) 料金の 10% までは無料です。
- Compute 料金は二つに大別できます。
- 顧客が作成した Virtual Warehouses の料金。
- Snowflake-managed Virtual Warehouses の料金。
- Understanding Billing for Serverless Features
- Snowpipe
- Data Replication
- Materialized Views Maintenance
- Automatic Clustering 等
- Cloud Services の料金は、一般的な使い方をしている限りにおいては無料となります。
- その他に DATA TRANSFER 料金も発生します。
- Snowflake アカウントのリージョンとは異なるリージョン、または異なるクラウドプロバイダに対する転送において課金されます。
- Understanding Snowflake Data Transfer Billing
- Unloading Data from Snowflake
- Database Replication
- External Functions
- On Demand 支払いの他に、前払い (up-front Capacity commitment) による割引き制度も存在します。
参考資料: UNDERSTANDING SNOWFLAKE PRICING
AWS Tokyo リージョン
AWS Northern Virginia リージョン
Snowflake Releases
- 三つのリリースタイプが存在します。
- Full release
- 毎週リリースされます。
- Enterprise Edition 以上であれば 24-hour early access によって、事前の検証が可能です。
- Behavior change release ではないため、基本的に事前の検証は不要です。
- Patch release
- Behavior change release
- 一ヶ月に一回です。
- 一回のリリースは 2 ヶ月で完了します。
- 最初の 1 ヶ月は、テスト期間です。
- 既定ではリリース内容が無効化されています。
- アカウントの設定でリリース内容を有効化して、動作検証が可能です。
- 次の 1 ヶ月はオプトアウト期間です。
- 既定ではリリース内容が有効化されています。
- アカウントの設定でリリースを無効化できます。
- この期間が終了すると、自動的にリリース内容が有効化されます。
- Snowflake Support に問い合わせことで、個別アカウントへのリリース内容の反映を延期させることが可能な場合があります。
- 最初の 1 ヶ月は、テスト期間です。
- Production と Non-Production (development/testing) のアカウントを分けておくことで、Behavior change release に対するテスト期間 1 ヶ月を Non-Production アカウントで実施できます。
- Full release
確認コマンドの例
SELECT system$behavior_change_bundle_status('2021_08');
参考資料:
SnowSQL
SnowSQL は "Snowflake Connector for Python" によって実装された、Snowflake CLI Client です。
インストール方法: Download and Install SnowSQL
vagrant@debian11:~$ ls .snowsql/
1.2.17 1.2.18 autoupgrade config downloadlck history mylog
.snowsql/config
→ 設定ファイルです。major.minor.patch
バージョンのうち、patch については、実行時に新しいバージョンが見つかると自動更新されます。--noup
オプションを付与すると自動更新を無効化して起動できます。
組織に所属するアカウントの場合は <organization_name>-<account_name>
を -a
に指定できます。
フリートライアルで取得したアカウント等の場合は、以下のように指定します。Snowflake アカウントのリソースは AWS/GCP/Azure のいずれかのクラウド上に構築されます。以下は、AWS Tokyo リージョンを指定して作成した場合のアカウントにおけるユーザの例です。
snowsql -a xxxx.ap-northeast-1.aws -u myuser
MFA が有効なユーザの場合は -M
を指定します。
snowsql -a xxxx.ap-northeast-1.aws -u myuser -M
参考資料:
公開鍵・秘密鍵による認証
ユーザ名とパスワードによる認証の他に、公開鍵・秘密鍵による認証も可能です。公開鍵と秘密鍵のペアを生成します。一般に秘密鍵はパスワード (共通鍵) で暗号化することが可能です。SnowSQL の場合は、暗号化された秘密鍵にのみ対応しています。そのため -nocrypt
オプションは付与しません。
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out snowflake.p8
openssl rsa -in snowflake.p8 -pubout -out snowflake.pub
公開鍵は securityadmin 以上のロールで設定します。
USE ROLE securityadmin;
ALTER USER myuser set rsa_public_key='MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCg...';
DESC USER myuser;
秘密鍵を用いた認証が可能となります。
snowsql -a xxxx.ap-northeast-1.aws -u myuser --private-key-path snowflake.p8
鍵の更新 (ローテーション) を行なうためには rsa_public_key_2
を利用します。
ALTER USER myuser set rsa_public_key_2='xxx';
ALTER USER myuser unset rsa_public_key;
関連資料:
Python Connector
Python3 のバージョンと snowflake-connector-python
で利用可能なバージョンを確認します。
python3 --version
python3 -m pip install snowflake-connector-python==dummy
Python 3.9 で snowflake-connector-python
2.6.1 を利用する場合の例です。pip に依存関係の解決を任せることも可能ですが、テスト済みの依存ライブラリのバージョンを指定する方法が推奨されています。
python3 -m pip install -r https://raw.githubusercontent.com/snowflakedb/snowflake-connector-python/v2.6.1/tested_requirements/requirements_39.reqs
python3 -m pip install snowflake-connector-python==2.6.1
パスワード認証
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import snowflake.connector
ctx = snowflake.connector.connect(
user='myuser',
password='PASSWORD',
account='xxxx.ap-northeast-1.aws'
)
cs = ctx.cursor()
try:
cs.execute('SELECT current_version()')
one_row = cs.fetchone()
print(one_row[0])
finally:
cs.close()
ctx.close()
鍵認証
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import snowflake.connector
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
with open('/home/vagrant/snowflake.p8', 'rb') as key:
p_key= serialization.load_pem_private_key(
key.read(),
password='XXXX'.encode(),
backend=default_backend()
)
pkb = p_key.private_bytes(
encoding=serialization.Encoding.DER,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption())
ctx = snowflake.connector.connect(
user='myuser',
account='xxxx.ap-northeast-1.aws',
private_key=pkb
)
cs = ctx.cursor()
try:
cs.execute('SELECT current_version()')
one_row = cs.fetchone()
print(one_row[0])
finally:
cs.close()
ctx.close()
参考資料:
基本操作
参考資料: Snowflake in 20 Minutes
Warehouse 作成
Snowflake において、ストレージ database と計算資源 warehouse は分離されています。以下の例では、何も処理していない状態が 60 秒間続くと自動で停止するように設定しています。
CREATE OR REPLACE WAREHOUSE mywh WITH
WAREHOUSE_SIZE = XSMALL
AUTO_SUSPEND = 60
AUTO_RESUME = true
INITIALLY_SUSPENDED = true;
SELECT CURRENT_WAREHOUSE();
Database 作成
一覧の確認
SHOW DATABASES;
作成 (存在する場合は drop してから create)
CREATE OR REPLACE DATABASE mydb;
DB を作成すると、明示的に use することなく、現在のセッションで use された状態となります。
SELECT CURRENT_DATABASE();
DB には public という名称の schema が既定で存在しており、use された状態となります。
SELECT CURRENT_SCHEMA();
Table 作成
CREATE OR REPLACE TABLE mytbl (
c1 STRING,
c2 DATE
);
SHOW TABLES;
DESC TABLE mytbl;
クエリ
SELECT COUNT(*) FROM mytbl;
DROP DATABASE IF EXISTS mydb;
DROP WAREHOUSE IF EXISTS mywh;
終了方法
!exit;
データのアップロード
data.csv
aaa,8/25/2017
bbb,12/10/2017
ccc,10/18/2017
ddd,8/13/2017
eee,11/27/2017
Snowflake アカウントには stage と呼ばれる領域が割り当てられます。stage にデータをアップロードするコマンドは以下のようになります。public
はスキーマ名です。PUT
に指定するファイルにはワイルドカードを指定できます。
PUT file://c:\Users\username\Desktop\data.csv @mydb.public.%mytbl;
LIST @mydb.public.%mytbl;
REMOVE @mydb.public.%mytbl/data.csv.gz
Stage から table へのデータロードのコマンドは以下のようになります。既定では、同じファイルからの読み込みは重複して行えないようになっています。FORCE = TRUE
を指定するとこれを無視できます。
USE mydb;
USE WAREHOUSE mywh;
COPY INTO mytbl
FROM @%mytbl
FILE_FORMAT = (TYPE = CSV FIELD_OPTIONALLY_ENCLOSED_BY='"')
FILES = ('data.csv.gz')
ON_ERROR = SKIP_FILE;
サポートケースの作成方法
サポートケースの作成は、別の管理サイトから行います。community.snowflake.com
ドメインのサイトで新規にアカウントを作成した後に、Snowflake アカウントとの紐付けを申請します。
紐付けが承認されると、以下のような画面から case を作成できます。アカウント作成時のメールアドレス以外にも通知したい場合は Collaborator's Email を指定します。複数の Snowflake アカウントを紐付けている場合は、適切な Account Name を選択します。
関連記事
- Snowflake Task による SQL の定期実行Snowflake において、cron のように定期的に SQL を実行する仕組みとして Task が提供されています。基本的な使い方を記載します。 サンプル データベースとテーブルを作成しておきます。 CREATE DATABASE mydb; CREATE TABLE mytbl (c1 DATETIME, c2 STRING); 1分毎に INSERT を実行する task を作成します。W...
- Snowflake におけるアクセス制御の設定Snowflake について、アクセス制御の設定を記載します。 参考資料: Access Control in Snowflake user と role の関係 [Role Hierarchy and Privilege
- Snowflake におけるセキュリティ関連の機能Snowflake のセキュリティ関連の機能について記載します。 パラメータ管理 Snowflake における設定値はパラメータとよばれます。設定する対象によって分類すると、以下の三種類が存在します。 Account パラメータ。 Account-level でのみ設定可能です。 Session パラメータ。 Account-level および User-level, Session-level ...
- Looker から Snowflake への OAuth 接続Looker から Snowflake の DB を OAuth 認証で参照する設定例を記載します。 参考資料: Looker / feedbackSnowflake / Configuring OAuth for Snowflake connections Snowflake 内の Looker 用 Role/User/Warehouse/DB 作成 Role と
- Snowflake に対する SSO 設定 (Auth0)Snowflake に対して、外部の ID 基盤 (IdP; ID Provider) による認証でログインするための設定例を記載します。IdP としては Auth0 を用います。 参考資料: [HOWTO: CONFIGURE AUTH0 AS IDENTITY PROVIDER FOR SNOWFLAKE SINGLE SIGN-ON](https://community.snowflake....