Snowflake の基本的な使い方
[履歴] [最終更新] (2021/09/20 18:12:15)

概要

Snowflake はクラウド上に構築されたデータプラットフォームです。基本的な使い方を記載します。

Snowflake Architecture

Uploaded Image

Snowflake Architecture

  • Hadoop 等の big data プラットフォームは利用していません。
  • 顧客管理ではなく、Snowflake 社が管理する AWS, GCP, Azure で稼働します。
  • 三つの層から構成されます。
    • Cloud Services
      • 認証、クエリ最適化、アクセス制御等。
    • Query Processing
      • MPP (massively parallel processing) compute clusters でクエリを実行します。
    • Database Storage
      • データはすべて圧縮されて保存されます。

利用料金について

  • Snowflake には Edition があり、各層で利用できる機能が異なります。
  • Edition、クラウドプロバイダ、リージョン によって、1 Credit あたりの料金が異なります。
  • 三つの層を利用すると、各層の利用状況に応じて Credit が消費されます。
    • Cloud Services の料金は、一般的な使い方をしている限りにおいては無料となります。
      • Query Processing (Virtual Warehouses (Compute)) 料金の 10% までは無料です。
    • Compute 料金は二つに大別できます。
      • 顧客が作成した Virtual Warehouses の料金。
      • Snowflake-managed Virtual Warehouses の料金。
  • その他に 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 リージョン

Uploaded Image

AWS Northern Virginia リージョン

Uploaded Image

Snowflake Releases

  • 三つのリリースタイプが存在します。
    • Full release
      • 毎週リリースされます。
      • Enterprise Edition 以上であれば 24-hour early access によって、事前の検証が可能です。
        • Behavior change release ではないため、基本的に事前の検証は不要です。
    • Patch release
    • Behavior change release
      • 一ヶ月に一回です。
      • 一回のリリースは 2 ヶ月で完了します。
        • 最初の 1 ヶ月は、テスト期間です。
          • 既定ではリリース内容が無効化されています。
          • アカウントの設定でリリース内容を有効化して、動作検証が可能です。
        • 次の 1 ヶ月はオプトアウト期間です。
          • 既定ではリリース内容が有効化されています。
          • アカウントの設定でリリースを無効化できます。
        • この期間が終了すると、自動的にリリース内容が有効化されます。
          • Snowflake Support に問い合わせことで、個別アカウントへのリリース内容の反映を延期させることが可能な場合があります。
      • Production と Non-Production (development/testing) のアカウントを分けておくことで、Behavior change release に対するテスト期間 1 ヶ月を Non-Production アカウントで実施できます。

確認コマンドの例

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;
関連ページ
    概要 こちらのページで基本的な使い方を把握した Snowflake について、アクセス制御の設定を記載します。 参考資料: Access Control in Snowflake user と role の関係 Role Hierarchy and Privilege Inheritance role には 1 個以上の別の role が grant されています。
    概要 こちらのページで基本的な使い方を把握した Snowflake について、以下の観点でセキュリティ設定を記載しました。 privilege と role を用いた object に対するアクセス制御 → Snowflake におけるアクセス制御の設定 外部ネットワークとの接続制限 → Snowflake におけるネットワーク関連の設定
    概要 こちらのページで基本的な使い方を把握した Snowflake に対して、外部の ID 基盤 (IdP; ID Provider) による認証でログインするための設定例を記載します。IdP としては Auth0 を用います。 参考資料: HOWTO: CONFIGURE AUTH0 AS IDENTITY PROVIDER FOR SNOWFLAKE SINGLE SIGN-ON