在 Azure Databricks 作业中有条件地运行任务

默认情况下,作业任务会在其依赖项已运行且全部成功时运行,但你也可以将 Azure Databricks 作业中的任务配置为仅在满足特定条件时才会运行。 Azure Databricks 作业支持以下方法来有条件地运行任务:

  • 可以指定 Run if 依赖项,以基于任务依赖项的运行状态运行任务。 例如,可以使用 Run if 运行任务(即使其部分或所有依赖项失败),从而允许作业从故障中恢复并继续运行。
  • If/else 条件 任务用于基于布尔表达式的结果运行作业 DAG 的一部分。 If/else condition 任务允许向作业添加分支逻辑。 例如,仅当上游引入任务添加新数据时运行转换任务。 否则运行数据处理任务。

添加任务的 Run if 条件

编辑具有一个或多个依赖项的任务时,可以配置Run if条件。 要将条件添加到任务,请从任务配置的“Run if dependencies”下拉菜单中选择条件。 完成所有任务依赖项后,将会对 Run if 条件进行评估。 还可以在添加具有一个或多个依赖项的新任务时添加Run if条件。

Run if条件选项

可以将以下Run if条件添加到任务:

  • 全部成功:所有依赖项都已运行并成功。 这是运行任务的默认条件。 如果未满足条件,任务会标记为 Upstream failed
  • 至少一个成功:至少有一个依赖项成功。 如果未满足条件,任务会标记为 Upstream failed
  • 无失败:没有依赖项失败,并且至少运行了一个依赖项。 如果未满足条件,任务会标记为 Upstream failed
  • 全部完成:任务在运行所有依赖项后运行,而不考虑依赖运行的状态。 此条件允许定义运行的任务,而不取决于其依赖任务的结果。
  • 至少一个失败:至少有一个依赖项失败。 如果未满足条件,任务会标记为 Excluded
  • 全部失败:所有依赖项都失败。 如果未满足条件,任务会标记为 Excluded

注意

  • 如果配置为处理故障的任务不满足 Run if 条件,则会标记为 Excluded。 排除的任务会跳过,并被视为成功。
  • 如果排除所有任务依赖项,也会排除该任务,不考虑其Run if条件。
  • 如果取消任务运行,取消会传播到下游任务,并将运行具有处理故障的 Run if 条件的任务,例如在取消任务运行后验证清理任务运行。

Azure Databricks 作业如何确定作业运行状态?

Azure Databricks 作业可根据作业的叶任务结果确定作业运行是否成功。 叶任务是无下游依赖项的任务。 作业运行可以有以下三个结果之一:

  • 成功:所有任务都成功。
  • 成功但失败:一些任务失败,但所有叶任务都成功。
  • 失败:一个或多个叶任务失败。

使用 If/else condition 任务向作业添加分支逻辑

使用 If/else condition 任务基于布尔表达式运行作业 DAG 的一部分。 表达式由布尔运算符和一对操作数组成,其中操作数可以使用作业和任务参数变量,或使用任务值来引用作业或任务状态。

注意

  • 数字和非数字值的处理方式不同,具体取决于布尔运算符:
    • ==!= 运算符可对其操作数执行字符串比较。 例如,12.0 == 12 计算为 false。
    • >>=<= 运算符可对其操作数执行数值比较。 例如,12.0 >= 12 计算结果为 true,10.0 >= 12 则计算为 false。
    • 在引用操作数中的任务值时,仅允许使用数值、字符串和布尔值。 任何其他类型将会导致条件表达式失败。 非数值类型将会序列化为字符串,并被视为 If/else condition 表达式中的字符串。 例如,如果任务值设置为布尔值,则会将其序列化为 "true""false"

创建作业或在现有作业中编辑任务时,可以添加 If/else condition 任务。 要配置 If/else condition 任务,请:

  1. 在“类型”下拉菜单中,选择“If/else condition”。
  2. 在第一个“条件”文本框中,输入要计算的操作数。 操作数可以引用作业、任务参数变量或任务值。
  3. 从下拉菜单中选择布尔运算符。
  4. 在第二个“条件”文本框中,输入用于计算条件的值。

要在 If/else condition 任务上配置依赖项,请:

  1. 在 DAG 视图中选择 If/else condition 任务,然后单击“+ 添加任务”
  2. 输入任务的详细信息后,单击“依赖于”,然后选择“<task-name> (true)”,其中 <task-name>If/else condition 任务的名称。
  3. 对计算为 false 的条件重复上述操作。

例如,假设你有一个名为 process_records 的任务,该任务在名为 bad_records 的值中维护无效记录的计数,并且你希望根据是否找到无效记录来进行分支处理。 要将此逻辑添加到工作流,可以使用表达式(例如 {{tasks.process_records.values.bad_records}} > 0)创建 If/else condition 任务。 然后,可以根据条件的结果添加依赖任务。

在包含 If/else condition 任务的作业运行完成后,可以在 UI 中查看作业运行详细信息时,查看表达式的结果和表达式计算的详细信息。