この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
さがらです。
Snowflakeで定期的にクエリをスケジューリング実行したい場合はタスクを用いますが、手動でスケジューリング設定したタスクを実行できるEXECUTE TASK
コマンドが使えるようになりました。※2022年2月24日時点ではまだプレビュー機能です。
本記事ではこのコマンドを試してみた内容をまとめてみます。
前置き:タスクとは
まず、Snowflakeのタスクについて振り返ります。
タスクは、任意のSQLについて定期的なスケジュールを組んで実行できる機能です。
データ分析基盤において、定期的にSQLを実行して分析に使用するテーブルを更新するバッチ処理はほぼ必須の機能です。このバッチ処理に当たることをタスクで実現できます。
また、対象のテーブルの変更データを保持するストリームと合わせることで、新しいデータの更新があったらタスクを実行するという処理も実現可能です。
タスク、及びタスクとストリームの組み合わせについては弊社でも記事を書いておりますので、ぜひ併せて御覧ください。
EXECUTE TASKコマンドとは
タスクはこれまで基本的に、スケジュール実行しかできませんでした。しかし、今回EXECUTE TASK
コマンドが追加されたことにより、手動実行できるようになりました!
手動実行できることによるメリットは、このような点が挙げられると思います。
- タスク作成後、想定通りに動くかテスト実行したいとき
- スケジューリングしているタスクのエラーに気づき、データやクエリの修正後に再度タスクを実行したい時
使い方
使い方はとても簡単で、EXECUTE TASK
のあとに対象のタスク名を入れるだけでOKです。
EXECUTE TASK <name>
コマンドの仕様
このコマンドを使うにあたっての仕様を簡単にまとめておきます。(公式Docより)
- このコマンドでタスクを実行するには、タスクのOWNERSHIP権限またはOPERATE権限のいずれかが必要
- 親子関係を持つタスクにおいて、親に当たるルートタスクが実行され成功すると、ツリー内の子タスクも実行される (子タスクも
started(開始済み)
の時のみ)- 一方で、子タスクを
EXECUTE TASK
で実行するとエラーを返す
- 一方で、子タスクを
より詳細な仕様は、EXECUTE TASKの公式Docを御覧ください。
試してみた
EXECUTE TASK
コマンドについて仕様は色々と書いてあったのですが、「対象タスクが開始しているかどうか」で挙動が本当に変わるかを確かめてみます。
事前準備
下記のクエリを実行して、検証に使用するテーブルやタスクを準備します。
-- タスク実行のためのデータベースを作る
use role sysadmin;
create or replace database sagara_tasktest_db;
-- サンプルデータを元に、タスク実行用の新しいテーブルを作る
use database sagara_tasktest_db;
use schema public;
create or replace table my_customer as
select * from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF1"."CUSTOMER";
-- ルートタスクの作成
use role accountadmin; -- 今回は検証のため、ACCOUNTADMINで実施します。実運用ではTASKADMINのようなロールを作ることが望ましいです。
create or replace task sagara_testtask_root
user_task_managed_initial_warehouse_size = 'XSMALL'
schedule = '11520 minute'
as
create or replace table my_customer_2 as
select * from my_customer;
-- 子タスクの作成
create or replace task sagara_testtask_child
user_task_managed_initial_warehouse_size = 'XSMALL'
after sagara_testtask_root
as
create or replace table my_customer_3 as
select * from my_customer_2;
実際にタスクを実行したり、ステータスを変更する際は下記のクエリから必要なものを実行します。
-- タスクの一覧確認
show tasks;
-- タスクの一時停止時に行うコマンド
alter task sagara_testtask_root suspend;
alter task sagara_testtask_child suspend;
-- タスクの再開時に行うコマンド
select system$task_dependents_enable('sagara_tasktest_db.public.sagara_testtask_root');
-- タスクの手動実行コマンド
execute task sagara_testtask_root;
execute task sagara_testtask_child;
親子関係になっているタスクのルートタスクを実行した時(すべてのタスクが「一時停止」)
下図のように表示されて、ルートタスクは実行されたのですが、続く子タスクは実行されませんでした。
親子関係になっているタスクの子タスクを実行した時(すべてのタスクが「一時停止」)
下図のように、エラーが表示されました。
親子関係になっているタスクのルートタスクを実行した時(すべてのタスクが「開始済み」)
下図のように表示されて、ルートタスクのあとに子タスクも実行されました。
親子関係になっているタスクの子タスクを実行した時(すべてのタスクが「開始済み」)
下図のように、エラーが表示されました。
まとめ
手動でスケジューリング設定したタスクを実行できるEXECUTE TASK
コマンドについてまとめてみました。
Snowflake単体でスケジューリング処理を行う場合にはタスクは必須ですので、活用していきましょう!