任务简介¶
任务可执行以下任何一种类型的 SQL 代码:
单一 SQL 语句
调用存储过程
使用 Snowflake Scripting 的过程逻辑
任务可以与 表流 结合使用,以支持连续 ELT 工作流程,从而处理最近更改的表行。流可确保表中新数据或更改数据的语义恰好仅有一次。
任务也可独立使用,通过在一份报表中插入或合并行来生成定期报告,或者执行其他定期工作。要运行包含任务的复杂业务流程,请考虑使用 任务图 将多项任务链接在一起。
本主题内容:
计算资源¶
任务需要计算资源以执行 SQL 代码。可以为个别任务选择以下任一计算模型:
无服务器计算模型
由用户管理的虚拟仓库
Serverless Task¶
通过任务的无服务器计算模型,您可以依靠由 Snowflake 管理的计算资源,而非由用户管理的虚拟仓库。Snowflake 会根据每个工作负载的需要自动调整无服务器计算资源的大小和规模。Snowflake 对同一项任务最近一次运行的统计数据执行动态分析,并根据结果确定给定运行的无服务器计算资源的理想大小。Serverless Task 的最大计算大小相当于 XXLARGE 用户管理的虚拟仓库。您账户中的多个工作负载共享一组通用的计算资源。
要启用无服务器计算模型,您必须在使用 CREATE TASK 创建任务时省略 WAREHOUSE 参数。请注意,执行 CREATE TASK 命令的角色必须具有全局 EXECUTE MANAGED TASK 权限。有关任务的访问控制要求的更多信息,请参阅 任务安全性。
Serverless Task 的运行计费方式与依赖虚拟仓库提供计算资源的任务(使用标准的 Credit 消耗模式)有所不同。有关更多信息,请参阅 任务成本。
备注
无服务器任务支持使用 Java 或 Python 外部函数。但是,无服务器任务不能调用在 Snowflake 内部开发的以下对象类型和函数:
包含 Java 或 Python 代码的 UDFs(用户定义的函数)。
以 Scala(使用 Snowpark)编写的存储过程,或者调用包含 Java 或 Python 代码的 UDFs 的存储过程。
小技巧
Serverless Task 支持使用混合表,但在使用混合表时,您可能无法体验最佳性能或效率。
由用户管理的任务¶
如果愿意,您也可以在创建任务时指定现有虚拟仓库,从而管理单项任务的计算资源。若要使用此选项,需要选择一个大小适合于任务执行的 SQL 操作的仓库。
选择仓库大小¶
如果您选择使用现有仓库为单项任务提供计算资源,建议您遵循 仓库注意事项 中介绍的最佳实践。建议根据仓库大小和聚类情况,分析使用特定仓库的单项任务或 :ref:` 任务图 <label-task_dag>` 的平均运行时间,以及仓库是由多个进程共享,还是专用于运行该单一任务或任务图。
查询 TASK_HISTORY Account Usage 视图 (在 SNOWFLAKE 共享数据库中)。任务的计划时间和完成时间之间的平均差即为任务的预期平均运行时间,包括任务排队的任何时间段。在当前有其他进程在使用仓库中的所有计算资源时,任务将会排队。
除非可以优化为任务定义的 SQL 语句(通过重写语句或使用存储过程),否则这将是任务或任务图的预期平均运行时间。根据分析结果选择合适的仓库大小,以确保任务或任务图在此时间段内完成运行。
下图显示了 1 分钟的时间段,在此时间段内,单项任务排队 20 秒,然后运行 40 秒。
下图显示了每次运行平均需要 5 分钟才能完成的一个任务图。er图中显示了两次任务图运行完成所需的时间段。此窗口的计算方式是从根任务计划启动的时间,到任务图中最后一个子任务完成运行的时间。在此示例中,任务图与其他并发操作共享,当任务图中的 3 项任务中的每一项都在运行时,这些并发操作排队。当任务图中的每项任务运行完毕之时,以及下一项任务开始运行之前,这些并发操作会消耗所有可用资源。因此,每项任务的时间段均包含一定的排队时间,用于等待其他操作完成并交出计算资源。
请注意,即使任务图基于专用仓库运行,在前置任务运行完毕、任何子任务执行之后,预计也会出现短暂的延迟;但不会出现与其他操作一起排队等候共享资源的情况。您选择的仓库应该足够大,可以容纳由前置任务同时触发的多个子任务。
有关选择计算模型的建议¶
下表描述了有助于决定何时使用 Serverless Task 与用户管理的任务的各种因素:
类别 |
Serverless Task |
由用户管理的任务 |
备注 |
---|---|---|---|
并发任务工作负载的数量、持续时间和可预测性 |
如并发运行的任务数量过少或任务完成速度较快(不到 1 分钟),导致仓库无法充分得到利用,则推荐使用此项。 计算资源大小的选择基于先前运行的历史记录,因此运行相对稳定的任务是执行 Serverless Task 的理想选择。 |
如果能安排多个并发任务来利用可用的计算资源,从而达到充分利用单个仓库的效果,则推荐使用此项。 此外,还建议用于计算资源出现负载峰值或不可预测的负载的情况。启用了 自动暂停和自动恢复 的 多集群仓库 有助于调节 credit 的消耗。 |
对于 Serverless Task,Snowflake 根据计算资源的实际使用量向您的账户计费。 相比之下,由用户管理的仓库的计费基于仓库大小,而不考虑所用的计算资源是什么,每次恢复仓库时至少按 60 秒计算。 |
计划间隔 |
如果遵守计划间隔非常重要,建议使用此项。 如果某项独立任务或计划任务图的运行几乎过了这个时间间隔,那么 Snowflake 就会增加计算资源的大小(最大可相当于一个两倍大的仓库)。 |
如果遵守计划间隔不太重要,则建议使用此项。 |
计划间隔 是指任务图中独立任务或根任务的连续计划执行之间的时间间隔。 请注意,增加计算资源会缩短部分(但不是全部)SQL 代码的执行时间,可能不足以确保在批处理时间段内完成任务运行。 |
请注意,一个 Serverless Task 运行的最大大小等于 XXLARGE 仓库的大小。如果某个任务工作负载需要更大的仓库,则应创建引用所需大小的仓库、由用户管理的任务。
任务计划¶
任务一般按计划运行。可在创建任务时使用 CREATE TASK 或稍后使用 ALTER TASK 来定义计划。
独立任务或任务图中的根任务通常按计划运行。可在创建任务时,使用 CREATE TASK 或稍后使用 ALTER TASK 或 Snowsight 来定义计划。
Snowflake 确保在给定时间仅执行一个带有计划的任务实例(即独立任务或任务图中的根任务)。如在下一个计划内的执行时间到来时,任务仍在运行,则会跳过该计划内的时间。
Snowflake 会自动调整和扩展 Serverless Task 的计算资源大小。对于依靠仓库提供计算资源的任务,为给定任务选择合适的仓库大小,以在指定计划安排内完成其工作负载。有关信息,请参阅 选择仓库大小 (本主题内容)。
任务计划与夏令时¶
任务定义中的 cron 表达式支持指定时区。计划任务根据以给定时区的本地时间指定的 cron 表达式运行。在为认可夏令时的时区计划任务时,应该特别小心。在从标准时间过渡到夏令时(或反之)的特定时间段内计划的任务可能会出现意外行为。
例如:
在秋季从夏令时改为标准时间期间,计划在 America/Los_Angeles 时区(即
0 1 * * * America/Los_Angeles
)的 1 AM 开始的任务将运行 两次:一次在 1 AM,另一次在 1:59:59 AM 切换到当地时间 1:00:00 AM 时运行。也就是说,在当地时间为 1 AM 时,有两个时间点。在春季从标准时间改为夏令时期间,计划在 America/Los_Angeles 时区(即
0 2 * * * America/Los_Angeles
)的 2 AM 开始的任务 根本不会运行,因为当地时间从 1:59:59 AM 切换到 3:00:00 AM。也就是说,在当天,当地时间没有 2 AM 的时间点。
为避免因夏令时而意外执行任务, 请使用以下方法之一:
请勿将任务安排在 1 AM 至 3 AM 之间的特定时间运行(每天或每周的七天,含周日), 或
每年两次,手动调整在这些时间计划的任务的 cron 表达式,以补偿夏令时导致的时间变化, 或
使用不适用于夏令时的时间格式,例如 UTC。
任务图¶
任务图或有向无环图 (DAG) 是一系列任务,是由单项根任务和其他任务组成的,并根据它们之间的依赖关系进行组织。任务图单向流动,也就是说,图中后面的任务无法提示先前任务的运行。每项任务(根任务除外)可以有多项前置任务(依赖项)。每项任务还可以有多项依赖于它的后继(子)任务。
只有在所有前置任务成功运行至完成后,一项任务才能运行。每项任务必须至少有一个已定义的前置任务来链接任务图中的任务。只有在所有前置任务成功运行至完成后,一项子任务才能运行。
创建新任务时您可以使用 CREATE TASK ...AFTER 来指定前置任务,稍后可使用 ALTERTASK ...ADD AFTER 来指定。一个任务图最多只能包含 1000 项任务(包括根任务)。单项任务最多可有 100 项前置任务和 100 项子任务。
您可使用 SQL 或 Snowsight 来查看和编辑任务图。要在 Snowsight 中管理任务图,请参阅 查看和管理任务图。
在以下基本示例中,根任务提示任务 B 和 C 同时运行。在任务 B 和 C 均运行完毕后,任务 D 会运行。
以下实际示例展示了如何使用任务图在聚合事实数据之前更新销售数据库中的维度表:
另一个示例显示了任务图中的最终任务,该任务调用外部函数来触发远程消息传送服务,从而发送通知,告知所有先前的任务均已成功运行完毕。
任务图所有权¶
任务图中的所有任务必须具有相同的任务所有者(即必须仅有一个角色具有所有任务的 OWNERSHIP 权限),并且存储在同一数据库和架构中。
如果转移任务所有权,则会切断该任务与任何前置任务和子任务之间的依赖关系。有关更多信息,请参阅 切断前置任务与子任务之间的关联 (本主题内容)。
当任务图中 所有 任务的所有权通过以下任何一种活动同时转移时,任务图中所有任务之间的关系将得到保留:
包含任务图的所有任务的当前所有者将被删除(使用 DROP ROLE)。被删除的角色所拥有的对象的所有权将转移给执行 DROP ROLE 命令的角色。
构成任务图的所有任务的所有权将显式转移给另一个角色(例如,通过对架构中的所有任务执行 GRANT OWNERSHIP)。
运行任务图中的任务¶
一个任务图的运行是由它定义的根任务的运行来启动的。根任务的成功运行会触发子任务的级联运行,因为子任务的前一项任务已经完成。根任务可通过以下方式运行:
任务计划 – 通常任务图是基于 CRON 或时间间隔的计划运行的。
ALTER TASK – 您可以使用
ALTER TASK [ IF EXISTS ] <name> RESUME
来运行基于其现有计划的任务图。首次创建时,必须恢复所有任务。EXECUTE TASK – 您可以使用
EXECUTE TASK <name>
创建任务图的一次性运行。
手动运行任务图中的任务¶
EXECUTE TASK 命令可手动触发单次任务运行,与为任务定义的计划无关。成功运行根任务会触发任务图中子任务的级联运行(基于前置任务的完成),就像根任务按照其定义的计划运行一样。
您还可以使用 EXECUTE TASK<name> RETRY LAST
重新运行任图中的任何子任务。RETRY LAST
尝试从上次失败的任务运行任务图。如果任务成功,所有子任务将继续运行,因为它们的前置任务已完成。
此 SQL 命令非常有用。在允许新的或已修改的任务图在生产环境中执行 SQL 代码之前,此命令可用于测试它们。
重叠任务图运行¶
默认情况下,Snowflake 确保一次只允许运行一项特定任务图的一个实例。只有在该任务图中的所有任务都运行完毕后,才会安排根任务的下一次运行。这意味着,如果运行任务图中所有任务所需的累积时间超过了根任务定义中设置的明确计划时间,则至少会跳过任务图的一次运行。该行为由根任务上的 ALLOW_OVERLAPPING_EXECUTION 参数控制;默认值为 FALSE。将参数值设置为 TRUE,这将允许任务图重叠运行 。
此外,只有在子任务的:emph:`所有`前置任务均成功完成自己的运行后,子任务才能开始运行。如一项任务会执行耗时的 SQL 操作,则会造成任何将该任务标识为前置任务的子任务的启动发生延迟。
在以下示例中,任务图计划在上一次运行尚未完成时开始运行。重叠期(或称为并发时间)以红色标识。该图还确定了每项任务在由用户管理的仓库中运行之前,需要排队的排队的时间跨度。请注意,如果使用无服务器计算资源,那么就没有排队期:
在重叠运行任务图执行的读/写 SQL 操作不会产生错误或重复的数据时,重叠运行是可以容忍的(甚至是可取的)。但是,对于其他任务图,任务所有者(对任务图中所有任务具有 OWNERSHIP 权限的角色)应为根任务设置适当的计划,并选择适当的仓库大小(或使用无服务器计算资源),以确保在下次计划运行根任务之前完成任务图的一个实例。
为了更好地将任务图与根任务中定义的计划保持一致,请执行以下操作:
如可行,延长根任务运行之间的计划时间。
考虑修改计算密集型任务,以使用无服务器计算资源。如果任务依赖于由用户管理的计算资源,请增加运行任务图中大型或复杂 SQL 语句或存储过程的仓库的大小。
分析每项任务执行的 SQL 语句或存储过程。确定是否可以重写代码,以利用并行处理。
如果以上解决方案都没有帮助,请考虑是否需要对根任务设置 ALLOW_OVERLAPPING_EXECUTION = TRUE,以允许并行运行任务图。可在创建任务时(使用 CREATE TASK)或稍后使用 ALTER TASK 或 Snowsight)来定义此参数。
暂停和恢复任务图中的任务¶
要暂停或恢复任务图中的任务,请使用 ALTER TASK ...RESUME | SUSPEND or the | sf-web-interface|。
- 暂停根任务
根任务暂停时,根任务的所有未来计划运行都将被取消;但如果当前有任何任务正在运行,则这些任务和任何子任务都将继续运行。
- 恢复和暂停子任务
要恢复或暂停子任务,则必须要暂停根任务。恢复已暂停的子任务不需要恢复根任务。
- 以递归方式恢复任务
要以递归方式恢复任务图中的所有任务,请查询 SYSTEM$TASK_DEPENDENTS_ENABLE 函数。
- 运行包含暂停的子任务的任务图
在运行包含一个或多个暂停的子任务的任务图时,此次运行会忽略这些暂停的任务。只要 至少有一个 前置任务处于恢复状态,且所有恢复的前置任务都成功运行至完成,具有多个前置任务的子任务即可运行。
任务图版本控制¶
当恢复或手动执行任务图中的根任务时,Snowflake 会设置整个任务图的版本,包括任务图中所有任务的所有属性。暂停和修改任务后,恢复或手动执行根任务时 Snowflake 会设置一个新的版本。
要修改或重新创建任务图中的任何任务,必须先暂停根任务。根任务暂停时,根任务的所有未来计划运行都将被取消;但如果当前有任何任务正在运行,则这些任务和任何子任务都将使用当前版本继续运行。
备注
如果在任务图执行过程中,任务调用的存储过程的定义发生变化,则可以在当前运行的任务调用存储过程时执行新的编程。
例如,假设任务图中的根任务已暂停,但该任务的计划运行已开始。在根任务仍在运行期间,任务图中所有任务的所有者修改了子任务调用的 SQL 代码。子任务使用根任务开始运行时当前的任务图版本,运行并执行其定义中的 SQL 代码。恢复或手动执行根任务时,将设置新版本的任务图。这个新版本包括对子任务的修改。
要检索任务版本的历史记录,请查询 TASK_VERSIONS Account Usage 视图 (在 SNOWFLAKE 共享数据库中)。
查看任务图中的依赖任务¶
要查看根任务的直接子任务或者任务图中的所有任务,请执行以下操作:
- SQL:
查询 TASK_DEPENDENTS 表函数(在 Snowflake Information Schema 中)。请注意,要在任务图中检索 所有 任务,请在调用该函数时输入根任务。如果输入子任务,该函数将返回指定任务的子任务(以及这些子任务的子任务,依次类推)。
- Snowsight
要在 Snowsight 中查看任务图,请参阅 查看和管理任务图。
任务运行失败后自动暂停任务图¶
(可选)在任务运行连续失败指定次数或超时后自动暂停任务图。
在任务图中设置根任务的 SUSPEND_TASK_AFTER_NUM_FAILURES = num
参数。当参数设置为大于 0
的值时,任务图中的 任何 子任务连续失败或超时指定次数后,根任务将自动暂停。失败或超时的子任务不会暂停。
自动重试失败的任务图运行¶
指定任务图自动重试的次数。如果任何任务图在 FAILED 状态下完成,Snowflake 可以自动从失败的图中的最后一个任务重试任务图。
任务图自动重试功能默认处于禁用状态。要启用此功能,请将 TASK_AUTO_RETRY_ATTEMPTS
设置为大于 0
的值。
切断前置任务与子任务之间的关联¶
任务图中任务之间的依赖关系可以通过以下操作断开:
ALTER TASK ...REMOVE AFTER 和 ALTER TASK ...UNSET FINALIZE 解除目标任务与指定的前置任务或最终根任务之间的关联。
DROP TASK 和 GRANT OWNERSHIP 会切断目标任务的所有关联。例如,根任务 A 有子任务 B,而任务 B 有子任务 C。如果删除任务 B,则任务 A 和 B 之间的关联将被解除,任务 B 和 C 之间的关联也将被解除。
如果上述操作的任意组合切断了子任务与 所有 前置任务之间的关系,则其前一个子任务将变为独立任务或根任务,具体取决于是否有其他任务将该任务标识为其前置任务。
备注
当您将一个任务的 GRANT OWNERSHIP
权限授予当前所有者时,依赖关系可能不会切断。
终结器任务¶
终结器任务在任务图中的所有其他任务运行完成之后运行。您可以定义终结器任务的 SQL,来处理任务图所使用的通知以及资源的释放和清理。例如,如果任务图运行使用中间表来跟踪需要处理的数据,但在尚未消耗表行的情况下失败,则下一次运行将遇到重复的行并重新处理数据,从而导致执行时间延长或浪费计算资源。终结器任务可以按需删除行或截断表,从而解决此问题。
终结器任务的工作方式与任务图中的其他任何任务很相似,但有以下区别:
终结器任务始终与根任务关联。每个根任务只能有一个终结器任务,一个终结器任务只能与一个根任务相关联。
当任务图中的任何任务开始运行时,将安排终结器任务。终结器任务只有在任务图中的所有任务运行完成后才运行。如果跳过某个任务图,则终结器任务不会运行。
终结器任务不能有任何子任务。任何尝试将终结器任务设为前置任务的命令都将失败。
终结器任务的创建必须包含
FINALIZE
关键字,该关键字与SCHEDULE
和AFTER
关键字均不兼容。
要创建终结器任务,请使用 FINALIZE
关键字创建任务,并设置与根任务的关系:
CREATE TASK <TASK_NAME> ...
... FINALIZE = <ROOT_TASK_NAME>
有关更多信息,请参阅 CREATE TASK。
备注
在 Snowsight 中,终结器任务显示为一项单独的任务,具有自己的运行历史记录和配置详细信息。任务图视图不显示终结器任务或根任务与终结器任务之间的关系。
运行的版本控制¶
首次恢复或手动执行独立任务时,系统会设置任务的初始版本。独立任务使用此版本运行。暂停和修改任务后,恢复或手动执行独立任务时会设置新版本。
当任务暂停时,任务的所有未来计划运行都将被取消;但是,当前运行的任务将使用当前版本继续运行。
例如,假设任务已暂停,但任务的计划运行已开始。任务的所有者在任务仍在运行期间修改任务调用的 SQL 代码。任务使用任务开始运行时的当前版本运行并执行其定义中的 SQL 代码。恢复或手动执行任务时,将会为任务设置一个新版本。这个新版本包括对任务的修改。
要检索任务版本的历史记录,请查询 TASK_VERSIONS Account Usage 视图 (在 SNOWFLAKE 共享数据库中)。
为任务设置会话参数¶
可以为任务运行所在的会话设置会话参数。为此,修改现有任务并使用 ALTER TASK ... SET session_parameter = value[, session_parameter = value ... ]
设置所需的参数值,或者在 Snowsight 中编辑任务。
任务支持所有会话参数。有关完整列表,请参阅 参数。
请注意,任务 不 支持账户或用户参数。
处理失败任务¶
(可选)在指定次数的连续运行失败或超时后自动暂停任务。此功能可暂停消耗 Snowflake credit 但无法运行至完成的任务,从而降低相关费用。失败的任务运行包括任务主体中的 SQL 代码产生用户错误或超时的运行。由于系统错误而跳过、取消或失败的任务运行被视为不确定,不会包含在失败的任务运行次数中。
在运行失败后自动暂停任务¶
(可选)在指定次数的连续运行失败或超时后自动暂停任务。此功能可暂停消耗 Snowflake credit 但无法运行至完成的任务,从而降低相关费用。
设置任务的 SUSPEND_TASK_AFTER_NUM_FAILURES = num
参数。当参数设置为大于 0
的值时,在超过指定的任务运行连续失败次数或超时后,任务将自动暂停。
还可以在账户、数据库或架构级别设置 SUSPEND_TASK_AFTER_NUM_FAILURES 参数。此设置适用于修改对象中包含的所有任务。请注意,在较低级别显式设置的参数将替换在较高级别设置的参数值。
自动重试失败的任务运行¶
如果任何任务在 FAILED 状态下完成,Snowflake 可以自动重试该任务。默认情况下禁用自动任务重试。要启用此功能,请将 TASK_AUTO_RETRY_ATTEMPTS 设置为大于 0 的值。
使用错误通知的任务会发送有关每次失败的重试尝试的通知。有关更多信息,请参阅 配置发送错误通知的任务。
当您在账户、数据库或架构级别设置 TASK_AUTO_RETRY_ATTEMPTS 参数值时,系统将在修改对象包含的任务下次计划运行期间为其应用更改。
手动执行任务¶
EXECUTE TASK 命令手动触发任务的单次运行。此 SQL 命令在测试新的或修改的任务时非常有用,可在将这些任务用于在生产环境中执行 SQL 代码之前对其进行测试。
直接在脚本或存储过程中调用此 SQL 命令。此外,此命令支持在外部数据管道中集成任务。任何能对您的 Snowflake 账户进行身份验证并授权 SQL 操作的第三方服务均可执行 EXECUTE TASK 命令,以运行任务。
查看账户的任务历史记录¶
可以使用 SQL 或 Snowsight 来查看账户的任务历史记录。要在 Snowsight 中查看任务历史记录,请参阅 查看 Snowsight 中的任务和任务图。有关所需权限的信息,请参阅 查看任务历史记录。
要查看单项任务的运行历史记录,请执行以下操作:
- SQL:
查询 TASK_HISTORY 表函数(在 Snowflake Information Schema 中)。
要查看当前计划的或正在执行的任务图运行的详细信息,请执行以下操作:
- SQL:
查询 CURRENT_TASK_GRAPHS 表函数(在 Snowflake Information Schema 中)。
要查看过去 60 分钟内成功执行、失败或取消的任务图运行历史记录,请执行以下操作:
- SQL:
查询 COMPLETE_TASK_GRAPHS 表函数(在 Snowflake Information Schema 中)。
查询 COMPLETE_TASK_GRAPHS 视图 视图(在 Account Usage 中)。
任务成本¶
与运行任务以执行 SQL 代码相关的费用因任务的计算资源来源而异:
- 由用户管理的仓库
Snowflake 会根据任务运行时的仓库使用情况(类似于在客户端或 Snowflake Web 界面中执行相同 SQL 语句的仓库使用情况),向您的账户收取 credit 使用量。每秒 credit 计费和仓库自动暂停功能可以让您灵活地从较大的大小开始,然后调整大小以匹配您的工作负载。
- 无服务器计算模型
Snowflake 根据计算机资源使用情况向您的账户计费。费用根据资源的总使用量(包括云服务使用量)计算,衡量方式是 计算小时 Credit 使用量。计算小时的成本根据仓库规模和查询运行时而变化。有关更多信息,请参阅 无服务器 Credit 使用量 或 查询:任务总成本。
Snowflake 分析任务历史记录中的任务运行情况,动态确定无服务器计算资源的正确大小和数量。由于 Snowflake 自动缩放资源以管理任务运行,因此运行任务的成本按比例扩缩。为了覆盖无服务器计算资源的管理成本,Snowflake 对资源消耗采用了 1.2 倍的系数。
要了解任务消耗了多少 credit,请参阅 `Snowflake 服务使用表<https://www.snowflake.com/legal-files/CreditConsumptionTable.pdf>`_ 中的“无服务器功能 credit 表”。
在创建任务时,考虑以下最佳实践来优化成本:
将 SCHEDULE 设置为以较低频率运行。
使用 auto-suspend 和 auto-retry 参数来防止在失败任务上浪费资源。
为无服务器功能创建预算和支出限制警报。有关更多信息,请参阅 通过 Budgets 监控 Credit 使用量。
要检索特定任务的当前 Credit 使用量,请查询 SERVERLESS_TASK_HISTORY 表函数。以任务所有者的身份执行以下语句,其中
<database_name>
is the database that contains the task and<task_name>
为任务名称:SET num_credits = (SELECT SUM(credits_used) FROM TABLE(<database_name>.information_schema.serverless_task_history( date_range_start=>dateadd(D, -1, current_timestamp()), date_range_end=>dateadd(D, 1, current_timestamp()), task_name => '<task_name>') ) );
要检索所有 Serverless Task 的当前 Credit 使用量,请查询 SERVERLESS_TASK_HISTORY 视图。以账户管理员的身份,执行以下语句:
SELECT start_time, end_time, task_id, task_name, credits_used, schema_id, schema_name, database_id, database_name FROM snowflake.account_usage.serverless_task_history ORDER BY start_time, task_id;
了解系统服务¶
Snowflake 使用任务所有者(即拥有任务的 OWNERSHIP 权限的角色)的权限运行任务,但任务运行不会与用户关联。相反,每次运行都由系统服务执行。任务与特定用户分离,以避免用户被删除、因身份验证问题而被锁定或角色被移除时可能出现的复杂情况。
无论任务是计划任务,还是由另一个具有 OPERATE 权限的角色通过 EXECUTE TASK 手动运行,任务均以任务所有者的权限执行。
由于任务运行与用户分离,任务运行的查询历史记录与系统服务相关联。SYSTEM 并非账户中的用户;而是一项后台服务。服务。因此,此服务没有用户凭据,也没有任何个人(无论是 Snowflake 人员还是您账户中的个人)可以使用期身份。系统服务的活动仅限于您的账户。该服务内置与其他操作相同的加密保护和其他安全协议。
任务 DDL¶
为了支持创建和管理任务,Snowflake 提供了以下一组特殊 DDL 命令:
此外,提供商可以使用以下标准访问控制 DDL,来查看、授予或撤消对 ELT 所需数据库对象的访问权限:
任务函数¶
为支持检索任务相关信息,Snowflake 提供以下一组 SQL 函数:
任务安全性¶
访问控制权限¶
创建任务¶
要创建任务,角色必须至少具有以下权限:
对象 |
权限 |
备注 |
---|---|---|
账户 |
EXECUTE MANAGED TASK |
仅对依赖于无服务器计算资源的任务是必需的。 |
数据库 |
USAGE |
|
架构 |
USAGE、CREATE TASK |
|
仓库 |
USAGE |
仅对依赖由用户管理的仓库提供计算资源的任务是必需的。 |
拥有任务所有权¶
创建任务后,任务所有者必须具有以下权限才能运行任务:
对象 |
权限 |
备注 |
---|---|---|
账户 |
EXECUTE TASK |
运行角色拥有的任何任务所需要的。撤销某个角色的 EXECUTE TASK 权限会阻止所有后续任务在该角色下运行。 |
账户 |
EXECUTE MANAGED TASK |
仅对依赖于无服务器计算资源的任务是必需的。 |
数据库 |
USAGE |
|
架构 |
USAGE |
|
任务 |
OWNERSHIP |
|
仓库 |
USAGE |
仅对依赖由用户管理的仓库提供计算资源的任务是必需的。 |
此外,该角色必须具有运行任务执行的 SQL 语句所需的权限。
查看任务历史记录¶
要查看任务,您必须具有以下一个或多个权限:
ACCOUNTADMIN 角色
任务的 OWNERSHIP 权限
全局 MONITOR EXECUTION 权限
恢复或暂停任务¶
除任务所有者外,具有任务 OPERATE 权限的角色还可以暂停或恢复任务。此角色必须具有包含任务的数据库和架构的 USAGE 权限。不需要其他任何权限。
在恢复任务时,Snowflake 会验证任务所有者角色是否具有 拥有任务所有权 (本主题内容)中所列出的权限。
创建任务管理员角色¶
为简化使用,我们建议创建自定义角色(例如 taskadmin
)并为该角色分配 EXECUTE TASK 权限。然后,任何可以授予权限的角色(例如 SECURITYADMIN 或任何具有 MANAGE GRANTS 权限的角色)均可将此自定义角色授予任何任务所有者角色,以允许其修改自己的任务。要移除任务所有者角色执行任务的能力,只需从任务所有者角色撤消该自定义角色即可。请注意,如果选择不创建此自定义角色,账户管理员必须撤消任务所有者角色的 EXECUTE TASK 权限。
例如,创建名为 taskadmin
的自定义角色,并授予该角色 EXECUTE TASK 权限。将 taskadmin
角色分配给名为 myrole
的任务所有者角色:
USE ROLE securityadmin;
CREATE ROLE taskadmin;
-- set the active role to ACCOUNTADMIN before granting the account-level privileges to the new role
USE ROLE accountadmin;
GRANT EXECUTE TASK, EXECUTE MANAGED TASK ON ACCOUNT TO ROLE taskadmin;
-- set the active role to SECURITYADMIN to show that this role can grant a role to another role
USE ROLE securityadmin;
GRANT ROLE taskadmin TO ROLE myrole;
有关创建自定义角色和角色层次结构的更多信息,请参阅 配置访问控制。
删除任务所有者角色¶
删除给定任务的所有者角色(即具有该任务的 OWNERSHIP 权限的角色)时,该任务将被删除所有者角色的角色“收回”。这可确保所有权转移到更接近角色层次结构根节点的角色。在任务被收回时,它会自动暂停,即当前进行中的所有执行都将完成处理,但在新所有者显式恢复任务之前,不会计划新的执行。采取这种处理方式的原因在于,在移除角色时,防止拥有特定角色访问权限的用户留下突然以更高权限执行的任务。
如果在任务运行过程中,用于执行该任务的角色被删除,则该任务将在已删除的角色下完成处理。
工作流程¶
本部分简要概述了任务设置工作流程。
完成 创建任务管理员角色 (本主题内容)中的步骤,创建可用于执行以下步骤中的命令的角色。
使用 CREATE TASK 创建任务。默认情况下,该任务处于暂停状态。
备注
在创建任务:emph:之前,验证将在任务中引用的 SQL 语句是否按预期执行。任务旨在自动执行已经过全面测试的 SQL 语句或存储过程。
执行 ALTER TASK ... RESUME 以允许根据任务定义中指定的参数运行任务。