#04 : ハンズオンラボガイド「データのロード」 – Snowflake Advent Calendar 2019 #SnowflakeDB

こんにちは、DA部プリセールスエンジニアの兼本です。

当エントリは『Snowflake Advent Calendar 2019』の04日目のエントリです。

Snowflake Advent Calendar 2019 - Qiita
Snowflake Advent Calendar 2019 | シリーズ | Developers.IO

はじめに

この演習ではSnowflake上に作成したデータベーステーブルに対して、仮想ウェアハウスを使ってAmazon S3に保存されているCSVファイルをバルクロードする演習を行います。

注意書きにも記載されている通り、演習ではシンプルにするためにSYSADMINロールを利用していますが、ロールとして通常SYSADMINは利用しませんのでご注意ください。

なお、この演習ではデータ保管用のクラウドストレージとしてAmazon S3を使用していますが、SnowflakeはMicrosoft Azure StorageGoogle Cloud Storageもサポートしています。

前提条件

「Module 4: データのロード」では、「Module 3: ロードするデータの準備」で用意したウェアハウス、データベースなどを利用して進めていきますので、まだの方は先に「Module 3」をお試しください。

また、ハンズオンラボガイドにある通り、演習の中のクエリは下記のファイルに記載されているので事前にダウンロードしてワークシートにロードしておくと便利です。

lab_scripts_free_trial.sql

それでは、ハンズオンの資料に沿って進めていきましょう。

4.1 データロードの準備

Snowflakeではデータのロードを行う際にコンピュートノードと呼ばれる(仮想)ウェアハウスを使用します。
ウェアハウスは用途にあわせて複数作成することができ、そのサイズ(スペック)もデータ量や期待するパフォーマンスに合わせて動的に変更することが可能です。

ハンズオンで使用する環境にはすでにCOMPUTE_WHという名前のウェアハウスが作成済みです。
ウェアハウスのサイズはがデータのロードに対してどのように作用するのかを知るため、演習の最初の手順では、ウェアハウスのサイズを変更しています。
なお、ウェアハウスにはTシャツのサイズのようにXSから4XLまでのサイズが用意されています。

ウェアハウスに関する詳細は以下の記事をご参照ください。

Snowflake の仮想ウェアハウスの概念・機能まとめ #SnowflakeDB

さて、ウェアハウスを設定するには、Snowflakeログイン後に表示されるダッシュボード上部の「Warehouse」アイコンをクリックします。

今回は作成済みのウェアハウスCOMPUTE_WHを編集したいので、リストから該当のウェアハウスを選択して「Configure...」を押下します。

ウェアハウスのサイズは現在Largeに設定されていますが、検証のためにサイズをSmallに変更し「Finish」を押下します。
これでウェアハウスの設定を変更することができました。

Snowflakeでは様々な操作をSQL分で実行することができ、この操作をSQLにすると以下のように表現できます。

ALTER WAREHOUSE "COMPUTE_WH" 
  SET WAREHOUSE_SIZE = 'LARGE' 
    AUTO_SUSPEND = 600 
    AUTO_RESUME = TRUE 
    MIN_CLUSTER_COUNT = 1 
    MAX_CLUSTER_COUNT = 1 
    SCALING_POLICY = 'STANDARD' 
    COMMENT = '';

4.2 データのロード

バルクロードは「Module 3: ロードするデータの準備」で用意したテーブルTRIPSと外部ステージcitibike_tripsを使って行います。
作業を行う前にユーザの現在のコンテキストが以下のように設定されていることを確認します。

Role: SYSADMIN
Warehouse: COMPUTE_WH (S)
Database: CITIBIKE
Schema = PUBLIC

画面では、右上に表示されています。

Snowflakeでは動的にロールやデータベース、スキーマなどを切り替えることができるので、現在のコンテキストを確認することが重要です。

適切なコンテキストを選択していることが確認出来たら、ワークシートを開いて以下のコマンドを実行します。

copy into trips from @citibike_trips
file_format=CSV;

このコマンドにより、citibike_tripsとして定義された外部ステージに保存されているCSVファイルをTRIPSテーブルにバルクロードします。 画面では以下のような感じになります。

処理が完了すると画面下部に実行結果と実行時間が表示されます。ハンズオンラボのテキストではおおよそ30秒くらいかかると書いてありますが、私の検証時は36秒かかりました。

ところで、この演習の最初にウェアハウスのサイズをLargeからSmallに変更したのを覚えていますか?
Snowflakeではバルクロードをする際に使用するウェアハウス(コンピュートノード)のサイズを上げることで、処理の並列性を上げることができます。

これを確認するため、ウェアハウスのサイズをSmallからLargeに戻して同じ処理を実行してみます。

まず、先ほどロードしたデータを削除するために、Worksheetで以下のSQLを実行します。

truncate table trips;

次にウェアハウスのサイズを変更します。
サイズ変更はいくつかの方法がありますが、画面から操作する場合は、手順4.1で行ったようにWarehouseタブを開いてCOMPUTE_WHを選択し「Configure...」ボタンを押下します。
ウェアハウスのサイズをSmallからLargeに変更して「Finish」ボタンを押下します。

ウェアハウスのサイズを変更したら、再度、Worksheetを開いてデータロードを実行します。

copy into trips from @citibike_trips
file_format=CSV;

今度は14秒くらいで処理が完了できたことがわかります。
実行結果の右上に表示されている「Open History」をクリックすることで、実行結果の履歴を確認することもできます。

Snowflakeでは、このようにウェアハウスのサイズを大きくすることで、処理の並列度を上げて素早い処理を実現することが可能です。
なお、データロードに関してはひとつの巨大ファイルをロードするのではなく、10MBから100MB程度に分割されたファイルを利用することがパフォーマンスを上げるためのポイントです。

4.3 新しい仮想ウェアハウスの作成

次にアナリスト用のウェアハウスを新規作成してみます。
Warehouseタブから「Create...」ボタンを押下して新しいウェアハウスを作成します。

設定が完了したら「Finish」ボタンを押下して新しいウェアハウスを作成します。 SQLでは以下のようになります。

CREATE WAREHOUSE ANALYTICS_WH 
  WITH WAREHOUSE_SIZE = 'LARGE' 
    WAREHOUSE_TYPE = 'STANDARD' 
    AUTO_SUSPEND = 600 
    AUTO_RESUME = TRUE 
    MIN_CLUSTER_COUNT = 1 
    MAX_CLUSTER_COUNT = 1 
    SCALING_POLICY = 'STANDARD';

次の演習となる「Module 5: 分析クエリ、リザルトキャッシュ、クローニング」では、今回作成したANALYTICS_WHを使用した演習を実施します。

まとめ

以上、「データのロード」についてご紹介いたしました。

明日の05日目は大高大輔による「Module 5: 分析クエリ、リザルトキャッシュ、クローニング」の予定です。お楽しみに!