我很自豪地宣布 Apache Airflow 2.0.0 已经发布。

完整的变更日志大约有 3000 行(已经排除了所有反向移植到 1.10 的内容),所以现在我将简单地分享 2.0.0 相对于 1.10.14 的一些主要功能

编写 DAG 的新方法:TaskFlow API (AIP-31)

(在 2.0.0alpha 中称为函数式 DAG。)

现在 DAG 的编写更加友好,尤其是在使用 PythonOperator 时。依赖关系处理得更清晰,XCom 也更易于使用。

在此处阅读更多内容

TaskFlow API 教程
TaskFlow API 文档

DAG 现在可以展现的形式的快速预览

from airflow.decorators import dag, task
from airflow.utils.dates import days_ago

@dag(default_args={'owner': 'airflow'}, schedule_interval=None, start_date=days_ago(2))
def tutorial_taskflow_api_etl():
   @task
   def extract():
       return {"1001": 301.27, "1002": 433.21, "1003": 502.22}

   @task
   def transform(order_data_dict: dict) -> dict:
       total_order_value = 0

       for value in order_data_dict.values():
           total_order_value += value

       return {"total_order_value": total_order_value}

   @task()
   def load(total_order_value: float):

       print("Total order value is: %.2f" % total_order_value)

   order_data = extract()
   order_summary = transform(order_data)
   load(order_summary["total_order_value"])

tutorial_etl_dag = tutorial_taskflow_api_etl()

完全指定的 REST API (AIP-32)

我们现在有一个完全支持的、不再是实验性的 API,它具有全面的 OpenAPI 规范

在此处阅读更多内容

REST API 文档.

调度器性能的大幅提升

作为 AIP-15(调度器 HA+性能)的一部分以及 Kamil 所做的其他工作,我们显著提高了 Airflow 调度器的性能。它现在启动任务的速度快得多,快得多。

在 Astronomer.io,我们对调度器进行了基准测试,速度非常快(我们不得不三次检查这些数字,因为我们一开始并不太相信!)

调度器现在与 HA 兼容 (AIP-15)

现在可以支持运行多个调度器实例。这对于弹性(以防调度器发生故障)和调度性能都非常有用。

要充分利用此功能,您需要 Postgres 9.6+ 或 MySQL 8+(恐怕 MySQL 5 和 MariaDB 无法与多个调度器一起工作)。

无需任何配置或其他设置即可运行多个调度器 - 只需在其他地方启动一个调度器(确保它可以访问 DAG 文件),它将通过数据库与您现有的调度器进行协作。

有关更多信息,请阅读 调度器 HA 文档

任务组 (AIP-34)

SubDAG 通常用于在 UI 中对任务进行分组,但它们在执行行为方面存在许多缺点(主要是它们只并行执行单个任务!)。为了改善这种体验,我们引入了“任务组”:一种组织任务的方法,它提供了与子 DAG 相同的分组行为,而没有任何执行时的缺点。

SubDAG 现在仍然可以使用,但我们认为以前对 SubDAG 的任何使用现在都可以替换为任务组。如果您发现有任何不适用的示例,请在 GitHub 上打开一个 issue 告诉我们

有关更多信息,请查看 任务组文档

重新设计的 UI

我们对 Airflow UI 进行了 视觉刷新 并更新了一些样式。

Airflow 2.0’s new UI

我们还添加了一个在图形视图中自动刷新任务状态的选项,因此您不再需要持续按刷新按钮了 :)。

请查看文档中的屏幕截图了解更多信息。

智能传感器,以减少传感器的负载 (AIP-17)

如果您在 Airflow 集群中大量使用传感器,您可能会发现即使在“重新调度”模式下,传感器执行也会占用集群的很大一部分。为了改善这一点,我们添加了一种名为“智能传感器”的新模式。

此功能处于“早期访问”状态:它已经过 Airbnb 的充分测试,并且是“稳定”/可用的,但我们保留在未来版本中对其进行向后不兼容更改的权利(如果必须)。我们会尽力避免!

智能传感器文档中阅读更多内容。

简化的 KubernetesExecutor

对于 Airflow 2.0,我们以一种更快、更容易理解并且对 Airflow 用户更灵活的方式重新设计了 KubernetesExecutor。用户现在可以访问完整的 Kubernetes API 来创建 .yaml pod_template_file,而不是在他们的 airflow.cfg 中指定参数。

我们还将 executor_config 字典替换为 pod_override 参数,该参数采用 Kubernetes V1Pod 对象进行 1:1 设置覆盖。这些更改从 KubernetesExecutor 中删除了三千多行代码,这使其运行速度更快,并减少了潜在的错误。

在此处阅读更多内容

关于 pod_template_file 的文档
关于 pod_override 的文档

Airflow 核心和提供程序:将 Airflow 分割为 60 多个包

Airflow 2.0 不是一个单体的“一统天下”包。我们已将 Airflow 分割为核心和 61 个(目前)提供程序包。每个提供程序包都用于特定的外部服务(Google、Amazon、Microsoft、Snowflake)、数据库(Postgres、MySQL)或协议(HTTP/FTP)。现在,您可以从“构建”块创建自定义 Airflow 安装,并且仅选择您需要的内容,还可以添加您可能拥有的任何其他要求。一些常用的提供程序会自动安装(ftp、http、imap、sqlite),因为它们是常用的。当您在安装 Airflow 时选择适当的额外内容时,会自动安装其他提供程序。

提供程序架构应该使使用正确的 Python 依赖项集获得完全自定义但一致的运行时变得更加容易。

但这还不是全部:您可以编写自己的自定义提供程序,并以可管理的方式添加诸如自定义连接类型、连接表单的自定义设置以及运算符的额外链接之类的东西。您可以构建自己的提供程序,并将其作为 Python 包安装,并且您的自定义设置可以在 Airflow UI 中可见。

我们自己的 Jarek Potiuk 在 Jarek 的博客上详细介绍了 提供程序

关于提供程序概念和编写自定义提供程序的文档
关于所有可用的提供程序包的文档

安全

作为 Airflow 2.0 工作的一部分,人们有意识地关注安全并减少暴露的领域。这以不同的形式表现在不同的功能领域。例如,在新的 REST API 中,所有操作现在都需要授权。同样,在配置设置中,现在需要指定 Fernet 密钥。

配置

airflow.cfg 文件形式的配置已在不同的部分(特别是围绕“核心”)中进一步合理化。此外,大量配置选项已被弃用或移动到特定于各个组件的配置文件,例如用于 Kubernetes 执行相关配置的 pod-template-file。

感谢大家

我们尽力减少了破坏性更改,并在代码中提供了弃用路径,特别是在 DAG 中调用的任何内容的情况下。也就是说,请通读 UPDATING.md 以检查哪些内容可能会影响您。例如:我们重新组织了运算符的布局(它们现在都位于 airflow.providers.* 下),但是旧名称应该可以继续工作 - 您只会注意到很多需要修复的 DeprecationWarnings。

非常感谢所有使我们走到这一步的贡献者,排名不分先后:Kaxil Naik、Daniel Imberman、Jarek Potiuk、Tomek Urbaszek、Kamil Breguła、Gerard Casas Saez、Xiaodong DENG、Kevin Yang、James Timmins、Yingbo Wang、Qian Yu、Ryan Hamilton 以及其他数百位不断让 Airflow 变得更好的贡献者。

分享

另请阅读

Apache Airflow 2.5.0:滴答滴答

Ash Berlin-Taylor

我们很自豪地宣布 Apache Airflow 2.5.0 已发布,其中包含许多生活质量方面的改进。

Apache Airflow 2.4.0:数据感知版本

Ash Berlin-Taylor

我们很自豪地宣布 Apache Airflow 2.4.0 已发布,其中包含许多激动人心的改进。