我很自豪地宣布 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 规范
在此处阅读更多内容
调度器性能的大幅提升
作为 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 进行了 视觉刷新 并更新了一些样式。
我们还添加了一个在图形视图中自动刷新任务状态的选项,因此您不再需要持续按刷新按钮了 :)。
请查看文档中的屏幕截图了解更多信息。
智能传感器,以减少传感器的负载 (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 变得更好的贡献者。
分享