在 Snowflake 上计划 dbt 项目运行¶
可以使用 Snowflake 任务 来通过 EXECUTE DBT PROJECT 命令安排运行 dbt Projects on Snowflake。您可以使用 dbt Projects on Snowflake 的工作区来快速创建并计划用户管理的任务。您还可以使用 SQL 命令来创建任务。如果工作区连接到 dbt 项目对象,则可以在工作区内查看针对该项目运行 EXECUTE DBT PROJECT 命令的所有任务。
您必须创建一个任务,该任务在与 dbt 项目对象相同的数据库和架构中运行 EXECUTE DBT PROJECT 命令。
从工作区中创建任务¶
当您从工作区为 dbt Projects on Snowflake 创建计划时,Snowflake 会通过创建一个用户管理的任务来创建该计划,该任务保存在与 dbt 项目对象相同的数据库和架构中。该任务以任务所有者的权限运行,但任务运行与用户无关。
从工作区创建用于计划 dbt 项目对象执行的任务:
从工作区编辑器右上角的 dbt 项目菜单中,找到 Scheduled runs,然后选择 Create schedule。
在 Schedule a dbt run 对话框中,执行以下操作:
对于 Schedule name,输入任务的名称。
对于 Frequency,使用 at 限定符选择介于 Hourly 到 Monthly 之间的频率,或者选择 Custom 并输入 Cron 表达式。有关计划任务的更多信息,请参阅 CREATE TASK 命令参考中的 SCHEDULE = ...。
在 dbt properties 下:
对于 Operation,选择要按计划执行的 dbt 命令。有关支持的命令列表,请参阅 支持的 dbt 命令。
对于 Profile,选择在 dbt 项目的
profiles.yml
文件中定义的配置文件之一。对于 Additional flags,输入 dbt 命令的任何其他 命令行选项 (https://docs.getdbt.com/reference/global-configs/about-global-configs#available-flags)。
选择 Create。
Snowflake 会创建一个任务,该任务使用您指定的参数运行 EXECUTE DBT PROJECT 命令。
从工作区中查看任务¶
从 dbt Projects on Snowflake 的工作区中,您可以查看针对连接到工作区的 dbt 项目对象 EXECUTE DBT PROJECT 的数据库和架构中的所有任务。您可以选择一个任务以在对象资源管理器中查看其详细信息,包括任务定义、任务的运行历史记录和任务图。
从工作区查看与 dbt 项目对象关联的任务:
从 dbt 项目菜单中,选择 View schedules,然后从列表中选择您的计划(任务)。
该任务的 Task Details 将在对象资源管理器中打开。任务详细信息、构成任务定义的 SQL 语句以及授予该任务对象的权限均会显示。
选择 Run History 选项卡可查看任务运行历史记录,或者选择 Task Graph 选项卡可查看此任务与 :doc:`任务图 </user-guide/tasks-graphs>`(如果适用)中其他任务的关系。
有关更多信息,请参阅 查看 Snowsight 中的任务和任务图。
使用 SQL 创建任务¶
您可以使用 CREATE TASK 命令来创建任务以运行 EXECUTE DBT PROJECT 命令。使用 SQL 创建任务来通过不同 dbt CLI 选项执行不同的 dbt 命令,为 Snowflake 中的 dbt 部署提供了强大的编排能力。
以下 SQL 示例会为生产 dbt 目标创建任务,该任务每隔六小时执行一次 dbt run
命令。
CREATE OR ALTER TASK my_database.my_schema.run_dbt_project
WAREHOUSE = my_warehouse
SCHEDULE = '6 hours'
AS
EXECUTE DBT PROJECT my_database.my_schema.my_dbt_project args='run --target prod';
然后,以下 SQL 会创建一个任务,该任务在每次完成前一个 run_dbt_project
任务后执行 dbt test
命令。
CREATE OR ALTER TASK change_this.public.test_dbt_project
WAREHOUSE = my_warehouse
AFTER run_dbt_project
AS
EXECUTE DBT PROJECT my_database.my_schema.my_dbt_project args='test --target prod';