Tableau Desktopで超高速DWH『Snowflake』に接続してみた

Tableauユーザーの皆様、こんにちは。jimmyです。
僕自身も普段からTableauを愛用しているのですが、DBサーバーに接続して大量のデータ(1千万件以上)を分析しようとすると画面が固まっちゃったり、パフォーマンスが悪くなってしまうこと、よくありませんか?
それはもちろんTableau自体が大量データを得意としていないこととも関係があるのですが、DBサーバー側のパフォーマンスが高くないという問題とも関わりがあります。
とは言ってもDBサーバーのサイズを調整するのってかなり手間が掛かるし、「どうしよう…」と悩んでいたところ、『Snowflake』というDWH製品の勉強会に参加する機会があったので、Tableauと接続した様子をレポートします。

1.Snowflakeとは

Snowflake(スノーフレーク)は、クラウドベースで開発されたデータウェアハウスで、最大の特徴は『高性能なのに低価格』という部分だと個人的には思う。
RedshiftやBigQuery等と性能を比較したベンチマークテストの結果によると、価格性能比でSnowflakeが最も優れているらしい。

◯Fivetran社が実施したベンチマークテスト結果
https://fivetran.com/blog/warehouse-benchmark

また、サイジングに関しても非常にシンプルなアーキテクチャで、コンピュートリソースとストレージリソースが完全に分離しているため、パフォーマンス調整(スケールアップ、スケールアウト)も非常に簡単。しかも、システムを停止する必要がないので可用性も高い。

また、価格体系も非常にシンプル。
コンピュート(ウェアハウス)とストレージのそれぞれに対して、稼働した分にだけ課金されるモデルとなっている。
特に興味深かったのが、ウェアハウスの課金モデル。
ウェアハウスのサイズは8種類(X-Small、Small、Medium、Large、X-Large、2X-Large、3X-Large、4X-Large)用意されており、上位サイズにいくにつれて処理性能・時間単価がそれぞれ2倍ずつになっていく。

上記を表にするとこうだ。便宜上、X-Smallを基準値1としている。

ウェアハウスサイズ 処理性能 時間単価
X-Small 1 1
Small 2 2
Medium 4 4
Large 8 8
X-Large 16 16
2X-Large 32 32
3X-Large 64 64
4X-Large 128 128

この課金モデルだと、ウェアハウスサイズを大きくしても処理時間がその分短くなるので、1タスク当たりのコストは変わらないことが分かる。
例えば、X-Smallで128分掛かるタスクを4X-Largeで実行すると1分で終了するため、それぞれの時間単価を掛けた時のコストはどちらも128となる。

これをうまく利用すれば、大きいタスクが走る時間帯にサイズを上げ、逆にタスクが少ない時間帯はサイズを下げる等の運用ができるようになり、コストを抑えつつもハイパフォーマンスなDWH環境を常に提供することができるようになる。

そこで気になるのが、実際どのくらいの性能なのか。
Snowflakeのトライアルで確かめていく。

2.Snowflakeのトライアルを始める

Snowflakeのトライアルでは、1ヶ月で400ドル分のリソースを無料で利用することができる。
試しに1.2TBのデータをスキャンし240億件のデータが返ってくるクエリを実行したら、30ドル程度で収まったのでトライアルで使う分には充分な程のリソースだ。
ということで、トライアルの始め方を紹介する。

登録情報の入力

Snowflake にアクセスし、氏名、メールアドレス、会社名、国名(JapanでOK)を入力する。

アカウント情報の入力

次にエディションを選択するのだが、基本的にEnterpriseでいいだろう。
クラウドプラットフォームに関しても各個人の好みで問題ない。ただ、Regionに関しては米国が一番安く使えるのでオススメ。
あとは、電話番号と2箇所にチェックを入れたら完了!

アカウントのアクティベート

程なくしてSnowflake社からメールが届くので「CLICK TO ACTIVATE」ボタンを押下する。

ユーザー情報の登録

ユーザー名とパスワードを入力する。

すると、トライアルが開始されwebコンソールが開く。これで準備は完了。

3.クエリを実行してみる

すぐにTableauから接続するのも勿体ないので、このwebコンソール上からいくつかクエリを実行してみよう。
Snowflakeのトライアル用の環境にはサンプルデータが用意されている。中には10TBを超えるテーブルもあるので、かなり大きなタスクも実行することができる。

SNOWFLAKE_SAMPLE_DATAがサンプルデータ

さらに、サンプルのクエリも用意されているので、挙動を確かめるだけだったらこれだけで完結する。
サンプルのクエリは”Open Tutorials”を選択し、Tutorial1~3を開くことで利用することができる。

今回はTutorial1を選択してみよう。
中身をざっと見てみると注文データをReturnflagとLinestatusの状態ごとにデータを集計するようだ。
早速、”All Queries”にチェックを入れ、[Run]でクエリを実行してみる。

すると画面下部の”Results”に4行の結果が返ってくる。
処理時間も表示されているのが確認できる(今回は296ms)。

このように、Tutorialを利用すればサンプルクエリでSnowflakeの挙動を確認することができる。
また、全てのログは”History”タブに記録されている。
処理時間やスキャンしたデータ量、返したデータ件数などが確認できるので、パフォーマンスをテストする際にはこの画面を見ながらクエリを実行していくことになる。

以上で大体webコンソールの使い方は理解できたと思うので、ここからはTableauでSnowflakeに接続してみる。

4.TableauでSnowflakeに接続する

ODBCドライバーを入手する

Tableau DesktopでSnowflakeに接続するのには、あらかじめ”Snowflake ODBC driver”を入手しておく必要がある。
このドライバーに関してもSnowflakeのwebコンソールから簡単に取得できる。

まず、webコンソール画面左上の”Help”をクリックし、”Download…”を選択する。

するとDownloads画面が開くので、”ODBC Driver”タブに切り替え”Snowflake Repository”を選択する。

ブラウザが新しく開くので自分の環境にあったドライバーをダウンロードする。基本的にlatestバージョンを取得しておけば問題ないだろう。

ダウンロード後、インストールを行えば準備は完了。

Tableau Desktopで接続する

さあ、Tableau Desktopを開こう。
サーバーへの接続からSnowflakeを選択し、以下情報を入力する。

サーバー:<account等>.snowflakecomputing.com
ユーザー名:Snowflakeトライアル時に設定したアカウント名
パスワード:Snowflakeトライアル時に設定したパスワード

ちなみにサーバー情報はwebコンソールのURLを参照すれば分かる。
上記を入力してサインインできれば接続は完了だ。

データソース画面を開き、接続先を選択していく。
今回は以下の条件で設定を行った。

次に接続するテーブルを選択する訳だが、先述した10TBのテーブルに繋いだとしても、Snowflakeから返ってきたデータがPCのメモリに収まらないので、手頃なデータを探してみる。

CATALOGのデータやWEBサイトのデータも興味深いが、”CUSTOMER”テーブルが1億レコード(4.5GB)なので丁度良さそうだ。さらに”CUSTOMER_ADDRESS”テーブル(5,000万レコード、935MB)もあるので、結合させてみよう。
“C_CUSTOMER_ID”行と”CA_ADRESS_ID”行でうまいこと結合できたので、これでいこうと思う。

左結合なのでデータ件数は1億件だ。
まずはこれでどのくらいのパフォーマンスを発揮できるのか、試してみる。

作ったのは非常にシンプルなチャート。州ごとの顧客数を棒グラフで表示させている。

このチャートを作る際に発行されたクエリの処理時間は”2.4秒”だった。(X-Largeのウェアハウスを使用している)

続いて以下のマップも作成してみた。C_BIRTH_COUNTRY列を使用している。

このチャートを作る際に発行されたクエリの処理時間は”3.4秒”だった。(X-Largeのウェアハウスを使用している)

上記で2パターンのクエリを処理させたが、1億件のデータに対しての応答速度としては中々早いのではないかと思う。今回はX-Largeのウェアハウスを使用しているが、更に高速なパフォーマンスを求めるならサイズアップすれば実現するだろう。

次に、X-Smallのウェアハウスに切り替えてパフォーマンスを見てみる。
(以下のSQLを実行すればウェアハウスを新規で作成できる。)

CREATE WAREHOUSE test_warehouse WITH
WAREHOUSE_SIZE = xsmall
INITIALLY_SUSPENDED = TRUE;

X-Smallのウェアハウスで上記2つのチャートを作成した時のクエリ処理速度は以下のようになった。
棒グラフ:7.6秒
マップ:8.2秒

上記結果から、X-SmallとX-Largeを比較すると単純計算で処理時間が1/16になる訳ではないが、処理性能的にはかなりの差があることが分かる。また、今回は比較的スモールなクエリでの比較だったが、より大きく複雑なクエリを処理させた際には16倍に近い処理性能の差が明らかにあるのかもしれない。

今回は以上の検証で終了とするが、機会があればTB級のデータに対してのパフォーマンスも検証して記事にしたいと思う。

以上、【Tableau Desktopで超高速DWH『Snowflake』に接続してみた】でした。


Tableauを体験してみませんか?

INSIGHT LABでは毎月Tableauの無料ハンズオンセミナーを開催しています。初めてTableauをご利用される方を対象に、Tableauの概要や、他のBIツールとの違いについて分かりやすくご説明いたします。