我很高兴地宣布,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 配置中传入逗号分隔的列表。列表中的第一个执行器将作为该环境的默认执行器。

$$[core] executor = 'LocalExecutor,CeleryExecutor'$$

为了方便 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 类,可在任务的 outletsinlets 以及 DAG 的 schedule 中使用。DatasetAlias 实例会在运行时动态解析为真实的数据集。下游任务既可以依赖解析后的真实数据集,也可以直接依赖别名本身。

DatasetAlias 仅包含一个参数 name,用于唯一标识数据集。任务必须先将别名声明为 outlet,并使用 outlet_eventsyield 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 依赖图的图例中看到数据集别名,并配以对应的图标/颜色。

DAG Dependencies graph

Airflow UI 深色模式

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

Airflow Dark mode

Airflow Light mode

任务实例历史

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

Task instance history

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

Task instance history

数据集 UI 增强

数据集页面经过重新设计,新增了专注的数据集事件区域,并展示额外信息,如扩展字段、使用该数据集的 DAG、产生该数据集的任务等。Dataset list

我们在新标签页中分别提供了“依赖图”和“数据集列表”页面,从而提升了用户体验。

Dataset dependency graph

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

Dataset list

在图中切换数据集显示

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

Dataset toggle button on Dataset toggle button off

DAG 图视图中的数据集条件

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

Render dataset conditions in graph view

DAG 图中的数据集事件信息

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

Dataset event info

按需重新解析 DAG

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

DAG Reparsing button on DAG list page DAG Reparsing button on DAG detail page

其他新特性

下面仅列举了一小部分有趣的新特性,完整功能实在太多,难以一一列出。

  • 可延迟(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 时获得愉快的体验!

分享

阅读更多

Apache Airflow 3.2.0:大规模数据感知工作流

Rahul Vats

Apache Airflow 3.2.0 引入了资产分区,用于细粒度的管道编排;支持面向企业规模的多团队部署;提供同步的截止日期警报回调;并在实现完整 Task SDK 分离方面取得持续进展。

Apache Airflow 3.1.0:以人为本的工作流

Kaxil Naik

Apache Airflow 3.1.0 引入了人机交互(Human‑in‑the‑Loop)工作流、支持 17 种语言的国际化、截止日期警报,以及面向数据编排团队的 React 插件系统。