Snowflakeの仮想ウェアハウスをマルチクラスターにする #SnowflakeDB
大阪オフィスの玉井です。
Snowflakeは仮想ウェアハウスを使うことでクエリを実行することができます。実はその仮想ウェアハウスはマルチクラスター化することができます。というわけで今回はそこらへんについて触れていきたいと思います。
2種類の仮想ウェアハウス
Standard
何も意識せずにSnowflakeを使用するとき(クエリを実行するとき)、その時稼働する仮想ウェアハウスのクラスタは1つ(シングルコンピュート)です。1つしかないので、同時実行することはできません。つまり、1つの仮想ウェアハウスに複数のクエリが飛んできた場合、その仮想ウェアハウスは最初のクエリを処理するまで、後続のクエリはキューとして待機状態となります(そして最初のクエリが終わったら、次のクエリに取り掛かる)。
小規模な使い方ならいいのですが、Snowflakeを使用するユーザーや連携システムが増えてくると、シングルコンピュートな仮想ウェアハウスでは大量のクエリを捌ききることができず、結果的にデータ分析業務に支障をきたすおそれがあります。
Multi-Cluster Warehouse (MCW)
実は、仮想ウェアハウスにはもう1つの種類があります。それがMulti-Cluster Warehouse…マルチクラスター版の仮想ウェアハウスです。仮想ウェアハウスにクラスタを追加し、同時並行性を強化することができます(要するにスケールアウト)。これを使用すれば、ユーザーや連携システムからの多くのリクエストに応えることができます。
ちなみにEnterprise Edition以上のプランはないと使用できない点に注意しましょう。
マルチクラスターに関するあれこれ
オートスケーリング
繰り返しになりますが、マルチクラスターの仮想ウェアハウスは、その1つの仮想ウェアハウスに複数のクラスタを持ちます。設定(後述)に応じて、自動的にクラスタの数を調整することが可能です(オートスケーリング)。これにより、「一時的なピークタイムのみクラスタの数を自動的に増やす」といったことができるようになります。クエリの処理自体は、仮想ウェアハウス内のクラスタ間でロードバランシングされます。
設定できるクラスタの数
マルチクラスターは、仮想ウェアハウスに「クラスタの最小値」と「クラスタの最大数」の2つの設定値を指定することで行います。例えば「最小値=1」「最大値=5」とすると、クラスタ1台で大丈夫な時はクラスタ1台体制、処理が増えてくると自動的にクラスタの数を最大5つまで増えます。処理が落ち着いてくると、クラスタの数は自動的に減少します。最小値と最大値の間で自動スケーリングしてくれるということです。
ちなみに…
- 最小値に設定できる数:1~10
- 最大値に設定できる数:(最小値以上の数で)1~10
…となっています。
スケーリングポリシー
Snowflakeにはスケーリングポリシー(Scaling Policy for a Multi-cluster Warehouse)というものがあります。これは、マルチクラスターに対するコストを抑えるために用意されているもので、(本エントリではコストの詳細は触れません。エントリ下部の公式ドキュメントをご覧ください。)、仮想ウェアハウスに任意のものを設定することができます。具体的には、クラスタをスタートする時とシャットダウンする時のタイミングが、ポリシーによって変わります。
マルチクラスターのスケーリングポリシーは、オートスケーリングの時のみ適用されます。
…「オートスケーリング時のみ」というのはどういうことでしょうか?これは「マルチクラスターだけどオートスケーリングしない時」を考えればわかります。要するに「クラスタの最小値と最大値が同じ時」です。例えば両方10にすると、その仮想ウェアハウスは常に10のクラスタを持ちます。最小も最大も同じなので、スケーリングすることはありません。こういう時はスケーリングポリシーの適用外となります。
スケーリングポリシーには2種類あります。
Standard
デフォルトで適用されるポリシーとなります。キューが増えることよりもクラスタの増加を優先します。
クエリーがキューに登録された時か、「稼働中のクラスタが実行できるクエリ」よりも1つ多いクエリが検出されたとき、クラスタが追加されます。
「一番負荷の少ないクラスタ」の負荷が、これ以上クラスタを増やさなくても処理できる(既にあるクラスタに任せることができる)状態にあるかどうか…が、Snowflake上のチェックで2,3回連続で該当した場合、クラスタ数は減少します。(チェックは1分間隔で行われる)。
Economy
クラスタの追加よりも、稼働中のクラスタを使い続けることを優先します。言い換えると、クラスタの追加よりもクエリをキューに登録する方が優先されます。
「ではいつクラスタが増えるのか」という話になりますが、Snowflakeが「このクエリはクラスタを少なくとも6分間はビジーにするだけの負荷がある」と予測した時のみ、クラスタが増えます。そのクラスタによって「ちょっと荷が重いなこれは…」みたいなクエリが来た時だけクラスタの追加で対応する感じですね。
クラスタ数の減少タイミングはほとんどStandardと同じです。ただし、5,6回連続でチェックが該当した時…という点がStandardとは異なります。
やってみた
クラスタ数の設定
仮想ウェアハウスをマルチクラスターにするのはめちゃくちゃ簡単です。
仮想ウェアハウスのメニューを開いて、仮想ウェアハウスを新規作成するか既存のものの編集を行います。
この設定画面でクラスタの最小値と最大値、それとスケーリングポリシーを選ぶことができます。
WebUIではなく、SQLでも設定することができます(本エントリ下部の公式ドキュメント参照)。
おわりに
Snowflakeはクラウドベースなだけあって、自動でよしなに調整してくれる機能が多いです。何も知らずにまかせて使ってもいいのですが、その調整の内容や発動条件等は把握して、より効率的にSnowflakeを操っていきたいですね。