dbtから特定のmodel実行時にSnowflakeのウェアハウスのサイズを変更する #dbt #SnowflakeDB

2022.06.06

さがらです。

dbtから、特定のmodel実行時にSnowflakeのウェアハウスのサイズを変更する方法を検証したので、その方法をまとめてみます。

特定のmodel実行時にSnowflakeのウェアハウスのサイズを変更する必要性

まず、特定のmodel実行時にSnowflakeのウェアハウスのサイズを変更する必要性について考えてみます。

必ずサイズ変更が必要なものではないですが、

  • marts/aaa.sql:10TBのデータを使用
  • marts/bbb.sql:1GBのデータを使用
  • marts/ccc.sql:1GBのデータを使用

このようなケースのときに、それぞれのmodelで同じサイズのウェアハウスを使う必要はないと思います。aaa.sqlの実行時だけ、ウェアハウスのサイズを上げたい…と考える方も多いのではないでしょうか。

また関連する所でいうと、下記の公式Docに記載のsnowflake_warehouseを使用することで、使用するウェアハウス自体を切り替えることも出来ます。しかし、複数のウェアハウスを管理することになるため、一つのウェアハウスで完結させることができれば、尚良いのではないでしょうか。

そこで、特定のmodel実行時にSnowflakeのウェアハウスのサイズを変更する方法を検証してみました。

特定のmodel実行時にSnowflakeのウェアハウスのサイズを変更する方法

方法

早速なのですが、下記のように記述すれば、特定のmodel実行時にSnowflakeのウェアハウスのサイズをdbtから変更することが可能です。

{{ config(
      pre_hook=[
        "alter warehouse {{target.warehouse}} set warehouse_size=medium;"
      ],
      post_hook=[
        "alter warehouse {{target.warehouse}} set warehouse_size=xsmall;"
      ]
) }}

このように記述をしていると、履歴も下図のようになりました。このconfigは、customer.sqlに対して記述したため、customer.sqlの実行前後にウェアハウスのサイズが変わっていることがわかると思います。

実装した方法の説明

では、この実装した方法について、より詳細に中身を見ていきます。

ここでは、modelの実行前後に指定したクエリを実行できるhookを使用しています。hookの中で、alter warehouse文を実行し、ウェアハウスのサイズを変更しています。

hookについては下記の記事も併せて御覧ください。

また、自分も検証する前は「直接ウェアハウス名を書かないといけないとなると、汎用性ないよなあ…」と思っていたのですが、{{target.warehouse}}と記述することで、Credentialに設定されているウェアハウスのサイズを指定することが出来ます!

これで、使用するウェアハウスの名前が開発環境と本番環境で変わっても、問題なく対応できます。

あとは余談になりますが、target.xxxの書き方で、Credentialに設定しているユーザーやロール、アカウントも指定できるようです!これがあれば、grant文を用いた権限制御など、他のことも汎用性高く記述できそうですね。

最後に

簡単ではありますが、特定のmodel実行時にSnowflakeのウェアハウスのサイズを変更する方法をまとめてみました。

今後の課題としては、modelファイルに直書きする方法なので、dbt_project.ymlに記述できるようにmacroとか組めるとより良いかも…と感じました!(取り組むかは未定ですw)