[Snowflake新機能]タスクがEXECUTE TASKコマンドにより手動実行できるようになりました #SnowflakeDB

2022.02.24

この記事は公開されてから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単体でスケジューリング処理を行う場合にはタスクは必須ですので、活用していきましょう!