我很高兴宣布 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”
🚏 约束文件 (Constraints): https://github.com/apache/airflow/tree/constraints-2.10.0
Airflow 现在默认收集遥测 (Telemetry) 数据
随着 Airflow 2.10.0 的发布,我们引入了基础遥测数据的收集功能,具体说明见此处。这些数据将发挥至关重要的作用,帮助 Airflow 维护者更深入地了解 Airflow 在各种部署环境中的使用情况。从这些信息中获得的洞察对于指导补丁、小版本发布和安全修复的优先级具有无价的价值。此外,这些数据还将为开发路线图的关键决策提供信息,确保 Airflow 持续根据社区需求进行发展。
对于不希望参与数据收集的用户,可以通过将 [usage_data_collection] enabled 选项设置为 False,或使用 SCARF_ANALYTICS=false 环境变量轻松选择退出。
多执行器配置(前称“混合执行”)
每种执行器都有其独特的优点和缺点,通常需要在延迟、隔离和计算效率之间取得平衡。传统上,一个 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 类,可以作为任务的 outlets、inlets 或 DAG 的 schedule 参数的值传递。DatasetAlias 的一个实例会被动态解析为真实的 dataset。下游可以依赖于解析后的 dataset,也可以依赖于别名本身。
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"))
通过 yielding 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 中,当任务实例被重试或清除时,其执行历史记录会得到保留。您可以通过在 Grid 视图中单击任务实例来查看此历史记录,从而访问每次尝试的信息,例如日志、执行时长以及任何失败。此功能提高了任务执行过程的透明度,使您更容易排除故障和分析您的 DAG。

历史记录显示了每次特定运行的任务实例属性的最终值。在日志页面,您还可以访问任务实例每次尝试的日志。此信息对于调试非常有用。

数据集 UI 增强
数据集页面已经过改进,包含了重点展示数据集事件的部分,并增加了额外的详细信息,例如 extras、消费 DAG 和生产任务。
现在,我们在新标签页中提供了独立的依赖图和数据集列表页面,增强了用户体验。

数据集事件现在在每个 DAG 运行的“详情”选项卡和 DAG 图中都有显示。

在图中切换数据集显示
我们现在可以在 DAG 图中切换数据集的显示

DAG 图视图中的数据集条件
我们现在以逻辑门的形式显示图视图。带有实际事件的数据集会以不同的边框高亮显示,使得更容易查看是什么触发了选定的运行。

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

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

其他新特性
由于新特性太多无法全部列出,这里仅介绍其中一些有趣的新特性
- 可延迟算子 (Deferrable operators) 现在可以直接从触发器 (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!
分享