计划和编排工作流
Databricks 工作流提供了可用于在 Azure Databricks 上计划和编排数据处理任务的工具。 使用 Databricks 工作流配置 Databricks 作业。
本文介绍了与使用 Databricks 作业管理生产工作负载相关的概念和选择。
什么是 Databricks 作业?
作业是用于在 Azure Databricks 上计划和编排生产工作负载的基本单位。 一个作业由一个或多个任务组成。 通过将任务和作业相结合,可以配置和部署以下对象:
- 自定义逻辑,包括 Spark、SQL、OSS Python、ML 和任意代码。
- 具有自定义环境和库的计算资源。
- 运行工作负载的计划和触发器。
- 任务间控制流的条件逻辑。
作业通过一种程序化的方法来定义任务之间的关系。 Delta Live Tables 管道通过一种声明性方法来定义数据集和转换之间的关系。 可以将 Delta Live Tables 管道作为任务包含在作业中。 请参阅作业的 Delta Live Tables 管道任务。
作业的复杂程度可能各不相同,从运行 Databricks 笔记本的单个任务到运行条件逻辑和依赖关系的数千个任务。
如何配置和运行作业?
可以使用作业 UI、Databricks CLI 或通过调用作业 API 来创建和运行作业。 可以使用 UI 或 API 来修复和重新运行失败或取消的作业。 可以使用 UI、CLI、API 和通知(例如电子邮件、Webhook 目标或 Slack 通知)监视作业运行结果。
如果需要使用基础结构即代码 (IaC) 方法来配置和编排作业,请使用 Databricks 资产捆绑包 (DAB)。 捆绑包可以包含作业和任务的 YAML 定义,使用 Databricks CLI 进行管理,并且可以在不同的目标工作区(如开发、过渡和生产工作区)中共享和运行。 要了解如何使用 DAB 配置和编排作业,请参阅 Databricks 资产捆绑包。
若要了解如何使用 Databricks CLI,请参阅什么是 Databricks CLI?。 若要了解如何使用作业 API,请参阅作业 API。
作业所需的最低配置是什么?
Azure Databricks 上的所有作业都需要以下各项:
- 包含要运行的逻辑的源代码(如 Databricks 笔记本)。
- 一个用来运行该逻辑的计算资源。 该计算资源可以是无服务器计算、经典作业计算或全用途计算。 请参阅配置作业的计算。
- 规定了作业应当在何时运行的指定计划。 (可选)可以省略设置计划并手动触发作业。
- 唯一名称。
注意
如果你在 Databricks 笔记本中开发代码,可以使用“计划”按钮将该笔记本配置为作业。 请参阅创建和管理计划的笔记本作业。
什么是任务?
任务表示在作业中将作为一个步骤运行的逻辑单元。 各个任务的复杂程度各不相同,并且可能包括以下内容:
- 一个笔记本
- JAR
- SQL 查询
- DLT 管道
- 另一个作业
- 控制流任务
可以通过指定任务之间的依赖关系来控制任务的执行顺序。 可将任务配置为按顺序或并行运行。
作业与任务的状态信息和元数据进行交互,但任务范围是隔离的。 你可以使用任务值在计划的任务之间共享上下文。 请参阅使用任务值在任务之间传递信息。
哪些控制流选项可用于作业?
配置作业和作业中的任务时,可以自定义控制整个作业和各个任务的运行方式的设置。 这些选项包括:
触发器类型
配置作业时,必须指定触发器类型。 可从以下触发器类型中进行选择:
也可以选择手动触发作业,但这主要保留用于特定的用例,例如:
- 使用外部编排工具通过 REST API 调用来触发作业。
- 你有一个很少运行的作业,需要人工干预来验证或解决数据质量问题。
- 你正在运行一个只需要运行一次或几次的工作负载,例如迁移。
请参阅 Databricks 作业的触发器类型。
重试
重试次数会指定当特定任务失败并显示了错误消息时,应重新运行该任务的次数。 错误通常是暂时性的,可通过重启来解决。 Azure Databricks 上的一些功能(例如,使用结构化流式处理的架构演化)假设你通过重试来运行作业,以重置环境并允许工作流继续进行。
如果指定了某个任务的重试次数,则在该任务遇到错误时,该任务最多会重启指定的次数。 并非所有作业配置都支持任务重试次数设置。 请参阅设置重试策略。
在连续触发器模式下运行时,Databricks 会按指数退避自动重试。 请参阅如何处理连续作业的故障?
Run if 条件任务
你可以使用 Run if 任务类型为后续任务指定基于其他任务的结果的条件。 将任务添加到作业并指定依赖于上游的任务。 根据这些任务的状态,你可以配置一个或多个要运行的下游任务。 作业支持以下依赖项:
- 全部成功
- 至少一个成功
- 没有一个失败
- 全部完成
- 至少一个失败
- 全部失败
请参阅配置任务依赖项
If/else 条件任务
可以使用 If/else 任务类型指定基于某个值的条件。 请参阅使用 If/else 任务向作业添加分支逻辑。
作业支持你在逻辑中定义的 taskValues
,并允许你将某个任务的计算结果或状态返回到作业环境。 你可以定义基于 taskValues
、作业参数或动态值的 If/else 条件。
Azure Databricks 支持将以下操作数用于条件:
==
!=
>
>=
<
<=
另请参阅:
For each 任务
使用 For each
任务在循环中运行另一个任务,将一组不同的参数传递给任务的每次迭代。
将 For each
任务添加到作业需要定义两个任务:For each
任务和“嵌套任务”。 嵌套任务是为 For each
任务的每次迭代运行的任务,是 Databricks 作业的标准任务类型之一。 支持多种向嵌套任务传递参数的方法。
请参阅在循环中运行参数化 Azure Databricks 作业任务。
持续时间阈值
你可以指定一个持续时间阈值,以便在超过指定的持续时间时发送警告或停止任务或作业。 你可能希望配置此设置的场景示例包括:
- 你有容易陷入挂起状态的任务。
- 你必须在超出了工作流的 SLA 时向工程师发送警告。
- 为了避免意外成本,你希望使配置了大型集群的作业失败。
请参阅配置作业的预期完成时间或超时,以及配置任务的预期完成时间或超时。
并发
大多数作业的默认并发度都配置为 1 个并发作业。 这意味着,如果上一次作业运行在新作业应当触发时尚未完成,则会跳过下一次作业。
存在一些需要提高并发度的用例,但大多数工作负载不需要更改此设置。
有关配置并发度的详细信息,请参阅 Databricks 作业排队和并发设置。
如何监视作业?
借助作业 UI 可以查看作业运行,包括正在进行的运行。 请参阅 Databricks 作业的监视和可观测性。
当作业或任务开始、完成或失败时,你可以接收通知。 可以向一个或多个电子邮件地址或系统目标发送通知。 请参阅针对作业事件添加电子邮件和系统通知。
系统表包含一个 lakeflow
架构,你可以在其中查看与帐户中的作业活动相关的记录。 请参阅作业系统表参考。
你还可以将作业系统表与计费表相联接,以监视整个帐户中的作业成本。 请参阅使用系统表监视作业成本。
限制
存在以下限制:
- 工作区的并发任务运行限制为 2000 个。 在请求不能立即启动的运行时,将返回
429 Too Many Requests
响应。 - 工作区在一小时内可以创建的作业数限制为 10000(包括“运行提交”)。 此限制还会影响 REST API 和笔记本工作流创建的作业。
- 一个工作区最多可包含 12000 个已保存的作业。
- 一个作业最多可以包含 100 个任务。
是否能够以编程方式管理工作流?
Databricks 拥有相关的工具和 API,让你能够以编程方式计划和编排工作流,这包括下列项:
有关开发人员工具的详细信息,请参阅开发人员工具。
使用 Apache AirFlow 协调工作流
可以使用 Apache Airflow 来管理和计划你的数据工作流。 使用 Airflow 可以在 Python 文件中定义工作流,Airflow 将管理工作流的计划和运行。 请参阅使用 Apache Airflow 协调 Azure Databricks 作业。
使用 Azure 数据工厂协调工作流
Azure 数据工厂 (ADF) 是一项云数据集成服务,可用于将数据存储、移动和处理服务组合到自动化数据管道中。 可以使用 ADF 将 Azure Databricks 作业协调为 ADF 管道的一部分。
ADF 还内置支持运行 ADF 管道中以 JAR 打包的 Databricks 笔记本、Python 脚本或代码。
若要了解如何在 ADF 管道中运行 Databricks 笔记本,请参阅在 Azure 数据工厂中使用 Databricks 笔记本活动运行 Databricks 笔记本,然后参阅通过运行 Databricks 笔记本来转换数据。
若要了解如何在 ADF 管道中运行 Python 脚本,请参阅通过在 Azure Databricks 中运行 Python 活动来转换数据。
若要了解如何在 ADF 管道中运行打包在 JAR 中的代码,请参阅通过在 Azure Databricks 中运行 JAR 活动来转换数据。