redashからSnowflakeを参照したらクレジット消費が異常に増えたお話

5368 ワード

前置き

はじめまして。株式会社GENDAのこみぃです。

株式会社GENDAではデータウェアハウスとしてSnowflake、BIツールとしてredashを使っています。
この設計は初期段階から決めており、Snowflakeのトライアル期間にはまずはこの部分を構築しました。

さて、Snowflakeにデータを転送し、redashで接続設定をし、数日経ってふとクレジット消費量を確認すると、そこには異常に消費されたクレジットの姿が!!

幸いにして本運用になる前に修正することができましたが、これ以上同じ悲しみを背負う人が出ないように、SnowflakeとBIツールをつなぐ際に気をつけるべき設定についてまとめました。

Snowflakeの料金体系

Snowflakeの料金体系は以下の2つになっています

  • データ量に応じたストレージの料金
  • コンピュータリソースの利用料金(クレジットという概念で計算される)

基本的に料金の大部分を占めるのは後者なので、コンピュータリソースの利用を抑えていくのが費用を抑えるコツになっていきます。

ここで注意したいのが、以下の点です。

  • コンピュータリソースは稼働させた時間に対しての従量課金である
  • コンピュータリソースはクエリを打ったりすると起動され、設定された時間(デフォルト10分)以上処理が行われない場合に自動停止される。

これがどういうことかというと、 利用する時間帯が決まっていてその間に色々なクエリを打つ運用であれば直感的なクレジット消費量になるけれど、定期的にクエリを打つような運用だと思った以上にクレジット消費量が多くなる ということです。

これにより何が起こるかは、後述していきます。

何が起きていたか

今回なぜクレジット消費量が激増していたか、理由は2つありました。順番に解説します。

redashからsnowflakeへ定期的なテーブルスキーマ参照があった

redashはクエリ作成画面にて、選択しているデータソースのテーブルスキーマの一覧を表示してくれる便利な機能があります。

非常に便利な機能ですが、こいつが曲者です。
このテーブルスキーマを表示するため、redashは定期的にデータソースに対して以下のようなクエリを発行しています。

schema_select
SELECT col.table_schema,
               col.table_name,
               col.column_name
        FROM {db_name}.information_schema.columns col
        WHERE col.table_schema <> 'INFORMATION_SCHEMA'

この参照クエリの間隔はデフォルト設定ではなんと30分。

デフォルトで利用していると30分に一回snowflakeのcomputeが呼び出されて起動されることになります。結果的にクレジット消費はえらいことになります。

幸いにしてこの間隔はredashのオプションをいじることで変更が可能です。