2025 年 Airflow 峰会将于 10 月 07-09 日举行。立即注册以获取早鸟票!

Airflow 的公共接口

Apache Airflow 的公共接口是指 Apache Airflow 中受语义化版本控制的接口和行为的集合。用户通过创建和管理 DAG、管理任务和依赖关系,以及编写新的 Executor、插件、Operator 和 Provider 来扩展 Airflow 功能,从而与 Airflow 的公共接口进行交互。公共接口对于构建自定义工具和与其他系统集成,以及自动化 Airflow 工作流程的某些方面非常有用。

使用 Airflow 公共接口

以下是一些 Airflow 公共接口的示例

  • 当你编写自己的 Operator 或 Hook 时。这通常在你没有适合你的用例的 Hook 或 Operator 时完成,或者在你需要自定义现有 Hook 或 Operator 的行为时完成。

  • 编写新的插件,用于扩展 Airflow 在 DAG 构建块之外的功能。Secrets、Timetable、Trigger、Listener 都是此类功能的示例。这通常由管理 Airflow 实例的用户完成。

  • 通过Provider 打包自定义的 Operator、Hook 和插件,并将它们一起发布 - 这通常由那些打算为 Airflow 集成的外部服务或应用程序提供一组可重用功能的人完成。

  • 使用 TaskFlow API 编写任务

  • 依赖 Airflow 对象的行为一致性

“公共接口”的一个方面是扩展或使用 Airflow 的 Python 类和函数。下面提到的类和函数在 Airflow 的 MAJOR 版本内可依赖于保持向后兼容的签名和行为。另一方面,以 _(也称为 Python 保护方法)和 __(也称为 Python 私有方法)开头的类和方法不属于 Airflow 的公共接口,并且可能随时更改。

你也可以通过稳定的 REST API(基于 OpenAPI 规范)使用 Airflow 的公共接口。对于特定需求,你也可以使用Airflow 命令行接口 (CLI),尽管其行为细节(例如输出格式和可用标志)可能会发生变化,因此如果你想以编程方式依赖它们,建议使用稳定的 REST API。

为 DAG 作者使用公共接口

DAGs

DAG 是 Airflow 的核心实体,代表一个周期性工作流。你可以在 DAG 文件中实例化 DAG 类来创建一个 DAG。你也可以通过 DagBag 类实例化它们,该类从文件或文件夹中读取 DAG。DAG 还可以通过 Param 类指定参数。

Airflow 有一组示例 DAG,你可以使用它们来学习如何编写 DAG

你可以在DAGs中阅读更多关于 DAG 的信息。

这里提供了 DAG 中使用的模块参考

DagRun 的属性也可以在模板等地方被引用。

Operator

基类 BaseOperatorBaseSensorOperator 是公共的,可以被扩展以创建新的 Operator。

在 Apache Airflow 中发布的 BaseOperator 的子类在行为上是公共的,但在结构上不是。也就是说,Operator 的参数和行为受语义化版本控制,但其方法可能随时更改。

任务实例

任务实例是 DAG 中单个任务(在 DAG Run 中)的独立运行。它们通过 TaskInstance 类在传递给 Operator 的 execute 方法的上下文中可用。

任务实例 Key

任务实例 Key 是 DAG 中(在 DAG Run 中)任务实例的唯一标识符。Key 是一个包含 dag_idtask_idrun_idtry_numbermap_index 的元组。可以通过 key() 获取任务实例的 Key。

Hook

Hook 是与外部平台和数据库交互的接口,尽可能实现通用接口,并作为 Operator 的构建块。所有 Hook 都派生自 BaseHook

Airflow 有一组被视为公共的 Hook。你可以通过扩展它们来自由扩展其功能。

Airflow 公共工具

编写或扩展 Hook 和 Operator 时,DAG 作者和开发者可以使用以下类

  • Connection 类,它提供对外部服务凭据和配置的访问。

  • Variable 类,它提供对 Airflow 配置变量的访问。

  • XCom,用于访问任务间通信数据。

你可以在 管理连接变量XComs 中阅读更多关于 Airflow 公共工具的信息。

这里提供了用于这些工具的类参考

公共异常

编写自定义 Operator 和 Hook 时,你可以处理和抛出 Airflow 暴露的公共异常。

公共工具类

使用公共接口扩展 Airflow 功能

Airflow 使用插件机制来扩展 Airflow 平台功能。它们允许扩展 Airflow UI,同时也是公开以下自定义(Trigger、Timetable、Listener 等)的方式。Provider 还可以实现插件端点并自定义 Airflow UI 和这些自定义功能。

你可以在插件中阅读更多关于插件的信息。你可以在从 Airflow Web UI 自定义 Apache 视图中阅读如何扩展 Airflow UI。请注意,有一些简单的 UI 自定义不需要插件 - 你可以在自定义 UI中阅读更多相关信息。

以下是使用插件扩展 Airflow 的方式

Trigger

Airflow 使用 Trigger 实现 asyncio 兼容的可推迟 Operator(Deferrable Operator)。所有 Trigger 都派生自 BaseTrigger

Airflow 有一组被视为公共的 Trigger。你可以通过扩展它们来自由扩展其功能。

你可以在可推迟 Operator 和 Trigger中阅读更多关于 Trigger 的信息。

Timetable

自定义 Timetable 实现为 Airflow 的调度器提供额外逻辑,以用内置调度表达式无法实现的方式调度 DAG Run。所有 Timetable 都派生自 Timetable

Airflow 有一组被视为公共的 Timetable。你可以通过扩展它们来自由扩展其功能。

你可以在使用 Timetable 自定义 DAG 调度中阅读更多关于 Timetable 的信息。

Listener

Listener 使你能够响应 DAG/任务 生命周期事件。

这是通过 ListenerManager 类实现的,该类提供了可以实现来响应 DAG/任务 生命周期事件的 Hook。

在 2.5 版本中添加: Listener 公共接口已在 2.5 版本中添加。

你可以在Listener中阅读更多关于 Listener 的信息。

使用公共接口与外部服务和应用集成

Airflow 中的任务可以通过 Hook 和 Operator 协调外部服务。Airflow 的核心功能(例如身份验证)也可以扩展以利用外部服务。你可以在Provider Provider 以及它们可以在Provider 中提供的核心扩展 中阅读更多相关信息。

Executor

Executor 是任务实例运行的机制。所有 Executor 都派生自 BaseExecutor。Airflow 内置了多种 Executor 实现,每种都有自己独特的特性和能力。

Executor 接口本身(BaseExecutor 类)是公共的,但内置的 Executor 不是(例如 KubernetesExecutor、LocalExecutor 等)。这意味着,以 KubernetesExecutor 为例,我们可能在 Airflow 次要或补丁版本中更改 KubernetesExecutor,这可能会破坏继承 KubernetesExecutor 的 Executor。这对于 Airflow 开发者来说是必要的,以便他们有足够的自由继续改进我们提供的 Executor。因此,如果你想修改或扩展一个内置 Executor,你应该将完整的 Executor 代码整合到你的项目中,这样这些更改就不会破坏你的派生 Executor。

你可以在Executor中阅读更多关于 Executor 以及如何编写自己的 Executor 的信息。

在 2.6 版本中添加: Executor 接口在 Airflow 中存在已久,但在 2.6 之前,代码库中的其他地方存在针对特定 Executor 的代码。从 2.6 版本开始,Executor 完全解耦,这意味着 Airflow 核心不再需要了解特定 Executor 的行为。在 Airflow 2.6 之前,你虽然可以成功实现自定义 Executor,并且许多人也做到了,但存在一些偏好内置 Executor 的硬编码行为,并且自定义 Executor 无法提供内置 Executor 所具备的全部功能。

Secrets Backend

Airflow 可以配置为依赖 Secrets Backend 来检索 ConnectionVariable。所有 Secrets Backend 都派生自 BaseSecretsBackend

所有 Secrets Backend 实现都是公共的。你可以扩展其功能。

你可以在Secrets Backend中阅读更多关于 Secret Backend 的信息。你还可以在Secret backend中找到社区 Provider 中实现的所有可用 Secrets Backend。

Auth Manager

Auth Manager 负责 Airflow 中的用户身份验证和用户授权。所有 Auth Manager 都派生自 BaseAuthManager

Auth Manager 接口本身(BaseAuthManager 类)是公共的,但 Auth Manager 的不同实现不是(例如 FabAuthManager)。

你可以在Auth manager中阅读更多关于 Auth Manager 以及如何编写自己的 Auth Manager 的信息。

Connection

创建 Hook 时,你可以添加自定义 Connection。你可以在Connections中阅读更多关于 Connection 的信息,以了解社区 Provider 中实现的可用 Connection。

额外链接

创建 Hook 时,你可以添加自定义额外链接,这些链接在任务运行时显示。你可以在Extra Links中了解更多关于额外链接的信息,其中也展示了社区 Provider 中实现的可用额外链接。

日志记录与监控

你可以扩展 Airflow 写入日志的方式。你可以在日志记录与监控中了解更多关于日志写入的信息。

Writing logs 其中也展示了社区 Provider 中实现的可用日志写入器。

Decorator

DAG 作者可以使用 Decorator 采用TaskFlow概念编写 DAG。所有 Decorator 都派生自 TaskDecorator

Airflow 有一组被视为公共的 Decorator。你可以通过扩展它们来自由扩展其功能。

你可以在创建自定义 @task Decorator中阅读更多关于创建自定义 Decorator 的信息。

电子邮件通知

Airflow 内置了发送电子邮件通知的方式,并且允许通过添加自定义电子邮件通知类来扩展它。你可以在电子邮件配置中阅读更多关于电子邮件通知的信息。

通知

Airflow 内置了一种可扩展的方式,使用各种 on_*_callback 发送通知。你可以在创建 Notifier中阅读更多关于通知的信息。

集群策略

集群策略是动态地将集群范围的策略应用于正在解析的 DAG 或正在执行的任务的方式。你可以在集群策略中阅读更多关于集群策略的信息。

血缘关系

Airflow 可以帮助跟踪数据的来源、数据的变化以及数据随时间的移动。你可以在血缘关系中阅读更多关于血缘关系的信息。

哪些不属于 Apache Airflow 的公共接口?

本文档中未提及的所有内容均应视为非公共接口。

有时在其他应用中,这些组件可能被依赖以保持向后兼容性,但在 Airflow 中,它们不属于公共接口,并且可能随时更改。

  • 数据库结构 被视为内部实现细节,你不应假定其结构将保持向后兼容。

  • Web UI 正在持续演进,对 HTML 元素没有向后兼容性保证。

  • 除本文档中明确提及的 Python 类外,其他 Python 类均被视为内部实现细节,你不应假定它们将保持向后兼容。

此条目是否有帮助?