我很高兴地宣布,Apache Airflow 2.10.0 已正式发布,带来了一系列值得关注的增强功能和新特性,将极大地服务我们的社区。
详情:
📦 PyPI: https://pypi.ac.cn/project/apache-airflow/2.10.0/
📚 文档: https://airflow.org.cn/docs/apache-airflow/2.10.0/
🛠 发布说明: https://airflow.org.cn/docs/apache-airflow/2.10.0/release_notes.html
🐳 Docker 镜像: “docker pull apache/airflow:2.10.0”
🚏 约束: https://github.com/apache/airflow/tree/constraints-2.10.0
Airflow 现在默认收集遥测数据
随着 Airflow 2.10.0 的发布,我们已在此处概述了基本遥测数据的收集方式。该数据对于帮助 Airflow 维护者深入了解 Airflow 在各类部署中的使用情况至关重要。通过对这些信息的分析,可为补丁、次要发布以及安全修复的优先级提供重要依据。同时,这些数据还能为路线图的关键决策提供参考,确保 Airflow 的持续演进符合社区需求。
如果您不希望参与数据收集,可通过将 [usage_data_collection] enabled 选项设置为 False,或使用环境变量 SCARF_ANALYTICS=false 来轻松关闭。
多执行器配置(原称 “Hybrid Execution”)
每个执行器都有其独特的优势和不足,通常在延迟、隔离性和计算效率之间进行平衡。传统上,Airflow 环境只能使用单一执行器,用户必须在不同执行器之间做出取舍,因为没有哪一种执行器能够完美适用于所有类型的任务。
我们推出了一项新特性,允许在同一个 Airflow 环境中并行使用多个执行器。该灵活性使用户能够针对不同任务利用各执行器的特定优势,从而提升整体效率并弥补单一执行器的弱点。用户可以为整个环境设置默认执行器,并在需要时为单独的 DAG 或任务指定特定执行器。
要配置多个执行器,只需在 Airflow 配置中传入逗号分隔的列表。列表中的第一个执行器将作为该环境的默认执行器。
为了方便 DAG 作者,我们还可以为执行器指定别名,这些别名同样可以在执行器配置中使用。
[core]
executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:ShortName'
DAG 作者可以在任务层面指定要使用的执行器
BashOperator(
task_id="hello_world",
executor="ShortName",
bash_command="echo 'hello world!'",
)
@task(executor="KubernetesExecutor")
def hello_world():
print("hello world!")
我们也可以在 DAG 级别指定执行器
def hello_world():
print("hello world!")
def hello_world_again():
print("hello world again!")
with DAG(
dag_id="hello_worlds",
default_args={"executor": "ShortName"}, # Applies to all tasks in the DAG
) as dag:
# All tasks will use the executor from default args automatically
hw = hello_world()
hw_again = hello_world_again()
通过 DatasetAlias 实现动态数据集调度
Airflow 2.10 引入了 DatasetAlias 类,可在任务的 outlets、inlets 以及 DAG 的 schedule 中使用。DatasetAlias 实例会在运行时动态解析为真实的数据集。下游任务既可以依赖解析后的真实数据集,也可以直接依赖别名本身。
DatasetAlias 仅包含一个参数 name,用于唯一标识数据集。任务必须先将别名声明为 outlet,并使用 outlet_events 或 yield Metadata 为其添加事件。
通过 outlet_events 在任务执行期间发出数据集事件
from airflow.datasets import DatasetAlias
@task(outlets=[DatasetAlias("my-task-outputs")])
def my_task_with_outlet_events(*, outlet_events):
outlet_events["my-task-outputs"].add(Dataset("s3://bucket/my-task"))
通过 yield Metadata 在任务执行期间发出数据集事件
from airflow.datasets.metadata import Metadata
@task(outlets=[DatasetAlias("my-task-outputs")])
def my_task_with_metadata():
s3_dataset = Dataset("s3://bucket/my-task}")
yield Metadata(s3_dataset, alias="my-task-outputs")
基于数据集别名的调度有两种方式:可基于 DatasetAlias 本身调度,也可基于真实数据集调度。
with DAG(dag_id="dataset-alias-producer"):
@task(outlets=[DatasetAlias("example-alias")])
def produce_dataset_events(*, outlet_events):
outlet_events["example-alias"].add(Dataset("s3://bucket/my-task"))
with DAG(dag_id="dataset-consumer", schedule=Dataset("s3://bucket/my-task")):
...
with DAG(dag_id="dataset-alias-consumer", schedule=DatasetAlias("example-alias")):
...
数据集别名 UI 增强
现在,用户可以在每个跨 DAG 依赖图的图例中看到数据集别名,并配以对应的图标/颜色。

Airflow UI 深色模式
Airflow 2.10 引入了全新的深色模式功能,旨在通过提供更适合低光环境的视觉主题来提升用户体验。您可以点击导航栏右侧的月牙图标,在浅色模式和深色模式之间切换。


任务实例历史
在 Apache Airflow 2.10.0 中,当任务实例被重试或被清除时,其执行历史会被保留。您可以在网格视图中点击任务实例查看该历史,进而获取每次尝试的日志、执行时长以及失败信息等。此特性提升了对任务执行过程的透明度,便于排查和分析 DAG。

历史记录展示了每一次运行对应的任务实例属性的最终值。在日志页面,还可以查看任务实例每次尝试的日志,这对于调试非常有价值。

数据集 UI 增强
数据集页面经过重新设计,新增了专注的数据集事件区域,并展示额外信息,如扩展字段、使用该数据集的 DAG、产生该数据集的任务等。
我们在新标签页中分别提供了“依赖图”和“数据集列表”页面,从而提升了用户体验。

数据集事件现已同时显示在每次 DAG 运行的 Details(详情)标签页以及 DAG 图中。

在图中切换数据集显示
现在可以在 DAG 图中切换数据集的可见性

DAG 图视图中的数据集条件
我们在图视图中加入了逻辑门的展示。实际产生事件的数据集会以不同的边框进行高亮,帮助用户快速识别触发当前运行的原因。

DAG 图中的数据集事件信息
对于一次 DAG 运行,用户现在可以直接在图视图中看到与其关联的数据集事件。

按需重新解析 DAG
在 2.10 中,用户可以通过 DAG 列表页和 DAG 详情页下方的按钮,按需重新解析 DAG。

其他新特性
下面仅列举了一小部分有趣的新特性,完整功能实在太多,难以一一列出。
- 可延迟(Deferrable)运算符现在可以直接由 Triggerer 执行,而无需经由 Worker。这对某些运算符(例如传感器)尤为高效,能够帮助团队节省时间和成本。
- 关键的执行器日志已集成进任务日志中。如果执行器在启动任务时出现错误,相应的错误信息会出现在任务日志里,从而简化调试过程。
贡献者
感谢所有为本次发布做出贡献的人员,包括 Andrey Anshin、Brent Bovenzi、Daniel Standish、Ephraim Anierobi、Hussein Awala、Jarek Potiuk、Jed Cunningham、Jens Scheffler、Tzu-ping Chung、Vincent,以及其他超过 63 位贡献者!
希望您在使用 Apache Airflow 2.10.0 时获得愉快的体验!
分享