在 2024 年 9 月的 Airflow 峰会上,我们宣布有意将 Apache Airflow 3.0® 作为 Airflow 项目的下一个重要里程碑。我们很高兴地宣布 Airflow 3.0 现已发布!
一个重磅发布,历时四年打造
Airflow 3.0 是 Airflow 历史上最重大的版本——2.0 版本于 2020 年发布,而过去四年里,我们每个季度都会发布增量更新和版本,其中 2.10 版本已于 2024 年第四季度发布。如今,Airflow 的月下载量已超过 3000 万(自 2020 年以来增长了 30 多倍),有 8 万多家组织(自 2020 年的 2.5 万家以来增长)正在使用 Airflow,我们看到自 2.0 版本以来其受欢迎程度有了惊人的增长。
在过去四年里,Airflow 已成长为为各种规模组织中的业务关键型数据工作流提供动力的平台。我们看到 Airflow 的用例呈指数级增长,从最初的 ETL、ELT 和 Reverse ETL,扩展到超过 30% 的 Airflow 用户将其用于 MLOps,以及 10% 的用户用于 GenAI 工作流。Airflow 3 是对这种用例扩展的回应,并且是整个企业范围内数据应用开发的标准。
以下是一些亮点
-
Airflow 3 对于数据从业者而言显著更容易使用,并采纳了他们对 Airflow 关键变更的主要请求。早期用户对新版基于 React 的 UI、DAG 版本控制和改进的补填(Backfill)支持等功能的反应非常积极。当我在最近的 Airflow 聚会中演示这些功能时,看到数据工程师的反应,我感到非常激动。
-
在资产导向型工作流和任务导向型工作流之间无缝切换的 UI 体验非常棒。Airflow 再次让开发者选择他们想要如何开发和导航,而不施加任何限制。
-
事件驱动调度(Event Driven Scheduling)的引入使 Airflow 能够与消息提供商无缝集成,并对 Airflow 外部发生的事件和数据资产更新做出反应。
-
引入任务执行接口(Task Execution Interface)和任务 SDK(Task SDKs)带来的重大架构变更,使得安全模型更加强大,包括在多云、混合云和本地数据中心部署中实现安全、可扩展的执行。
这是 Airflow 社区 300 多名开发者数月以来不懈努力、共同协作的成果,我为能成为这个出色团队的一员感到无比自豪。以下是关于此版本的更多详细信息。
高度需求的用户体验功能
DAG 版本控制
基于年度 Airflow 调查,DAG 版本控制一直是 Airflow 中最受用户请求的功能。在 Airflow 3 中,DAG 的运行将基于启动时的版本一直到完成,即使在新版本上传后该 DAG 仍在运行中。UI 中的所有 DAG 运行现在都与其运行时的 DAG 版本相关联,包括任务结构、代码、日志等。这些功能在以下两个 AIP 中进行了描述:改进 DAG 历史记录 (AIP-65) 和 DAG 打包与解析 (AIP-66)。
补填功能改进
另一个长期以来用户请求的功能是更好地支持补填。补填功能常在机器学习的语境中讨论,但也适用于传统的 ETL 和 ELT 用例。在 Airflow 3 中,补填在调度器内部运行,以实现更好的控制、可扩展性和诊断。补填现在可以从 UI 或 API 启动,并在 UI 中进行监控。
这在“调度器管理的补填”(AIP-78)中进行了定义,示例如下图所示
随时随地,支持任何语言运行
随处运行,支持任何语言
Airflow 3 的一个基本目标是允许在任何环境、使用任何语言执行任务。其中的一个关键组件是任务执行接口(Task Execution Interface)(AIP-72),它使 Airflow 演变为客户端-服务器架构,这是 Airflow 历史上最重要的架构转变之一。这支持 Celery、Kubernetes 和本地执行器,同时也带来了新功能。这一变更的一个组成部分是 API 服务器,它代表了任务执行接口的输入。这一基础功能以任务执行 API 的形式支持多云部署和多语言。Airflow 3 版本包含 Python TaskSDK,它支持对现有 DAG 的向后兼容性。支持其他语言的 TaskSDK(从 Golang 开始)将在未来几个月内发布。
为了使数据管道能够在核心数据中心和云之外的边缘设备上运行,Airflow 3 提供了一个提供商包形式的边缘执行器(Edge Executor)(AIP-69)。这是一个在任务执行接口之上构建的增量功能。最初的版本已在基于 Airflow 2x 的实验模式下发布,现在这个执行器已经演进到利用 Airflow 3 API 服务器。
事件驱动调度和数据资产
Airflow 3 在使 Airflow 能够对外部发生的事件(包括由外部数据系统创建或更新的数据资产)做出反应方面迈出了基础性的一大步。这基于数据集(Datasets)向数据资产(Data Assets)的演进,并被分解为以下详细描述的几个 AIP,它们都是本次版本的一部分。
数据集(Datasets)向数据资产(Data Assets)的基础性演进已作为“引入数据资产”(AIP-74)的一部分完成。这引入了观察者(Watchers)的概念,其他下面详细介绍的功能都利用了这一概念。数据资产方面的一个重大改进是新的资产中心语法(New Asset-Centric Syntax)(AIP-75),它可以使用 Python 装饰器语法轻松地通过 DAG 定义资产,这是本次版本的一部分。
外部事件驱动调度(External event driven scheduling)(AIP-82)基于上述基础数据资产工作,特别是观察者(Watchers)。AIP 中定义的初始范围已经完成,现在包含一个“通用消息总线”(Common Message Bus)接口。本次版本还包含上述功能针对 AWS SQS 的实现,作为一个“开箱即用”的集成,它演示了当 AWS SQS 中有消息到达时触发 DAG 的过程。
推理执行和超参数调优
许多 ML 和 AI 工程师已经在使用 Airflow 进行 ML/AI Ops,特别是用于模型训练。然而,推理执行面临一些挑战。通过增加对非数据间隔 DAG(抱歉,这个词有点绕口)的支持来增强 Airflow 的推理执行能力是一个重要的改变。这项工作是“移除 DAG 运行中的执行日期唯一约束”(AIP-83)的一部分。
安全性和可用性改进
UI 现代化
作为 Airflow 3 的一部分,Airflow UI 已完全重写,并整合了显著改进的用户体验,它无缝地融合了资产导向型工作流和任务导向型工作流。这是一个显著的改进,它使开发者能够按照自己的意愿编写 DAG,而不必拘泥于“正确的方式”。
查看文档中的截图了解更多信息。
基于 React 和 FastAPI 重建 UI 是一个庞大的项目,并被分解为以下详细描述的几个 AIP。
新 UI 的基础是 REST API 和一组用于 UI 操作的内部 API(AIP-84),这两者现在都基于 FastAPI。这些 API 作为上述 API 服务器的一部分提供,也是任务执行框架的一部分。
Airflow 3.0 UI 已显著改进,并包含一个精简的用户体验工作流,涵盖了网格视图(Grid view)和图视图(Graph view)。DAG 和资产之间的交互也更加流畅。用户体验一直在改进中,我们非常感谢您的反馈。这在现代 Web 应用提案(AIP-38)中详细介绍。
作为该项目的一部分,Flask AppBuilder 现已移至一个独立的提供商包中,不再是 Core Airflow 包的一部分。这使得安全和维护更新过程更容易,同时保留了向后兼容性。这在“移除 Flask App Builder 作为核心依赖”(AIP-79)提案中有所记载。
安全性
任务执行接口和 API 服务器的一个关键优势是任务隔离(Task Isolation)。当多个团队共享 Airflow 部署时,Airflow 企业用户常请求此功能以获得更好的安全态势。随着更多详细需求的出现,可以在此基础上进一步开发安全和授权模式。
通过让 CLI 使用 Airflow API 而不是直接访问来改进 CLI 并减少维护负担,是 Airflow 的一个重要演进。我们现在将核心 Airflow CLI 分为两个部分:第一部分用于本地开发和向后兼容,第二部分用于使用 API 进行远程访问。第二部分将是一个新的提供商包,名为“airflowctl”,它可以选择与 Core Airflow 一起安装。这在“通过集成 API 增强 CLI 安全性”(AIP-81)提案中进行了更详细的说明。
杰出的社区
没有上述主导 AIP 的关键贡献者的启发和技术领导,就没有这个版本的发布。我们在此感谢所有人:Ash Berlin-Taylor, Brent Bovenzi, Bugra Ozturk, Constance Martineau, Daniel Standish, Jed Cunningham, Jens Scheffler, Kaxil Naik, Pierre Jeambrun, Vincent Beck, and Vikram Koka。我们还要感谢 Jarek Potiuk 在关键开发基础设施和打包方面的工作,以及 Elad Kalif 对所有必需的关键提供商变更的引领。我们要表彰 Wei Lee 和 Ankit Chaurasia 在升级工具方面的工作,这些工具使用户能够轻松升级到 Airflow 3。
最后,特别感谢 Jed Cunningham 和 Kaxil Naik 在版本管理中扮演的关键角色!
全球三百多名开发者为实现此版本做出了贡献。我们感谢他们的所有贡献。以下按字母顺序列出他们的名字
- Aakcht
- Aaron Chen
- Abhishek
- Adam Turner
- Adan
- Aditya Yadav
- Adrian Lazar
- Adrian Perea
- Ajit J Gupta
- Albert Okiri
- Alex Waygood
- Alexander Millin
- AlteredOracle
- Amar Prakash Pandey
- Amir Mor
- Amogh Desai
- Amol Saini
- Anakin Skywalker Pactores
- Andor Markus
- Andre Miranda
- Andres Lowrie
- Andrew Arochukwu
- Andrew Stein
- Andrii Abramov
- Andrii Korotkov
- Andrii Yerko
- Ankit Chaurasia
- Anthony Lin
- Antony Southworth
- Aritra Basu
- Arjun Pathak
- Arnel Jan Sarmiento
- Arnout Engelen
- Artem Suslov
- Arthur Braveheart
- Artour
- Artur Skarżyński
- Arunav Gupta
- Aryan Khurana
- Ash Berlin-Taylor
- AshKatzEm
- AutomationDev85
- Avihais12344
- Azhar Izzannada E
- Baitur Ulukbekov
- Balthazar Rouberol
- Bartosz Jankiewicz
- Bas
- Ben Chen
- Benoit Perigaud
- Biswamitra Biswas
- Bjorn Olsen
- Bluefox9x5
- Bohdan Udovenko
- Bonnie Why
- Boris Morel
- Bowrna
- Brent Bovenzi
- Bugra Ozturk
- Błażej Tecław
- Castle Cheng
- Chris Luedtke
- Christian Yarros
- Christos Bisias
- Collin McNulty
- Computer Network Investigation
- Constance Martineau
- D. Ferruzzi
- DShi
- Daniel Gellert
- Daniel Imberman
- Daniel Standish
- Daniel van der Ende
- Danish Amjad
- Danny Liu
- David Blain
- Derek
- Detlev V.
- Dewen Kong
- Dheeraj Turaga
- Diogo Rodrigues
- Dmitry Astankov
- Dmitry Pustoshilov
- Dominic Leung
- Dong-yeong0
- Doug Guthrie
- Dylan Melotik
- Elad Kalif
- Eldar Kasmamytov
- Ephraim Anierobi
- Eric
- Everton Seiei Arakaki
- Farhan
- Fedor Kobak
- Felix Uellendall
- Fred Thomsen
- Fully.is(풀리)
- GPK
- Gagan Bhullar
- Geonwoo Kim
- GlenboLake
- Gopal Dirisala
- Gregory Borodin
- Guan Ming(Wesley) Chiu
- Guangyang Li
- Guillaume Lostis
- Hari Selvarajan
- HassanAlahmed
- Hojin Jun
- Howard Yoo
- Huanjie Guo
- Hung
- Hussein Awala
- Hyunsoo Kang
- Ian Buss
- Idris Adebisi
- Igor Kholopov
- IlaiGigi
- Indrale Dnyaneshwar
- JISHAN GARGACHARYA
- Jaejun
- Jake Ferriero
- Jake Roach
- Jakub Dardzinski
- James Chaldecott
- James Regan
- Jarek Potiuk
- Jasmin Patel
- Jason
- Jed Cunningham
- Jeff Harrison
- Jens Scheffler
- Jianzhun Du
- Jimmy McBroom
- Joao Amaral
- João Pedro M Miguel
- Joel Labes
- Joey Cumines
- Joffrey Bienvenu
- John Bampton
- John C. Merfeld
- Johnny1cyber
- José Joaquín Virtudes Castro
- Joseph Ang
- JoshuaXOng
- Josix
- Julian Maicher
- Kacper Kulczak
- Kacper Muda
- Kalyan R
- Kamil Breguła
- Karen Braganza
- Karthik Dulam
- Karthik Ravi
- Karthikeyan Singaravelan
- Kaxil Naik
- Kevin Allen
- Kim
- Kris
- Kunal Bhattacharya
- LIU ZHE YOU
- Lennox Stevenson
- Linh
- Lorin Dawson
- Lou ✨
- Lucy Hu
- Lukas Mikelionis
- Luyang Liu
- Lyndon Fan
- M. Olcay Tercanlı
- Maciej Obuchowski
- Madison Swain-Bowden
- Maksim
- Marcelo Trylesinski
- Marcos Marx
- Maria
- Mark Andreev
- Mark H
- Matt Burke
- Matt Dupree
- Maxim Martynov
- Mayuresh Kedari
- Mehul Goyal
- Mike
- Mike Beckhusen
- Mikhail Dengin
- MishchenkoYuriy
- Muhammad Hanif Mohamad Musa
- Myles Hollowed
- Narendra-Neerukonda
- Natsu
- Nikita
- Niko Oliveira
- Nishant Gupta
- Nitesh Kumar Dubey Samsung
- Nitochkin
- Oleg Ovcharuk
- Oleksandr Slynko
- Omkar P
- Owen Leung
- Pandycool
- Pankaj Koti
- Park Jiwon
- Pavan Sharma
- Peng-Jui Wang
- Peter Debelak
- Phani Kumar
- Pierre Jeambrun
- Po-Yu Hsieh
- Prajwal7842
- Pratiksha
- Purna Chander
- Rafa
- Rahul Madan
- Rahul Vats
- Ramit Kataria
- Rishabh Srivastava
- Rushabh Garambha
- Ryan Eakman
- Ryan Hatter
- Rytis Ulys
- SAI GANESH S
- Sam Lendle
- SamLiaoP
- Saumil Patel
- SaurabhhB
- Sean Gabriel Bayron
- Sean Rose
- Sebastian Daum
- SeonghwanLee
- Shahar Epstein
- Shahbaz Aamir
- Shoaib UR Rehman
- Shubham Raj
- Simon Sawicki
- Siva Kumar Edupuganti
- Sneha Prabhu
- Sooter Saalu
- Srabasti Banerjee
- Stefan Keidel
- Steven Loria
- Steven Shidi Zhou
- Stijn De Haes
- Success Moses
- TakawaAkirayo
- Tamara Janina Fingerlin
- Tamas Palinkas
- Tatiana Al-Chueyr
- Topher Anderson
- Tzu-ping Chung
- Usiel Riedl
- Utkarsh Sharma
- Valentyn
- Venkat VJ
- Vikram Koka
- Vikram Medabalimi
- Vikramaditya Gaonkar
- Vincent
- Vincent Kling
- VladaZakharova
- Waldemar Hummer
- Wang Ran (汪然)
- Wei Lee
- Wojciech Szlachta
- Wonseok Yang
- Yeonguk
- Yohei Kishimoto
- Youngha, Park
- Yuan Li
- Zach Liu
- Zhen-Lun (Kevin) Hong
- althati
- ambikagarg
- atrbgithub
- awdavidson
- codecae
- dan-js
- darkag
- davidfgcorreia
- dominikhei
- ellisms
- enisnazif
- fritz-astronomer
- gaurav7261
- geraj1010
- got686-yandex
- harjeevan maan
- harry.shi
- hikaruhk
- hprassad
- ipsatrivedi
- jaejun
- jj.lee
- jonhspyro
- kanagaraj
- kandharvishnu
- leoguzman
- lucasmo
- luoyuliuyin
- mahdi alizadeh
- majorosdonat
- max
- mayankymailusfedu
- michaeljs-c
- morooshka
- ninad-opsverse
- olegkachur-e
- paolomoriello
- perry2of5
- pgvishnuram
- phi-friday
- rahulgoyal2987
- raphaelauv
- rgriffier
- rom sharon
- saucoide
- sbock-slack
- sc-anssi
- seyoon-lim
- simonprydden
- skandala23
- sonu4578
- suyesh-amatya
- svellaiyan
- tnk-ysk
- uzhastik
- vatsrahul1001
- vfeldsher
- xavipuerto
- xitep
- yangyulely
- yunchi
- 鐘翊修
- 김영준
下一步是什么
我们期待您的反馈。请尝试使用新版本,提交问题(issues),提交拉取请求(PRs),或者加入 Airflow 开发者邮件列表、Slack 和 GitHub 的讨论。让我们共同构建数据编排的未来。
分享