发行说明¶
Airflow 3.0.0 (2025-04-22)¶
我们很自豪地宣布 Apache Airflow 3.0 的正式发布 — 这是该项目历史上最重要的版本。 此版本引入了面向服务的架构、稳定的 DAG 创作界面、扩展了对事件驱动和 ML 工作流的支持,以及基于 React 构建的完全现代化的 UI。 Airflow 3.0 反映了社区多年的投资,并为下一个可扩展、模块化编排时代奠定了基础。
亮点¶
面向服务的架构:新的任务执行 API 和
airflow api-server
可以在远程环境中执行任务,并具有更高的隔离性和灵活性 (AIP-72)。Edge Executor:一种新的 executor,支持分布式、事件驱动和边缘计算工作流 (AIP-69),现在正式发布。
稳定的创作界面:DAG 作者现在应该使用新的
airflow.sdk
命名空间来导入核心 DAG 结构,例如@dag
、@task
和DAG
。调度器管理的 Backfill:Backfill 现在像常规 DAG 运行一样进行调度和跟踪,并具有原生 UI 和 API 支持 (AIP-78)。
DAG 版本控制:Airflow 现在跟踪 DAG 随时间推移的结构变化,从而可以通过 UI 和 API 检查历史 DAG 定义 (AIP-66)。
基于资产的调度:数据集模型已重命名并重新设计为资产,具有新的
@asset
装饰器和更清晰的事件驱动型 DAG 定义 (AIP-74, AIP-75)。对 ML 和 AI 工作流的支持:DAG 现在可以使用
logical_date=None
运行,从而实现模型推理、超参数调整和非间隔工作流等用例 (AIP-83)。移除遗留功能:SLA、SubDAG、DAG 和 Xcom pickling 以及多个内部上下文变量已被移除。 使用升级工具检测已弃用的用法。
拆分 CLI 和 API 更改:CLI 已拆分为
airflow
和airflowctl
(AIP-81),并且 REST API 现在在触发新的 DAG 运行时默认使用logical_date=None
。现代 React UI:基于 React 和 FastAPI 构建的完整 UI 大修包括版本感知视图、backfill 管理以及改进的 DAG 和任务内省 (AIP-38, AIP-84)。
迁移工具:使用 ruff 和 airflow config update 验证 DAG 和配置。 升级需要 Airflow 2.7 或更高版本以及 Python 3.9–3.12。
重大更改¶
Airflow 3.0 引入了自 2.0 版本以来最重要的一系列更改,包括架构转变、新的执行模型以及对 DAG 创作和调度的改进。
任务执行 API & 任务 SDK (AIP-72)¶
Airflow 现在支持面向服务的架构,从而可以通过新的任务执行 API 远程执行任务。 此 API 将任务执行与调度器分离,并引入了一个稳定的合约,用于在 Airflow 传统运行时环境之外运行任务。
为了支持这一点,Airflow 引入了任务 SDK — 一个轻量级的运行时环境,用于在外部系统(例如容器、边缘环境或其他运行时)中运行 Airflow 任务。 这为与语言无关的任务执行奠定了基础,并为基于 Airflow 的工作流带来了更高的隔离性、可移植性和可扩展性。
Airflow 3.0 还引入了一个新的 airflow.sdk
命名空间,该命名空间公开了用于定义 DAG 和任务的核心创作接口。 DAG 作者现在应该从 airflow.sdk
而不是内部模块导入诸如 DAG
、@dag
和 @task
之类的对象。 这个新的命名空间为未来版本的 Airflow 提供了稳定的、向前兼容的 DAG 创作接口。
Edge Executor (AIP-69)¶
Airflow 3.0 引入了 Edge Executor 作为正式发布的功能,支持在分布式或远程计算环境中执行任务。 Edge Executor 专为事件驱动和边缘计算用例而设计,它与任务执行 API 集成,以支持超越传统 Airflow 运行时的任务编排。 这种进步促进了混合和跨环境编排模式,允许任务 worker 更靠近数据或应用程序层运行。
调度器管理的 Backfill (AIP-78)¶
Backfill 现在完全由调度器管理,而不是作为单独的命令行作业启动。 这种更改将 backfill 逻辑与常规 DAG 执行统一起来,并确保 backfill 运行遵循与其他 DAG 运行相同的调度、版本控制和可观察性模型。
Airflow 3.0 还引入了原生 UI 和 REST API 支持,用于启动和监控 backfill,使其更易于访问并更易于集成到自动化工作流程中。 这些改进为更智能、更安全的历史重新处理奠定了基础 — 现在可以直接通过 Airflow UI 和 API 获得。
DAG 版本控制 (AIP-66)¶
Airflow 3.0 引入了原生 DAG 版本控制。 DAG 结构更改(例如,重命名的任务、依赖关系变化)现在直接在元数据数据库中进行跟踪。 这允许用户通过 UI 和 API 检查历史 DAG 结构,并为更安全的 backfill、改进的可观察性和运行时确定的 DAG 逻辑奠定了基础。
React UI 重写 (AIP-38, AIP-84)¶
Airflow 3.0 附带了一个基于 React 和 FastAPI 构建的完全重新设计的用户界面。 这种现代架构提高了响应速度,可以在视图之间实现更一致的导航,并解锁了新的 UI 功能 — 包括对 DAG 版本控制、以资产为中心的 DAG 定义以及更直观的过滤和搜索的支持。
新的 UI 取代了基于 Flask 的旧版前端,并为未来的可扩展性和社区贡献奠定了基础。
基于资产的调度和术语对齐 (AIP-74, AIP-75)¶
数据集(Datasets)的概念已重命名为资产(Assets),以统一术语,与现代数据生态系统中的常用实践保持一致。内部模型也已重新设计,以更好地支持未来的功能,如资产分区和验证。
@asset
装饰器以及对 DAG 解析器的相关更改,实现了更清晰、以资产为中心的 DAG 定义,使 Airflow 能够更自然地支持事件驱动和数据感知的调度模式。
统一调度字段¶
Airflow 3.0 移除了遗留的 schedule_interval
和 timetable
参数。DAG 现在必须使用统一的 schedule
字段来处理所有基于时间和事件的调度逻辑。这简化了 DAG 定义,并提高了跨调度模式的一致性。
更新的调度默认值¶
Airflow 3.0 更改了新 DAG 的默认行为,在配置文件中设置 catchup_by_default = False
。这意味着未显式设置 catchup=...
的 DAG 将不再默认回填错过的间隔。此更改减少了新用户的困惑,并更好地反映了按需和事件驱动工作流程的日益增长的使用。
限制对元数据数据库的访问¶
任务代码不再能直接访问元数据数据库。与 DAG 状态、任务历史记录或 DAG 运行的交互必须通过 Airflow REST API 或公开的上下文来执行。此更改改进了架构分离并实现了远程执行。
不再支持未来逻辑日期¶
Airflow 不再支持使用未来逻辑日期触发 DAG 运行。此更改与逻辑执行模型保持一致,并消除了回填和事件驱动 DAG 中的歧义。使用 logical_date=None
以使用当前时间戳触发运行。
资产和手动触发 DAG 的上下文行为¶
对于由资产事件触发的 DAG 运行,或通过 REST API 触发且未指定 logical_date
的 DAG 运行,Airflow 现在默认设置 logical_date=None
。这些 DAG 运行没有数据间隔,并且尝试从任务上下文中访问 data_interval_start
、data_interval_end
或 logical_date
将引发 KeyError
。
DAG 作者应使用 dag_run.logical_date
并执行适当的检查或回退,以支持多种触发类型。此更改提高了与事件驱动语义的一致性,但可能需要更新现有 DAG,因为它们假设这些值始终存在。
改进的回调行为¶
Airflow 3.0 改进了任务回调行为,以提高清晰度和一致性。特别是,当任务标记为 SKIPPED
时,不再执行 on_success_callback
,使其更符合预期语义。
更新的默认配置¶
Airflow 3.0 中更新了几个默认配置值,以更好地反映现代使用模式并简化入门。
catchup_by_default
现在默认设置为False
。除非明确配置,否则 DAG 将不会自动回填。create_cron_data_intervals
现在默认设置为False
。因此,将使用CronTriggerTimetable
而不是遗留的CronDataIntervalTimetable
来解释 cron 表达式。SimpleAuthManager
现在是默认的auth_manager
。要继续使用基于 Flask AppBuilder 的身份验证,请安装apache-airflow-providers-flask-appbuilder
提供程序并显式设置auth_manager = airflow.providers.fab.auth_manager.FabAuthManager
。
这些更改代表了自 2.0 版本发布以来 Airflow 平台最重大的演变——为未来几年更具可扩展性、事件驱动和语言无关的编排奠定了基础。
执行器和调度器更新¶
Airflow 3.0 在 DAG 和任务的调度、优先级排序和执行方式方面引入了几个重要的改进和行为变更。
需要独立的 DAG 处理器¶
Airflow 3.0 现在需要独立的 DAG 处理器来解析 DAG。此专用进程提高了调度器性能、隔离性和可观察性。它还通过将 DAG 解析与调度逻辑清楚地分离来简化架构。此更改可能会影响以前使用嵌入式 DAG 解析的自定义部署。
优先级权重受池槽位限制¶
任务上的 priority_weight
值现在受可用池槽位数量的限制。这确保了资源可用性仍然是任务执行顺序的主要约束,防止高优先级任务在存在资源争用时饿死其他任务。
DAG 终止期间的拆卸任务处理¶
即使 DAG 运行提前终止,现在也将执行拆卸任务。这确保了清理逻辑得到尊重,提高了使用拆卸任务来管理临时基础设施、临时文件或下游通知的工作流程的可靠性。
改进的调度器容错性¶
调度器组件现在使用 run_with_db_retries
更优雅地处理瞬态数据库问题。这增强了 Airflow 在高容量环境中的容错能力,并降低了由于临时数据库连接问题导致调度器重新启动的可能性。
映射的任务统计信息准确性¶
Airflow 3.0 修复了一个导致动态任务映射报告不正确的任务统计信息的错误。统计信息现在准确地反映了映射任务实例的数量及其状态,从而提高了动态工作流程的可观察性和调试能力。
配置和接口更改¶
Airflow 3.0 引入了几个配置和接口更新,这些更新提高了核心实用程序的一致性、明确了所有权,并删除了不再与现代使用模式对齐的遗留行为。
默认值处理¶
Airflow 不再静默更新保留已弃用默认值的配置选项。现在,用户需要显式设置任何与当前默认值不同的配置值。此更改提高了透明度,并防止了升级期间的意外行为更改。
重构的配置默认值¶
Airflow 3.0 中更改了几个配置默认值,以更好地反映现代使用模式。
catchup_by_default
的默认值现在为False
。除非明确配置,否则 DAG 将不会回填错过的间隔。create_cron_data_intervals
的默认值现在为False
。现在使用CronTriggerTimetable
而不是旧的CronDataIntervalTimetable
来解释 Cron 表达式。此更改简化了间隔逻辑,并与 Airflow 调度系统的未来方向保持一致。
重构的内部实用程序¶
几个核心组件已移动到更直观或更稳定的位置。
SecretsMasker
类已重新定位到airflow.utils.secrets_masker
。先前位于
airflow.io
下的ObjectStoragePath
实用程序现在可以通过airflow.utils.object_storage_path
获得。
这些更改简化了导入,并反映了在整个 Airflow 代码库中稳定实用程序接口的更广泛努力。
改进的 inlet_events
、outlet_events
和 triggering_asset_events
¶
任务上下文中的资产事件映射已得到改进,以更好地支持资产用例,包括 AIP-74 中引入的新功能。
现在直接通过具体对象访问资产或资产别名的事件,以避免歧义。不再支持使用 str
访问事件。使用 Asset
或 AssetAlias
对象,或 Asset.ref
来显式引用实体,例如
outlet_events[Asset.ref(name="myasset")] # Get events for asset named "myasset".
outlet_events[AssetAlias(name="myalias")] # Get events for asset alias named "myalias".
或者,添加了两个辅助函数 for_asset
和 for_asset_alias
作为快捷方式
outlet_events.for_asset(name="myasset") # Get events for asset named "myasset".
outlet_events.for_asset_alias(name="myalias") # Get events for asset alias named "myalias".
资产事件触发器的内部表示现在还包括一个显式的 uri
字段,从而简化了可追溯性,并与 Airflow 3.0 中引入的更广泛的资产感知执行模型保持一致。直接与 inlet_events
交互的 DAG 作者可能需要更新假设先前结构的逻辑。
xcom_pull
中的行为变更¶
拉取时不设置 ``task_ids``:
在 Airflow 2 中,xcom_pull()
方法允许通过键拉取 XComs,而无需指定 task_ids,尽管底层 DB 模型将 task_id 定义为 XCom 主键的一部分。这造成了歧义:如果两个任务推送了具有相同键的 XComs,xcom_pull()
将拉取碰巧排在第一个的 XComs,从而导致不可预测的行为。
Airflow 3 通过要求在按键拉取时指定 task_ids
来解决此不一致问题。此更改与模式定义的 XComs 的任务范围性质保持一致,确保可预测和一致的行为。
如果 DAG 作者的 DAG 在没有 task_ids
的情况下使用了 xcom_pull
,则应更新他们的 DAG 以使用 task_ids
,例如
kwargs["ti"].xcom_pull(key="key")
应更新为
kwargs["ti"].xcom_pull(task_ids="task1", key="key")
单个任务 ID 的返回类型更改:
在 Airflow 2 中,当在列表中使用带有单个任务 ID 的 xcom_pull()
(例如,task_ids=["task1"]
)时,它将返回一个包含一个值的 LazyXComSelectSequence
对象。 在 Airflow 3.0.0 中,此行为已更改为直接返回该值。
因此,如果您之前使用过
xcom_values = kwargs["ti"].xcom_pull(task_ids=["task1"], key="key")
xcom_value = xcom_values[0] # Access the first value
现在您将直接获得该值,而不是包含一个值的序列。
xcom_value = kwargs["ti"].xcom_pull(task_ids=["task1"], key="key")
先前的行为(传递列表时返回列表)将在 Airflow 3.0.1 中恢复,以保持向后兼容性。
但是,建议在使用 task_ids
时明确您的意图(在 3.0.1 中的修复之后)
如果您想要单个值,请使用
task_ids="task1"
如果您想要一个序列,请使用
task_ids=["task1"]
这使得代码更加明确和易于理解。
删除的配置键¶
作为弃用清理的一部分,已删除几个旧的配置选项。这些选项包括
scheduler.allow_trigger_in_future
scheduler.use_job_schedule
scheduler.use_local_tz
用户应查看他们的 airflow.cfg
文件或使用 airflow config lint
命令来识别过时或已删除的选项。
升级工具¶
Airflow 3.0 包括对升级验证的改进支持。使用以下工具主动捕获不兼容的配置或已弃用的使用模式。
airflow config lint
:标识已删除或无效的配置键ruff check --select AIR30
:标记已删除的接口和常见的迁移问题
CLI & API 更改¶
Airflow 3.0 引入了对 CLI 和 REST API 接口的更改,以更好地与面向服务的部署和事件驱动的工作流保持一致。
拆分 CLI 架构 (AIP-81)¶
Airflow CLI 已拆分为两个不同的接口
核心
airflow
CLI 现在仅处理本地功能(例如,airflow tasks test
,airflow dags list
)。远程功能,包括触发 DAG 或管理服务模式环境中的连接,现在由一个单独的 CLI
airflowctl
处理,该 CLI 通过apache-airflow-client
包分发。
此更改提高了在分布式或 API 优先的上下文中使用 Airflow 的部署的安全性和模块化。
REST API:已更新 DAG 触发行为¶
POST /dags/{dag_id}/dagRuns
端点的行为已更改。如果在通过 REST API 触发 DAG 时未显式提供 logical_date
,则现在默认为 None
。
这与 Airflow 3.0 中的事件驱动 DAG 和手动运行保持一致,但可能会破坏与先前依赖 Airflow 自动生成带时间戳的 logical_date
的脚本或工具的向后兼容性。
删除的 CLI 标志和命令¶
在早期版本中标记为要删除的几个已弃用的 CLI 参数和命令现在已在 Airflow 3.0 中清理。请参阅弃用和删除部分或运行 airflow --help
以查看当前可用的命令和参数集。
Provider 重构和标准化¶
Airflow 3.0 完成了将几个核心运算符、传感器和钩子迁移到新的 apache-airflow-providers-standard
包中。此包现在包括常用的组件,例如
PythonOperator
BashOperator
EmailOperator
SimpleHttpOperator
ShortCircuitOperator
这些运算符以前捆绑在 airflow-core
中,但现在被视为 provider 管理的组件,以提高模块化、可测试性和生命周期独立性。
此更改使 provider 之间的版本控制更加一致,并为 Airflow 的未来做好准备,届时所有集成(包括“标准”集成)都将遵循相同的接口模型。
为了保持与现有 DAG 的兼容性,apache-airflow-providers-standard
包可以在 Airflow 2.x 和 3.x 上安装。鼓励从 Airflow 2.x 升级的用户提前开始更新导入路径并测试 provider 安装。
旧的导入(例如 airflow.operators.python.PythonOperator
)已被弃用,并将很快被删除。它们应替换为
from airflow.providers.standard.operators.python import PythonOperator
UI & 可用性改进¶
Airflow 3.0 引入了现代化的用户体验,以补充新的基于 React 的 UI 架构(请参阅重大更改)。界面的几个区域已得到增强,以提高可见性、一致性和可导航性。
新主页¶
Airflow 主页现在提供了环境的高级操作概述。它包括核心组件(调度器、触发器、DAG 处理器)的运行状况检查、DAG 和任务实例状态的摘要统计信息以及资产触发事件的实时馈送。此视图可帮助用户快速识别管道运行状况、近期活动和潜在故障。
统一的 DAG 列表视图¶
DAG 列表页面已更新为更清晰的布局和改进的响应能力。用户可以按名称、标签或所有者浏览 DAG。虽然尚未集成全文搜索,但已改进过滤器和导航,以提高大型部署中的清晰度。
版本感知的图形和网格视图¶
图形和网格视图现在在运行时使用的 DAG 版本的上下文中显示任务信息。这提高了随时间推移而演变的 DAG 的可追溯性,并为历史运行提供更准确的调试。
扩展的 DAG 图形可视化¶
图形视图现在支持可视化资产和任务依赖关系的完整链,包括跨 DAG 边界使用或生成的资产。这允许用户在统一视图中检查上游和下游沿袭,从而更容易跟踪数据流、调试触发行为以及了解资产和任务之间的条件依赖关系。
DAG 代码视图¶
“代码”选项卡现在显示调度程序为所选 DAG 版本解析的精确 DAG 源代码。这允许用户检查已执行的精确代码,即使对于历史运行也是如此,并有助于调试与版本化 DAG 更改相关的问题。
改进的任务日志访问¶
任务日志访问已在各个视图中得到简化。现在可以从网格和任务实例页面更轻松地访问日志,格式更清晰,视觉干扰更少。
增强的资产和回填视图¶
新的 UI 组件支持以资产为中心的 DAG 和回填工作流程
现在可以从 DAG 详情页面查看资产定义,从而允许用户检查上游和下游资产关系。
可以直接从 UI 触发和监控回填,包括对 Airflow 3.0 中引入的调度器管理的回填的支持。
这些改进使 Airflow 更容易被操作员、数据工程师和跨基于时间和事件驱动的工作流程工作的利益相关者访问。
弃用和移除¶
Airflow 3.0 中删除了一些已弃用的特性、模块和接口,完成了长期存在的迁移和清理。
鼓励用户查看以下删除项以确保兼容性
已完全删除 SubDag 支持,包括
SubDagOperator
、相关的 CLI 和 API 接口。TaskGroup 现在是嵌套 DAG 结构的推荐替代方案。已删除 SLA:已删除旧版 SLA 功能,包括 SLA 回调和指标。计划在未来版本的 Airflow 中提供更灵活的替代机制
DeadlineAlerts
。依赖于基于 SLA 的通知的用户应考虑使用任务级别的成功/失败钩子或外部监控集成来实现自定义警报。已删除 Pickling 支持:与 DAG pickling 相关的所有旧版功能都已完全删除。 这包括
PickleDag
CLI/API,以及围绕store_serialized_dags = False
的隐式行为。 现在必须使用基于 JSON 的序列化系统来序列化 DAG。 确保 DAG 中使用的任何自定义 Python 对象都是 JSON 可序列化的。上下文参数清理:已从任务执行上下文中删除几个以前可用的上下文变量,包括
conf
、execution_date
和dag_run.external_trigger
。 这些值要么不再适用,要么已重命名(例如,使用dag_run.logical_date
而不是execution_date
)。 DAG 作者应确保模板化字段和 Python 可调用对象不引用这些已弃用的键。已完全删除已弃用的核心导入。任何使用
airflow.operators.*
、airflow.hooks.*
或类似旧版导入路径的情况都应更新为从其各自的提供程序导入。配置清理:已删除几个旧版配置选项,包括
scheduler.allow_trigger_in_future
:DAG 运行不再可以使用未来的逻辑日期触发。请改用logical_date=None
。scheduler.use_job_schedule
和scheduler.use_local_tz
也已被删除。这些选项已被弃用,并且不再具有任何作用。
已删除已弃用的实用程序方法,例如
airflow.utils.helpers
、airflow.utils.process_utils
和airflow.utils.timezone
中的方法。现在可以在标准 Python 库或 Airflow 提供程序模块中找到等效的功能。删除了已弃用的 CLI 标志和行为:已清理在早期版本中标记为删除的几个 CLI 入口点和参数。
为了协助升级,诸如 ruff
(例如,规则 AIR302
)和 airflow config lint
之类的工具可以帮助识别过时的导入和配置键。 建议使用这些实用程序来查找和解决迁移期间常见的不兼容性问题。 有关更多信息,请参阅升级指南。
已删除功能的摘要¶
下表总结了 3.0 中删除的面向用户的功能及其推荐的替代方案。 并非所有这些都在上面单独列出。
功能 |
替代方案/说明 |
---|---|
SubDagOperator / SubDAG |
使用 TaskGroups |
SLA 回调/指标 |
截止日期警报(计划在 3.0 之后) |
DAG Pickling |
使用 JSON 序列化;不再支持 pickling |
Xcom Pickling |
使用自定义 Xcom 后端;不再支持 pickling |
|
使用 |
|
已从上下文中删除;使用 DAG 参数或 |
核心 |
使用来自 |
|
使用 |
|
使用 |
|
使用 |
|
DAG 始终被序列化;配置无效 |
已弃用的核心导入 |
从相应的提供程序包导入 |
DebugExecutor |
使用 LocalExecutor 进行测试 |
|
默认情况下使用 glob 语法 |
迁移工具和升级过程¶
Airflow 3 的设计考虑了迁移。许多 Airflow 2 DAG 无需更改即可工作,尤其是在早期版本中已解决弃用警告的情况下。为了支持升级,Airflow 3 包括验证工具,例如 ruff
和 airflow config update
,以及简化的启动模型。
有关分步升级过程,请参阅升级指南。
最低支持版本¶
要升级到 Airflow 3.0,您必须运行 Airflow 2.7 或更高版本。
Airflow 3.0 支持以下 Python 版本
Python 3.9
Python 3.10
Python 3.11
Python 3.12
由于架构更改和更新的依赖关系要求,不支持更早版本的 Airflow 或 Python。
DAG 兼容性检查¶
Airflow 现在包含一个基于 Ruff 的 linter,其中包含自定义规则,用于检测不再与 Airflow 3.0 兼容的 DAG 模式和接口。 这些检查打包在 AIR30x
规则系列下。 用法示例
ruff check dags/ --select AIR301
ruff check dags/ --select AIR301 --fix
这些检查可以自动修复许多常见问题,例如重命名的参数、删除的导入或旧版上下文变量用法。
配置迁移¶
Airflow 3.0 引入了一个新实用程序来验证和升级您的 Airflow 配置文件
airflow config update
airflow config update --fix
此实用程序检测已删除或已弃用的配置选项,如果需要,可以就地更新它们。
可以通过以下方式获得其他验证
airflow config lint
此命令会显示过时的配置键,并帮助您使环境与 Airflow 3.0 要求保持一致。
元数据数据库升级¶
与之前的重大版本一样,Airflow 3.0 升级包括对元数据数据库的架构更改。 在升级之前,强烈建议您备份数据库并选择运行
airflow db clean
以删除旧的任务实例、日志或 XCom 数据。要应用新架构
airflow db migrate
启动行为更改¶
现在显式启动 Airflow 组件。 例如
airflow api-server # Replaces airflow webserver
airflow dag-processor # Required in all environments
这些更改反映了 Airflow 的新型面向服务的架构。
资源¶
Airflow 3.0 代表了数百名贡献者和数十个组织一年多的合作成果。 我们感谢每个人通过设计讨论、代码贡献、测试、文档和社区反馈来帮助塑造此版本。 有关完整详细信息、迁移指南和升级最佳实践,请参阅官方升级指南,并加入 Airflow 开发和用户邮件列表中的对话。
Airflow 2.10.5 (2025-02-10)¶
重大更改¶
确保在 DAG 运行设置为失败时执行清理任务 (#45530)¶
以前,当 DAG 运行被手动设置为“失败”或“成功”状态时,终端状态设置为所有任务。但是,这对于定义了 setup- 和 teardown 任务的情况存在差距:如果 teardown 用于清理基础设施或其他资源,它们也会被跳过,因此资源可能会保持分配状态。
从现在开始,如果在之前执行了 setup 任务,并且 DAG 被手动设置为“失败”或“成功”,则执行 teardown 任务。 如果 setup 也被跳过,则 teardown 任务将被跳过。
副作用是,如果 DAG 包含 teardown 任务,则手动将 DAG 标记为“失败”或“成功”将需要保持 DAG 处于运行状态,以确保计划 teardown 任务。 如果 DAG 直接设置为“失败”或“成功”,则不会计划它们。
错误修复¶
防止在裸任务中的任务生成的映射中使用
trigger_rule=TriggerRule.ALWAYS
(#44751)修复 ShortCircuitOperator 映射的任务 (#44912)
修复在映射的任务组中提前评估具有某些触发规则(例如
ONE_DONE
)的任务 (#44937)修复 BaseOperator 中的 task_id 验证 (#44938) (#44938)
允许从 API 中获取带有正斜杠的 XCom 并在 UI 中对其进行转义 (#45134)
修复
FileTaskHandler
仅从默认执行程序读取 (#46000)修复日志的空任务实例 (#45702) (#45703)
在运行 TaskFlow virtualenv 任务之前删除
skip_if
和run_if
装饰器 (#41832) (#45680)修复事件日志中 json 请求的请求正文 (#45546) (#45560)
确保在 DAG 运行设置为失败时执行清理任务 (#45530) (#45581)
在任务执行后,不要在 TI 更新时更新 DR (#45348)
修复具有 None 默认值的对象和数组 DAG 参数 (#45313) (#45315)
修复无限循环的传感器重新调度 (#45224) (#45250)
在 SQLAlchemy 的扩展 JSON 类型装饰器中评估 None (#45119) (#45120)
允许通过
rendered_map_index
过滤动态任务 (#45109) (#45122)处理清理 URL 时的相对路径 (#41995) (#45080)
在登录表单上设置自动完成关闭 (#44929) (#44940)
添加 Webserver 参数
max_form_parts
,max_form_memory_size
(#46243) (#45749)修复了在 BaseOperators
execute
安全机制中访问线程局部变量的问题 (#44646) (#46280)将 map_index 参数添加到 extra links API (#46337)
其他¶
添加发送 SIGTERMs 时的回溯日志输出 (#44880) (#45077)
删除了 Operators 指定其自身“调度依赖”的能力 (#45713) (#45742)
弃用 Task Context 中的
conf
(#44993)
Airflow 2.10.4 (2024-12-16)¶
重大更改¶
TaskInstance priority_weight
被限制在 32 位有符号整数范围内 (#43611)¶
某些数据库引擎仅限于 32 位整数值。由于某些用户报告了权重滚动到负值的错误,我们决定将该值限制为 32 位整数。即使在 python 内部支持小于或大于 64 位的数值,priority_weight
也被限制,并且仅存储 -2147483648 到 2147483647 的值。
Bug 修复¶
修复失败任务自动重试后动态映射任务的统计信息 (#44300)
修复过滤后日志中多行消息的错误显示 (#44457)
允许 metrics validator 中使用“/” (#42934) (#44515)
修复甘特图闪烁问题 (#44488) (#44517)
修复无法从连接表单中删除字段的问题 (#40421) (#44442)
对部分任务导入而不是执行检查 pool_slots (#39724) (#42693)
避免按动态映射任务的 try_number 对任务实例统计信息进行分组 (#44300) (#44319)
当任务卡在排队状态时重新排队任务 (#43520) (#44158)
抑制检查敏感值时的警告 (#44148) (#44167)
修复 get_task_instance_try_details 以返回适当的模式 (#43830) (#44133)
日志消息源详细信息已分组 (#43681) (#44070)
修复 UI 中任务尝试的重复 (#43891) (#43950)
在 OpenAPI 规范中添加正确的 mime-type (#43879) (#43901)
如果链接为空或为空,则禁用额外的链接按钮 (#43844) (#43851)
禁用按 execution_date 排序 XCom 列表 (#43680) (#43696)
修复 venv numpy 示例,它至少需要 1.26 才能在 Python 3.12 中工作 (#43659)
修复映射任务中的尝试选择器,也包括索引 0 (#43590) (#43591)
防止在动态映射任务中使用
trigger_rule="always"
(#43810)防止在裸任务中的任务生成的映射中使用
trigger_rule=TriggerRule.ALWAYS
(#44751)
仅文档更改¶
更新有关容器/helm 的 XCom 文档 (#44570) (#44573)
其他¶
当通过 str 访问 inlet 或 outlet 事件时,引发弃用警告 (#43922)
Airflow 2.10.3 (2024-11-05)¶
重大更改¶
没有重大更改。
Bug 修复¶
改进了设置 Airflow 变量时对值掩码的处理,以增强安全性。 (#43123) (#43278)
添加了对 task_instance_mutation_hook 的支持,以处理索引为 0 的映射运算符。 (#42661) (#43089)
修复了执行器清理,以在任务实例终止时正确处理僵尸任务。 (#43065)
在内部 API 调用中添加了针对 HTTP 502 和 504 错误的重试逻辑,以处理 webserver 启动问题。 (#42994) (#43044)
恢复使用单独的会话来写入和删除 RTIF 数据,以防止 StaleDataError。 (#42928) (#43012)
通过在 DAG 名称中将连字符替换为下划线来修复 PythonOperator 错误。 (#42993)
改进了任务重试的验证,以处理 None 值 (#42532) (#42915)
修复了将数据集别名解析为新数据集时数据集管理器中的错误处理 (#42733)
启用在 DAG 图形视图中单击任务名称以正确选择相应的任务。 (#38782) (#42697)
防止在 /home 上使用标签/上次运行过滤器时出现重定向循环 (#42607) (#42609) (#42628)
支持 OTEL 指标中的 host.name 以及在指标中使用 OTEL_RESOURCE_ATTRIBUTES (#42428) (#42604)
通过降低对比度和饱和度来减少暗模式下的眼睛疲劳 (#42567) (#42583)
正确处理触发器表单中的 ENTER 键并允许手动 JSON (#42525) (#42535)
确保 DAG 触发器表单在键盘提交时使用更新的参数进行提交 (#42487) (#42499)
如果启用了 pickling,则不要尝试通过 xcom 将非
stringified
对象提供给 UI (#42388) (#42486)修复任务实例的 span 链接以指向 scheduler_job_loop 中正确的 span (#42430) (#42480)
修复 Windows 中 runner 执行任务的问题 (#42426) (#42478)
允许使用环境变量覆盖硬编码的 OTEL_SERVICE_NAME (#42242) (#42441)
通过使用
selectinload
而不是joinedload
来提高触发器性能 (#40487) (#42351)在屏蔽敏感配置时抑制警告 (#43335) (#43337)
屏蔽与 DAG 作者无关的配置值 (#43040) (#43336)
在 BashOperator 中将模板化的 bash 脚本作为文件执行 (#43191)
修复了 schedule_downstream_tasks 以包含 one_success 触发规则的上游任务 (#42582) (#43299)
在调度程序中添加重试逻辑,以在死锁的情况下更新触发器超时。 (#41429) (#42651)
手动使 dag_run 失败时,将所有任务标记为跳过 (#43572)
修复日志和详细信息网格面板中映射任务的
TrySelector
(#43566)在处理执行器事件时有条件地添加 OTEL 事件 (#43558) (#43567)
修复损坏的统计数据
scheduler_loop_duration
(#42886) (#43544)确保 /api/v1/dags 中的 total_entries (#43377) (#43429)
在 List task instances (batch) 端点的请求正文模式中包含 limit 和 offset (#43479)
当从扩展运算符调用 execute 时,不要在 ExecutorSafeguard 中引发警告 (#42849) (#43577)
其他¶
弃用会话身份验证后端 (#42911)
删除了 Airflow 版本 2.8.0 及更高版本的 providers 的 unicodecsv 依赖项 (#42765) (#42970)
从 Webserver 中删除对 Scarf 的引用 (#42901) (#42942)
将 /airflow/www 中的
dompurify
从 2.2.9 提升到 2.5.6 (#42263) (#42270)更正 _get_template_context 中的文档字符串格式 (#42244) (#42272)
向后移植: 将 Flask-AppBuilder 提升到
4.5.2
(#43309) (#43318)检查用于安装 pre-commit venvs 的 python 版本 (#43282) (#43310)
解决数据集别名迁移中的警告 (#43425)
仅文档更改¶
通过 DAG 作者阐明 PLUGINS_FOLDER 权限 (#43022) (#43029)
将模板信息添加到 TaskFlow 教程 (#42992)
Airflow 本地设置不再可从 dags 文件夹导入 (#42231) (#42603)
修复 cpu 和内存使用情况的文档 (#42147) (#42256)
修复 docker compose 的说明 (#43119) (#43321)
更新文档以反映返回的是 dag_warnings 而不是 import_errors。 (#42858) (#42888)
Airflow 2.10.2 (2024-09-18)¶
重大更改¶
没有重大更改。
Bug 修复¶
恢复“修复:如果 dags 文件夹更改,DAG 不会被标记为过期” (#42220, #42217)
添加缺少的 open telemetry span 并更正计划的插槽文档 (#41985)
修复 require_confirmation_dag_change (#42063) (#42211)
仅在呈现 XComEntry 时将 null/undefined 视为 falsy (#42199) (#42213)
添加 extra 和
renderedTemplates
作为跳过camelCasing
的键 (#42206) (#42208)不要
camelcase
xcom 条目 (#42182) (#42187)修复列表视图中的 task_instance 和 dag_run 链接 (#42138) (#42143)
支持触发器 UI 表单中字符串类型参数的多行输入 (#40414) (#42139)
修复详细信息选项卡日志 URL 检测 (#42104) (#42114)
添加新的异常类型来捕获超时 (#42064) (#42078)
重写 DAG 到数据集/数据集别名的存储方式 (#41987) (#42055)
允许数据集别名添加多个数据集事件 (#42189) (#42247)
其他¶
将 universal-pathlib 限制在
0.2.4
以下,因为它会破坏我们的集成 (#42101)使用
LibCST
自动修复默认的可延迟选项 (#42089)弃用
tasks list
cli 命令的--tree
标志 (#41965)
仅文档更改¶
更新
security_model.rst
以清除未经身份验证的端点异常 (#42085)将有关 dataclasses 和 attrs 的注释添加到 XComs 页面 (#42056)
改进 DAG 中 markdown 文档的文档 (#42013)
添加关于监听器可能很危险的警告 (#41968)
Airflow 2.10.1 (2024-09-05)¶
重大更改¶
没有重大更改。
Bug 修复¶
处理检查缺少文件时的示例 dags 情况 (#41874)
修复“没有角色”错误页面中的注销链接 (#41845)
当 end_from_trigger 为 True 时,为已完成的触发器设置 end_date 和 duration。 (#41834)
如果 DAGs 文件夹发生更改,DAGs 不会被标记为陈旧。 (#41829)
修复与 FAB provider 版本 <1.3.0 的兼容性。 (#41809)
不要在心跳时使 LocalTaskJob 失败。 (#41810)
在插件管理器中移除对 cgitb 的弃用警告。 (#41793)
修复没有
__name__
的 notifier(instance) 的日志。 (#41699)将 syspath 准备工作分解为多个阶段。 (#41694)
为额外的链接添加 URL 清理。 (#41680)
修复 InletEventsAccessors 类型存根。 (#41607)
修复当 XCom 为 INT、FLOAT、BOOL 或 NULL 时的 UI 渲染问题。 (#41605)
修复 try selector 刷新。 (#41503)
不正确的尝试次数减法导致 OTEL airflow 的无效 span id。 (#41535)
添加 WebEncoder 用于触发页面渲染,以避免渲染失败。 (#41485)
将
tojson
过滤器添加到 example_inlet_event_extra 示例 DAG。 (#41890)为不继承 BaseExecutor 的执行器添加向后兼容性检查。 (#41927)
杂项¶
在 /airflow/www 中将 webpack 从 5.76.0 升级到 5.94.0。 (#41879)
在日志中为超链接添加 rel 属性。 (#41783)
编辑连接时显示字段删除警告。 (#41504)
使 Scarf 使用情况报告以主版本 + 次版本显示,计数器以 buckets 显示。 (#41900)
将 universal-pathlib 的最低版本降低到 0.2.2。 (#41943)
防止 universal pathlib xcom 后端的 None 组件。 (#41938)
仅文档更改¶
移除对 Debian bullseye 的支持。 (#41569)
为使用
keycloak
进行身份验证添加示例。 (#41791)
Airflow 2.10.0 (2024-08-15)¶
重大变更¶
基于 Scarf 的遥测:Airflow 现在收集遥测数据。 (#39510)¶
Airflow 集成了 Scarf 以在运行期间收集基本的使用情况数据。 部署可以通过将 [usage_data_collection]enabled
选项设置为 False
或 SCARF_ANALYTICS=false
环境变量来选择退出数据收集。
数据集不再触发非活跃的 DAGs。 (#38891)¶
以前,当 DAG 暂停或移除时,传入的数据集事件仍然会触发它,并且当 DAG 恢复暂停或重新添加到 DAG 文件中时,DAG 将会运行。 这已经改变了; 现在,只有在 DAG 处于活动状态时发生的事件才能满足 DAG 的数据集计划。 虽然这是一个重大变更,但之前的行为被认为是 bug。
基于时间的调度的行为没有改变,包括 DatasetOrTimeSchedule
的时间表部分。
try_number
不再在任务执行期间递增。 (#39336)¶
以前,尝试次数 (try_number
) 在 worker 上任务执行开始时递增。 这在很多方面都有问题。 首先,这意味着尝试次数在不应该递增的时候递增,即从重新调度或推迟恢复时。 并且它还导致当任务尚未启动时尝试次数“错误”。 解决这两个问题的变通方法造成了很多混乱。
现在,相反,任务运行的尝试次数在任务被调度时确定,并且在运行中不会改变,并且永远不会递减。 因此,在任务运行后,观察到的尝试次数与任务运行时保持相同; 只有在有“新尝试”时,尝试次数才会再次递增。
此更改的一个结果是,如果用户“手动”运行任务(例如,通过直接调用 ti.run()
或命令行 airflow tasks run
),则尝试次数将不再递增。 Airflow 假设任务总是在被调度程序调度后运行,因此我们不认为这是一个重大变更。
FAB 身份验证管理器中的 /logout
端点现在受到 CSRF 保护。 (#40145)¶
FAB 身份验证管理器中 /logout
端点的方法已从 GET
更改为所有现有 AuthViews(AuthDBView
、AuthLDAPView
、AuthOAuthView
、AuthOIDView
、AuthRemoteUserView
)中的 POST
,现在包含 CSRF 保护,以提高安全性并防止未经授权的注销。
Apache Airflow 的 OpenTelemetry 追踪。 (#37948).¶
此新功能为 Apache Airflow 增加了以下能力:1) 调度程序、触发器、执行器、处理器的 airflow 系统追踪 2) 以 OpenTelemetry 格式部署的 DAG 运行的 DAG 运行追踪。 以前,仅支持指标,这些指标以 OpenTelemetry 格式发出指标。 这个新功能将为用户添加更丰富的数据,以便用户使用 OpenTelemetry 标准来发出其追踪数据并将其发送到 OTLP 兼容端点。
Task Flow 的装饰器 (@skip_if, @run_if)
使应用是否跳过任务变得简单。 (#41116)¶
此功能添加了一个装饰器,使跳过任务变得简单。
同时使用多个执行器。 (#40701)¶
以前称为混合执行器,这项新功能允许 Airflow 同时使用多个执行器。 可以配置 DAG 甚至单个任务,以使用最适合其需求的特定执行器。 单个 DAG 可以包含全部使用不同执行器的任务。 有关更多详细信息,请参阅 Airflow 文档。 注意:此功能仍处于实验阶段。 有关更详细的描述,请参阅执行器文档。
新功能¶
AIP-61 混合执行 (AIP-61)
AIP-62 从 Hook Instrumentation 获取 Lineage (AIP-62)
AIP-64 TaskInstance 尝试历史 (AIP-64)
AIP-44 内部 API (AIP-44)
允许直接从触发器结束任务,而无需进入 worker。 (#40084)
扩展数据集依赖项。 (#40868)
功能/添加 token 身份验证到内部 API。 (#40899)
添加 DatasetAlias 以支持动态数据集事件发布和数据集创建。 (#40478)
为 inlet_events 添加示例 DAG。 (#39893)
实现
accessors
以读取定义为 inlet 的数据集事件。 (#39367)Task Flow 的装饰器,使应用是否跳过任务变得简单。 (#41116)
添加从触发器开始执行对动态任务映射的支持。 (#39912)
将 try_number 添加到日志表。 (#40739)
在宏中添加了 ds_format_locale 方法,允许使用 Babel 本地化日期时间格式。 (#40746)
添加 DatasetAlias 以支持动态数据集事件发布和数据集创建 (#40478, #40723, #40809, #41264, #40830, #40693, #41302)
使用 sentinel 在重新序列化时将 dag 标记为已移除。 (#39825)
在 DAG 文件处理统计信息中添加最后一个数据库查询数的参数。 (#40323)
为 Airflow UI 添加原型版本暗模式。 (#39355)
添加在
dag test
中将某些任务标记为成功的的功能。 (#40010)允许使用可调用对象作为 template_fields。 (#37028)
在主页上过滤正在运行/失败和活动/暂停的 dags。 (#39701)
添加有关任务 CPU 和内存使用情况的指标。 (#39650)
DAG 重新解析功能的 UI 更改。 (#39636)
添加基于 Scarf 的遥测。 (#39510, #41318)
添加 dag 重新解析请求端点。 (#39138)
从网格视图触发后重定向到新的 DAGRun。 (#39569)
在任务实例工具提示中显示
endDate
。 (#39547)实现
accessors
以读取定义为 inlet 的数据集事件 (#39367, #39893)在 UI 中为基于关键字的错误和警告的日志行添加颜色。 (#39006)
将 Rendered k8s pod spec 标签添加到 ti 详细信息视图。 (#39141)
使审计日志 before/after 可过滤。 (#39120)
将网格折叠操作整合到单个全屏切换中。 (#39070)
实现 Metadata 以发布运行时额外信息。 (#38650)
将执行器字段添加到数据库,并将参数添加到运算符。 (#38474)
实现 DatasetEvent extra 的上下文访问器。 (#38481)
将数据集事件信息添加到 dag 图。 (#41012)
添加在 dag 图中切换数据集开/关的按钮。 (#41200)
添加
run_if
&skip_if
装饰器。 (#41116)添加 dag_stats rest api 端点。 (#41017)
为 Dag 导入错误添加侦听器。 (#39739)
允许 DateTimeSensorAsync、FileSensor 和 TimeSensorAsync 在动态任务映射期间从触发器开始执行。 (#41182)
改进¶
允许将 Dag Run 资源设置为 Dag 级别权限:扩展 Dag 的 access_control 功能以允许 Dag Run 资源权限。 (#40703)
提高内部 API 的安全性和错误处理能力。 (#40999)
数据集 UI 改进。 (#40871)
将 DAG 审计日志标签更改为事件日志。 (#40967)
使独立的 dag 文件处理器在 DB 隔离模式下工作。 (#40916)
仅在消费者 DAG 页面上显示源,仅在生产者 DAG 页面上显示触发的 DAG 运行。 (#41300)
更新指标名称以允许多个执行器报告指标。 (#40778)
格式化 DAG 运行计数。 (#39684)
更新
renderedjson
组件的样式。 (#40964)改进 ATTRIBUTE_REMOVED 哨兵,使用类和更多上下文 (#40920)
使 XCom 显示为 React JSON (#40640)
用日志表替换任务上下文日志记录器的用法 (#40867)
回滚所有重试异常 (#40882) (#40883)
支持渲染 ObjectStoragePath 值 (#40638)
添加 try_number 和 map_index 作为日志事件端点的参数 (#40845)
分批轮换 fernet 密钥以限制内存使用 (#40786)
为 ‘last_num_of_db_queries’ 参数添加 gauge 指标 (#40833)
将并行日志消息设置为警告级别以提高可见性 (#39298)
为 DAG 运行的编码添加错误处理 (#40222)
在示例 DAG 中使用 params 代替 dag_run.conf (#40759)
使用示例 DAG 加载示例插件 (#39999)
当 target_dttm 过去时,停止延迟 TimeDeltaSensorAsync 任务 (#40719)
将重要的执行器日志发送到任务日志 (#40468)
在新标签页中打开外部链接 (#40635)
尝试向渲染的模板添加 ReactJSON 视图 (#40639)
加快自定义警告的正则表达式匹配时间 (#40513)
将 DAG.dataset_triggers 重构到时间表类中 (#39321)
将 next_kwargs 添加到 StartTriggerArgs (#40376)
改进 UI 错误处理 (#40350)
当配置值已弃用时,删除 CLI 中的双重警告 (#40319)
实现 XComArg concat() (#40172)
添加了
get_extra_dejson
方法,其中包含嵌套参数,允许您指定是否还要反序列化嵌套的 json 字符串 (#39811)将执行器字段添加到任务实例 API (#40034)
支持在 Windows 上检查数据库路径的绝对性 (#40069)
引入 StartTriggerArgs 并阻止调度程序中的启动触发器初始化 (#39585)
将任务文档添加到网格视图中的详细信息选项卡 (#39899)
允许仅使用 Executor 的类名来指定执行器 (#40131)
删除与 try_number 相关的过时条件逻辑 (#40104)
允许将任务组 ID 作为 BranchMixIn 中的分支传递 (#38883)
Javascript 连接表单会将 CodeMirror 动态应用于所有 textarea (#39812)
在序列化时确定 needs_expansion (#39604)
在引用表中 dag_id 列上添加索引,以加快删除 dag 记录的速度 (#39638)
将任务失败的依赖项添加到详细信息页面 (#38449)
删除 Web 服务器 try_number 调整 (#39623)
在惰性序列中实现切片 (#39483)
统一惰性数据库序列实现 (#39426)
将
__getattr__
添加到任务装饰器存根 (#39425)允许将标签传递给通过插件注册的 FAB 视图 (#39444)
尝试使用 sqlite 进行离线迁移时,提供更简单的错误消息 (#39441)
将 soft_fail 添加到 TriggerDagRunOperator (#39173)
将上下文中的“数据集事件”重命名为使用“outlet” (#39397)
解决
airflow task
命令中的RemovedIn20Warning
(#39244)当数据库隔离时,在客户端确定 fail_stop (#39258)
重构 Python 运算符/装饰器中的 cloudpickle 支持 (#39270)
更新触发器 kwargs 迁移以指定 existing_nullable (#39361)
允许任务直接从触发器程序开始执行,而无需进入 worker (#38674)
更好的
db migrate
错误消息 (#39268)将 stacklevel 添加到
suppress_and_warn
警告 (#39263)支持按 dag_display_name 搜索 (#39008)
允许在 MappedInstances.tsx 中按所有字段排序 (#38090)
在指标中公开计划任务的计数 (#38899)
使用来自
sqlalchemy.orm
的declarative_base
而不是sqlalchemy.ext.declarative
(#39134)添加示例 DAG 来演示发出方法 (#38821)
使
on_task_instance_failed
能够访问导致失败的错误 (#38155)简化数据集序列化 (#38694)
向作业添加心跳恢复消息 (#34457)
删除 TaskInstance.get_task_instance 中的 select_column 选项 (#38571)
如果未从数据库读取 DAG,则不要在 get_dag 中创建会话 (#38553)
为加密的触发器 kwargs 添加迁移脚本 (#38358)
在 TaskInstancePydantic 上实现 render_templates (#38559)
处理 _refresh_from_db 中的可选会话 (#38572)
使 task_command.py 中的类型注解不那么令人困惑 (#38561)
直接使用 fetch_dagrun 以避免创建会话 (#38557)
将
output_processor
参数添加到BashProcessor
(#40843)改进数据库隔离模式的序列化 (#41239)
仅孤立非孤立数据集 (#40806)
根据任务历史记录日期调整甘特图宽度 (#41192)
启用图例中大量元素的滚动 (#41187)
Bug 修复¶
使用 LocalExecutor 运行时,修复 get_parsing_context() 的错误 (#40738)
在视图中显示之前验证提供程序文档 URL (#40933)
移动导入以使 PythonOperator 在 Windows 上工作 (#40424)
修复 dataset_with_extra_from_classic_operator 示例 DAG (#40747)
在更改 ti 状态后调用侦听器 on_task_instance_failed() (#41053)
在 BaseSensor 中添加
never_fail
(#40915)修复 DAG 没有
start_date
时的任务 API 端点 (#40878)修复并调整 UI 网格和旧版运行的 URL 生成 (#40764)
轮换 fernet 密钥优化 (#40758)
修复 validate_database_executor_compatibility() 调用中的类实例与类类型 (#40626)
清理暗模式 (#40466)
验证 DAG、BaseOperator 和 TaskGroup 的 args 的预期类型 (#40269)
BaseSensorOperator 重新调度模式下指数退避不起作用 (#39823)
本地任务作业:添加超时,避免过早杀死 on_task_instance_success 侦听器 (#39890)
将后执行日志分组移动到异常打印后面 (#40146)
修复 HA 设置中的触发器程序竞争条件 (#38666)
将触发的或现有的 DAG 运行逻辑日期传递给 DagStateTrigger (#39960)
将
external_task_group_id
传递给WorkflowTrigger
(#39617)ECS Executor:将任务设置为活动后处于 RUNNING 状态 (#39212)
仅在回填循环中必要时才进行心跳 (#39399)
修复触发器 kwarg 加密迁移 (#39246)
修复降级时触发器 kwargs 的解密 (#38743)
修复 TriggeredDagRuns 中的错误链接 (#41166)
将 MapIndex 传递给外部日志系统的 LogLink 组件 (#41125)
为 worker 任务添加 NonCachingRotatingFileHandler (#41064)
在方法 resolve an optional value 中添加参数 include_xcom (#41062)
清理 example_bash_decorator DAG 中的文件名 (#40949)
在依赖关系图中显示数据集别名 (#41128)
在 DAG 图视图中渲染数据集条件 (#41137)
添加跨 dagruns 的任务持续时间图 (#40755)
为现有核心传感器添加从触发器程序启动执行的支持 (#41021)
添加 dataset_alias 的示例 dag (#41037)
添加数据集别名唯一约束并删除错误的数据集别名删除逻辑 (#41097)
如果存在“数据集别名”,则将“has_outlet_datasets”设置为 true (#41091)
使 HookLineageCollector 按数据集分组 (#41034)
增强 start_trigger_args 序列化 (#40993)
重构
BaseSensorOperator
引入skip_policy
参数 (#40924)修复从触发器程序查看任务被延迟时的日志 (#41272)
重构触发的 dag 运行 url 的替换方式 (#41259)
添加了对其他 sql alchemy 会话参数的支持 (#41048)
允许 TriggerDagRun failed_state 中存在空列表 (#41249)
当 run_as_user 是 airflow 用户时,清理异常处理程序 (#41241)
单击并折叠时折叠文档 (#41214)
将 updated_at 保存到数据库时更新,因为 session.merge 不会触发 on-update (#40782)
修复解析 DAF 文件时的查询计数统计信息 (#41149)
没有
__init__
的运算符中的方法解析顺序 (#41086)确保为空运算符递增 try_number (#40426)
其他¶
从
OTel
跟踪中删除 Experimental 标志 (#40874)将 packaging 版本提升到 23.0,以修复旧版 otel 的问题 (#40865)
简化 _auth_manager_is_authorized_map 函数 (#40803)
在调度程序作业中使用正确的未知执行器异常 (#40700)
将 D1
pydocstyle
规则添加到 pyproject.toml (#40569)在 ruff 中启用强制执行
pydocstyle
规则 D213 (#40448, #40464)更新
Dag.test()
以在需要时与执行器一起运行 (#40205)更新 jest 和 babel 次要版本 (#40203)
重构 BashOperator 和 Bash 装饰器,以实现一致性和简单性 (#39871)
添加
AirflowInternalRuntimeError
以引发non catchable
错误 (#38778)ruff 版本提升 0.4.5 (#39849)
将
pytest
提升到 8.0+ (#39450)删除有关 TI 索引的过时注释 (#39470)
在
DagScheduleDatasetReference.dag
和DagModel.schedule_dataset_references
之间配置back_populates
(#39392)删除 endpoints.py 中的弃用警告 (#39389)
修复 Airflow 核心中的 SQLA 弃用 (#39211)
在 SA 中直接使用类绑定属性 (#39198, #39195)
修复 TaskContextLogger 的 stacklevel (#39142)
捕获收集 DAG 期间的警告 (#39109)
解决核心中的
B028
(no-explicit-stacklevel) (#39123)将模型
ImportError
重命名为ParseImportError
以避免与内置异常冲突 (#39116)添加选项以支持 PythonVenv/External Operator 中的 cloudpickle (#38531)
禁止显示
SubDagOperator
示例警告 (#39057)添加用于运行回调的日志 (#38892)
使用
model_dump
而不是dict
来序列化 Pydantic V2 模型 (#38933)加宽备忘单列以避免包装命令 (#38888)
将
hatchling
更新到最新版本 (1.22.5) (#38780)将 uv 提升到 0.1.29 (#38758)
添加在提供程序测试修复期间发现的缺失序列化 (#41252)
将 /airflow/www 中的
ws
从 7.5.5 提升到 7.5.10 (#40288)改进 TriggerDagRunOperator 中 allowed/failed_states 的类型 (#39855)
仅文档变更¶
在“如何创建自己的提供程序”页面中添加
filesystems
和dataset-uris
(#40801)将 Airflow 存储库中的 (TM) 更正为 (R) (#40783)
在示例 airflow.cfg 中将
otel_on
设置为 True (#40712)为 _AIRFLOW_PATCH_GEVENT 添加警告 (#40677)
更新 Airflow 3 讨论后的多团队图表提案 (#40671)
添加更强烈的警告,说明不再支持 MSSQL 并且不再可用 (#40565)
修复 howto 中具有误导性的 mac 菜单结构 (#40440)
更新文档中支持的 k8s 版本 (#39878)
为 Listeners 添加兼容性说明 (#39544)
使用新的图形视图更新文档示例中的边缘标签图像 (#38802)
更新 UI 文档截图 (#38680)
添加“通过 REST API 操作排队的 Dataset 事件”部分 (#41022)
添加关于 docker compose 缺乏安全保证的信息 (#41072)
在 use params 部分添加指向示例 dags 的链接 (#41031)
将
task_id
从send_email
更改为send_email_notification
在taskflow.rst
中 (#41060)从反向代理文档中删除不必要的 nginx 重定向规则 (#38953)
Airflow 2.9.3 (2024-07-15)¶
重大变更¶
scheduled_duration
和 queued_duration
的时间单位已更改 (#37936)¶
scheduled_duration
和 queued_duration
指标现在以毫秒而不是秒为单位发出。
按照惯例,所有 statsd 指标都应以毫秒为单位发出,这在例如 prometheus
statsd-exporter 中是之后期望的。
对 OpenTelemetry 指标的支持不再是“实验性的” (#40286)¶
自 2.7.0 版本以来,添加了对 OpenTelemetry 的实验性支持,此后添加了修复和改进,现在我们将该功能宣布为稳定。
Bug 修复¶
修复日历视图滚动 (#40458)
验证提供程序列表视图中 url 的提供程序描述 (#40475)
修复与旧 MySQL 8.0 的兼容性 (#40314)
修复 dag 文件缺失的环境中 dag (取消)暂停不起作用的问题 (#40345)
传递给 SQLalchemy 的额外参数 (#40391)
当 tag 的值为 int (job_id) 时,处理不支持的操作数 int + str (#40407)
修复 TriggeredDagRunOperator 触发链接 (#40336)
将
[webserver]update_fab_perms
添加到已弃用的配置 (#40317)将 dag run 链接从旧版图形切换到带有图形选项卡的网格 (#40241)
将
file_task_handler
中的httpx
更改为requests
(#39799)修复 venv jinja 模板中 future 注释的导入 (#40208)
确保 DAG 参数顺序与后端无关 (#40156)
在 TI 批处理 API 端点中使用 join 来获取 TI 备注 (#40028)
改进字符串数组格式验证的触发器 UI (#39993)
禁用 doc_md 的 jinja2 渲染 (#40522)
如果 taskinstance 状态为 skipped,则跳过检查子 dags 列表 (#40578)
识别在日志中解析 url 时的引号 (#40508)
仅文档变更¶
添加关于通过环境变量传递密钥的说明 (#40519)
改进一些令人困惑的日志消息 (#40334)
添加更精确的描述,说明如何屏蔽敏感字段名称 (#40512)
添加关于升级到文档的更详细的指导 (#40227)
Metrics allow_list 完整示例 (#40120)
向已弃用的 api 文档添加警告,说明未应用访问控制 (#40129)
检查本地调度程序是否存活的更简单的命令 (#40074)
添加一个说明和一个示例,阐明 DAG 级别参数的用法 (#40541)
修复 dags.rst 中示例代码的突出显示 (#40114)
添加关于 PostgresOperator 已弃用的警告 (#40662)
将 airflow 下载链接更新为基于 CDN 的链接 (#40618)
修复 DatasetOrTimetable 示例的导入语句 (#40601)
进一步阐明诊断流程 (#40536)
修复 PythonOperator docstring 中的参数顺序 (#40122)
更新 serializers.rst 以提及不支持 bytes (#40597)
其他¶
升级构建安装程序和依赖项 (#40177)
将 /airflow/www 中的 braces 从 3.0.2 升级到 3.0.3 (#40180)
升级到另一个版本的 trove-classifier(新的 CUDA 分类器)(#40564)
重命名与 airflow 概念无关的“try_number”增量 (#39317)
将 trove 分类器更新为最新版本作为构建依赖项 (#40542)
升级到最新版本的
hatchling
作为构建依赖项 (#40387)修复
SchedulerJobRunner._process_executor_events
中的 bug (#40563)删除“blocked”事件的日志记录 (#40446)
Airflow 2.9.2 (2024-06-10)¶
重大变更¶
没有重大更改。
Bug 修复¶
修复导致
AirflowSecurityManagerV2
将事务留在idle in transaction
状态的 bug (#39935)修复 alembic 自动生成和重命名不匹配的约束 (#39032)
将 existing_nullable 添加到迁移的降级侧 (#39374)
修复如果用户缺少权限,则标记实例状态按钮保持禁用的问题 (#37451). (#38732)
在迷你调度程序中使用 SKIP LOCKED 代替 NOWAIT (#39745)
从 FAB 视图中删除 DAG Run Add 选项 (#39881)
在 API 规范中添加 max_consecutive_failed_dag_runs (#39830)
修复 example_branch_operator 在 python 3.12 中失败的问题 (#39783)
当任务尝试重试且没有可用的远程日志时,也获取已提供的日志 (#39496)
更改数据集 URI 验证,以在 Airflow 2.9 中引发警告而不是错误 (#39670)
可见 DAG RUN 不指向相同的 dag run id (#38365)
重构
SafeDogStatsdLogger
以使用get_validator
来启用模式匹配 (#39370)修复安全管理器
has_access
中的自定义操作 (#39421)修复使用错误的参数触发 DAG 时出现的 HTTP 500 内部服务器错误 (#39409)
修复 Airflow Webserver 中禁用了静态文件缓存的问题 (#39345)
修复 TaskHandlerWithCustomFormatter 现在只添加一次前缀 (#38502)
不要在
@apply_lineage
中提供已弃用的execution_date
(#39327)将缺失的 conn_id 添加到 ObjectStoragePath 的字符串表示中 (#39313)
修复
sql_alchemy_engine_args
配置示例 (#38971)将 Cache-Control “no-store” 添加到所有动态生成的内容 (#39550)
其他¶
限制
yandex
提供程序以避免mypy
错误 (#39990)警告迷你调度程序故障而不是调试 (#39760)
更改
provider_info_cache
装饰器的类型定义 (#39750)BaseOperator
defer
的更好类型提示 (#39742)TimeSensor 和 TimeSensorAsync 中更多的类型提示 (#39696)
重新引发来自严格数据集 URI 检查的异常 (#39719)
修复 _log_state 辅助函数的堆栈级别 (#39596)
解决迁移脚本中的 SA 警告 (#39418)
删除
dag_run
表上未使用的索引idx_last_scheduling_decision
(#39275)
仅文档变更¶
提供有关标记 DynamicTaskMapping 的额外提示 (#39977)
提高配置参考中链接/变量/其他配置的可见性 (#39916)
删除
CronDataIntervalTimetable
的“传统”定义 (#39780)更新 plugins.rst 示例以使用 pyproject.toml 代替 setup.py (#39665)
修复 pg 设置文档中的小问题 (#39628)
将 Matomo 添加到跟踪用户活动文档 (#39611)
修复 Connection.get -> Connection. get_connection_from_secrets (#39560)
添加 provider 依赖项的说明 (#39512)
更新 docker-compose 命令 (#39504)
更新关于重启触发器进程的说明 (#39436)
使用无效的存储桶链接更新 S3LogLink (#39424)
更新 testing_packages.rst (#38996)
添加多团队图表 (#38861)
Airflow 2.9.1 (2024-05-03)¶
重大变更¶
Stackdriver 日志记录 bugfix 需要 Google provider 10.17.0
或更高版本 (#38071)¶
如果您使用 Stackdriver 日志记录,则必须使用 Google provider 版本 10.17.0
或更高版本。 Airflow 2.9.1
现在将 gcp_log_name
传递给 StackdriverTaskHandler
而不是 name
,这将在早期 provider 版本上失败。
这修复了一个 bug,在该 bug 中,当 Airflow 配置日志记录时,[logging] remove_base_log_folder
中配置的日志名称被覆盖,导致任务日志转到错误的目标。
Bug 修复¶
使任务日志消息包含 run_id (#39280)
复制导航栏的 menu_item
href
(#39282)修复触发器 kwarg 加密迁移 (#39246, #39361, #39374)
为
firefox
中的 datetime-local 输入添加解决方法 (#39261)向 Task Instance 视图添加 Grid 按钮 (#39223)
尝试获取非运行任务的 Server 端日志,当远程或执行器日志不可用时 (#39177)
修复了菜单过滤导致的菜单消失的副作用 (#39229)
为任务实例的
log_url
使用网格视图 (#39183)改进任务过滤的
UX
(用户体验) (#39119)改进 react dag 页面中 rendered_template 的
ux
(用户体验) (#39122)图形视图的改进 (#38940)
在尝试渲染图形之前,检查数据集(dataset)和任务(task)是否存在 (#39069)
主机名是 "redacted" 而不是 "redact"; 当没有上下文时移除它 (#39037)
在
check_authentication
中检查是否设置了AUTH_ROLE_PUBLIC
(#39012)移动
map_index_template
的渲染,以便在失败的任务中,只要在失败点之前定义了它,就可以渲染 (#38902)取消弃用
暂时取消弃用BaseXCom.get_one
方法 (#38991)为
CreateTableAs
自定义 SA Clause 添加inherit_cache
属性 (#38985)不要在迷你调度器中等待 DagRun 锁 (#38914)
修复没有 DAG Run 的日历视图 (#38964)
更改了图中外部任务的背景颜色 (#38969)
修复 dag run 选择 (#38941)
修复
SAWarning
‘Coercing Subquery object into a select() for use in IN()’ (#38926)修复 AirflowSecurityManagerV2 中的隐式
cartesian
乘积 (#38913)修复了旧版日志视图中的链接无法点击的问题 (#38882)
修复 dag run 链接参数 (#38873)
在 WorkflowTrigger 中使用异步数据库调用 (#38689)
修复审计日志事件过滤器 (#38719)
在类方法中使用
methodtools.lru_cache
而不是functools.lru_cache
(#37757)只有在提供
-I
/--ignore-first-depends-on-past
时,才在airflow dags backfill
中引发已弃用警告 (#38676)
其他¶
TriggerDagRunOperator
弃用execution_date
,建议使用logical_date
(#39285)强制在
@deprecated
装饰器上使用 Airflow 弃用警告类别 (#39205)添加关于在 Windows 下运行/导入 Airflow 的警告 (#39196)
更新来自身份验证管理器的
is_authorized_custom_view
以处理自定义操作 (#39167)在 Trove 分类器中添加 Python 3.12 支持 (#39004)
对
minischeduler
跳过使用调试级别 (#38976)在
/airflow/www
中,将undici
从5.28.3 升级到 5.28.4
(#38751)
仅文档更改¶
修复文档中支持的 k8s 版本 (#39172)
动态任务映射
PythonOperator
op_kwargs (#39242)添加指向
user
和role
命令的链接 (#39224)在文档中将
k8s 1.29
添加到支持的版本 (#39168)数据感知调度文档编辑 (#38687)
更新
DagBag
类文档字符串以包含所有参数 (#38814)更正 taskflow 示例 (#39015)
从渲染字段示例中删除装饰器 (#38827)
Airflow 2.9.0 (2024-04-08)¶
重大变更¶
以下 Listener API 方法被认为是稳定的,可以用于生产系统(在较旧的 Airflow 版本中是实验性功能)(#36376):¶
生命周期事件
on_starting
before_stopping
DagRun 状态更改事件
on_dag_run_running
on_dag_run_success
on_dag_run_failed
TaskInstance 状态更改事件
on_task_instance_running
on_task_instance_success
on_task_instance_failed
已删除对 Airflow Meta Database 的 Microsoft SQL-Server 的支持 (#36514)¶
经过 讨论 和 投票 过程后,Airflow 的 PMC 成员和提交者已达成决议,不再维护 MsSQL 作为受支持的数据库后端。
从 Airflow 2.9.0 开始,已删除对 Airflow 数据库后端的 MsSQL 的支持。
在升级到 Airflow 2.9.0 *之前*,可以帮助迁移数据库的迁移脚本可在 Github 上的 airflow-mssql-migration 仓库 中找到。 请注意,迁移脚本不提供支持和保证。
这不会影响现有的提供程序包(operators 和 hooks),DAG 仍然可以访问和处理来自 MsSQL 的数据。
现在输入时会验证数据集 URI (#37005)¶
数据集必须使用符合 AIP-60 中规定的规则的 URI,并且在解析 DAG 文件时,该值将自动标准化。 有关规则的更详细说明,请参阅 关于数据集的文档。
如果你的数据集标识符看起来像 URI,但以不太主流的方式使用(例如依赖于 URI 的身份验证部分或具有区分大小写的协议名称),则可能需要更改它们。
将 REST API 操作添加到审计日志事件 (#37734)¶
REST API 事件的审计日志 event
名称将以 api.
或 ui.
开头,具体取决于它来自 Airflow UI 还是外部。
正式支持 Python 3.12 (#38025)¶
不过,有一些注意事项
Pendulum2 不支持 Python 3.12。 对于 Python 3.12,你需要使用 Pendulum 3
对于 Python 3.12,安装了 Pandas 时支持的最低 SQLAlchemy 版本是
1.4.36
,于 2022 年 4 月发布。 Airflow 2.9.0 将所有 Python 版本的 SQLAlchemy 的最低支持版本提高到1.4.36
。
并非所有提供程序都支持 Python 3.12。 在 Airflow 2.9.0 的初始版本中,以下提供程序未发布对 Python 3.12 的支持
apache.beam
- 等待 Apache Beam 对 3.12 的支持
papermill
- 等待发布 Python 3.12 兼容的 papermill 客户端版本 包括此合并的问题
防止将大型字符串对象存储在渲染的模板字段中 (#38094)¶
现在,可以存储在渲染的模板字段中的数据长度受到限制。 该限制设置为 4096 个字符。 如果数据超过此限制,将被截断。 你可以通过在 Airflow 配置中设置 [core]max_template_field_length
配置选项来更改此限制。
将 xcom 表列 value 类型更改为 MySQL 后端的 longblob (#38401)¶
Xcom 表列 value
类型已从 blob
更改为 longblob
。 这将允许你在 Xcom 中存储相对较大的数据,但是如果你在 Xcom 中存储了大量大型数据,则处理可能需要大量时间。
要从修订版本 b4078ac230a1
降级,请确保你的 Xcom 值不大于 65,535 字节。 否则,你需要清理这些行或运行 airflow db clean xcom
来清理 Xcom 表。
对 taskflow 上下文变量中的 key 参数默认值进行更严格的验证 (#38015)¶
对于任务流实现,当上下文变量存在默认值时,可能会生成无效的参数顺序。现在不再接受(并且已验证)使用非 None
的默认值定义任务流函数。如果之前您这样做过,您很可能会看到一个损坏的 DAG,以及一个类似 Error message: Context key parameter my_param can't have a default other than None
的错误消息。
新特性¶
允许用户使用其本国字符编写 dag_id 和 task_id,为 DAG/任务添加显示名称 (v2) (#38446)
防止将大型对象存储在 RTIF 中 (#38094)
当结束日期不存在时,使用当前时间计算持续时间。 (#38375)
在任务和 DAG 运行持续时间图表中添加平均持续时间标记线。 (#38214, #38434)
添加手动创建数据集事件的按钮 (#38305)
添加
Matomo
作为 analytics_tool 的一个选项。 (#38221)实验性功能:支持自定义 weight_rule 实现来计算 TI 的 priority_weight (#38222)
添加在 DAG 连续失败 X 次后自动将其关闭的功能 (#36935)
向下一个运行数据集模态框添加数据集条件 (#38123)
向 UI 添加任务日志分组 (#38021)
向网格 DAG 详细信息添加 dataset_expression (#38121)
引入支持多个执行器配置的机制 (#37635)
为任务执行日志中的 ANSI 字符添加颜色格式 (#37985)
将 dataset_expression 作为 DagModel 和 DAGDetailSchema 的一部分添加 (#37826)
允许更长的 rendered_map_index (#37798)
为 DatasetOrTimeSchedule 继承 DatasetTriggeredTimetable 的 run_ordering (#37775)
实现 AIP-60 数据集 URI 格式 (#37005)
为数据集条件逻辑引入逻辑运算符 (#37101)
为数据集事件添加 post 端点 (#37570)
在 UI 中显示映射任务的自定义实例名称 (#36797)
向 get_event_logs API 添加 excluded/included events (#37641)
向 DAG 图形添加数据集 (#37604)
在网格视图中的任务/运行详细信息上方显示数据集事件 (#37603)
引入新的配置变量来控制 DAG 处理器是否输出到 stdout (#37439)
使 Datasets
hashable
(#37465)为数据集触发添加条件逻辑 (#37016)
在 react 中实现任务持续时间页面。 (#35863)
添加
queuedEvent
端点以获取/删除 DatasetDagRunQueue (#37176)支持 BaseOperator 中的多个 XCom 输出 (#37297)
AIP-58: 为 xcom 添加对象存储后端 (#37058)
引入
DatasetOrTimeSchedule
(#36710)向
BaseOperator
添加on_skipped_callback
(#36374)允许覆盖悬停的导航栏颜色 (#36631)
创建带有标记的新指标 (#36528)
为 AFS 和 common.io 添加对 openlineage 的支持 (#36410)
引入
@task.bash
TaskFlow 装饰器 (#30176, #37875)
改进¶
为数据库清理提供更人性化的“show tables”输出 (#38654)
通过合并 alive_triggerer_ids 和 get_sorted_triggers 查询来改进触发器分配_unassigned (#38664)
向审计日志添加排除/包含事件过滤器 (#38506)
在除 MySQL 之外的所有方言的单个查询中清理未使用的触发器 (#38663)
更新对生产等敏感环境中配置更改的确认逻辑 (#38299)
改进数据集图表 UX (#38476)
仅显示上次运行之后最新的数据集事件时间戳 (#38340)
添加按钮以清除 DAG 运行中仅失败的任务。 (#38217)
删除所有旧的 DAG 页面并重定向到网格视图 (#37988)
在使用 sentry.add_tagging() 之前检查任务属性 (#37143)
Mysql 更改 MySQL 后端的 xcom value col 类型 (#38401)
ExternalPythonOperator
使用来自sys.version_info
的版本 (#38377)将过于宽泛的异常替换到 Core 中 (#38344)
为 DAG 的批量暂停和恢复添加 CLI 支持 (#38265)
在 TaskInstancePydantic 和 DagRunPydantic 上实现方法 (#38295, #38302, #38303, #38297)
使过滤器栏可折叠并添加全屏切换 (#38296)
加密所有触发器属性 (#38233, #38358, #38743)
升级 react-table 包。与审计日志表一起使用 (#38092)
显示 DAG 页面过滤器是否处于活动状态 (#38080)
向映射实例添加尝试次数 (#38097)
向作业心跳添加重试 (#37541)
向审计日志添加 REST API 事件 (#37734)
使当前工作目录作为 BashOperator 中的模板化字段 (#37968)
向 react 添加日历视图 (#37909)
向日志表添加
run_id
列 (#37731)向网格任务实例工具提示添加
tryNumber
(#37911)Session 未在 _do_render_template_fields 中使用 (#37856)
改进 MappedOperator 属性类型 (#37870)
从 TaskInstancePydantic 方法中删除 provide_session 装饰器 (#37853)
确保用于 TaskInstancePydantic 和 TaskInstance 的 “airflow.task” 日志记录器 (#37857)
更好的内部 API 调用错误消息 (#37852)
增加 DAG 网格视图的工具提示大小 (#37782) (#37805)
使用命名日志记录器而不是根日志记录器 (#37801)
在 React 中添加运行持续时间 (#37735)
避免不推荐使用的日志记录 (#37792)
改进 DateTimeTrigger 类型 (#37694)
确保所有唯一的 run_ids 都呈现任务持续时间栏 (#37717)
向 React 添加 DAG 审计日志 (#37682)
为自动暂停添加日志事件 (#38243)
为模板化基础运算符字段的异常提供更好的消息 (#37668)
清理添加到审计日志的 Web 服务器端点 (#37580)
按 dag_id 过滤数据集图 (#37464)
使用继承自 BaseException 的新异常类型用于 SIGTERMs (#37613)
重构数据集类继承 (#37590)
简化包版本检查 (#37585)
按关联的 dag_ids 过滤数据集(GET /datasets)(#37512)
启用“airflow tasks test”来运行可延迟运算符 (#37542)
使数据集列表/图表宽度可调整 (#37425)
加速确定
ExternalPythonOperator
中安装的 Airflow 版本 (#37409)从 REST API 添加更多任务详细信息 (#37394)
为 DAG 运行操作添加确认对话框 (#35393)
向 STATE_COLORS 添加了关闭颜色 (#37295)
删除旧的 DAG 详细信息页面并重定向到网格 (#37232)
按 API 中的地图索引排序 XCom 条目 (#37086)
在 DAG 运行创建 API 端点中添加 data_interval_start 和 data_interval_end (#36630)
通过防止 HTML 注入,使任务日志中的链接成为超链接 (#36829)
改进 ExternalTaskSensor 异步实现 (#36916)
使 Datasets
Pathlike
(#36947)简化孤立任务的查询 (#36566)
在 FileSensor 中添加 deferrable 参数 (#36840)
运行触发器页面:可配置的最近配置数量 (#36878)
将
nowait
和 skip_locked 合并到 with_row_locks 中 (#36889)在 REST API 中获取
dag/dagRun
时返回指定的字段 (#36641)仅当为 DagFileProcessorManager 启用调试时才迭代这些项目 (#36761)
为指标允许和阻止列表添加模糊/正则表达式模式匹配 (#36250)
允许 CLI DAG 列表中的自定义列 (#35250)
可以更改默认的 cron 时间表 (#34851)
对 Airflow IO 代码的一些改进 (#36259)
改进 TaskInstance 类型提示 (#36487)
从身份验证管理器接口中删除
Connexion
的依赖关系 (#36209)重构 ExternalDagLink 以不创建临时的 TaskInstances (#36135)
Bug 修复¶
当 gunicorn worker 启动时加载 providers 配置 (#38795)
修复网格标题渲染 (#38720)
为映射的依赖项添加任务实例依赖项 (#37498)
提高 remove_task_decorator 函数的稳定性 (#38649)
将 API 上更多的字段标记为仅转储 (#38616)
修复事件日志端点上的
total_entries
计数 (#38625)向日志块底部添加填充。 (#38610)
正确序列化嵌套的 attrs 类 (#38591)
修复下一个运行 ID 信息中的
tz
(#38482)在网格视图中显示废弃的任务 (#38511)
一致地应用任务实例 mutation hook (#38440)
覆盖
chakra
样式以将dropdowns
保留在过滤器栏中 (#38456)以秒为单位存储持续时间,并进行缩放以处理系列中某个值具有比之前的持续时间更大的单位的情况。 (#38374)
不允许上下文参数中使用 None 以外的默认值,并改进错误消息 (#38015)
使 postgresql 默认引擎参数符合 SA 2.0 (#38362)
向触发器中的 while 循环中的 yield 添加 return 语句 (#38389)
确保在装饰器上下文管理器中调用
__exit__
(#38383)使方法
BaseAuthManager.is_authorized_custom_view
成为抽象方法 (#37915)向上限计划的日历事件计算 (#38310)
修复守护程序模式下的调度程序不会在指定位置创建 PID (#38117)
正确序列化 TaskInstancePydantic 和 DagRunPydantic (#37855)
修复图形任务状态边框颜色 (#38084)
添加回在安全管理器中删除的方法 (#37997)
不要将 worker serve-logs 中的“403”记录为“未知错误”。 (#37933)
修复
/get_logs_with_metadata
端点中的执行数据验证错误 (#37756)修复任务持续时间选择 (#37630)
避免在 SQLAlchemy v2 中将
encoding
传递给 SQL 引擎 (#37545)修复最新 DAG 运行语句中的“隐式强制 SELECT 对象转换为标量子查询” (#37505)
使用 max_execution_date 查询构建器清理类型 (#36958)
在单个 DAG 情况下优化 max_execution_date 查询 (#33242)
修复 get_dagmodel 为 None 时的 list dags 命令 (#36739)
在数据集侦听器之前,立即加载
consuming_dags
属性 (#36247)
杂项¶
从 UI 中删除参数的显示 (#38660)
将 scheduled_duration 指标的日志级别从警告更新为调试 (#38180)
使用
importlib_metadata
与 Python 3.10/3.12stdlib
兼容 (#38366)重构 BaseOperatorMeta 的
__new__
魔术方法以避免错误地混合经典运算符和装饰运算符 (#37937)使用
sys.version_info
来确定 Python Major.Minor (#38372)添加缺少的已弃用的 Fab 身份验证管理器 (#38376)
从 Airflow 包中删除未使用的循环变量 (#38308)
在 UI 中添加最大连续失败 DAG 运行的信息 (#38229)
提升
blinker
的最低版本,并在需要的地方添加 (#38140)在 /airflow/www 中将 follow-redirects 从 1.15.4 升级到 1.15.6 (#38156)
将 Cryptography 升级到
> 39.0.0
(#38112)添加 Python 3.12 支持 (#36755, #38025, #36595)
避免在测试之外使用
assert
(#37718)更新 ObjectStoragePath 以支持 universal_pathlib>=v0.2.2 (#37930)
解决 G004:日志语句使用 f-string (#37873)
更新构建和安装依赖项。 (#37910)
在 /airflow/www 中将 sanitize-html 从 2.11.0 升级到 2.12.1 (#37833)
更新到最新的安装程序版本。 (#37754)
弃用 airflow 设置/local_settings 中的 smtp 配置 (#37711)
将 PY* 常量弃用到 airflow 模块中 (#37575)
删除对已弃用的
flask._request_ctx_stack
的使用 (#37522)删除
airflow.__init__.py
中多余的login
属性 (#37565)升级到 FAB 4.3.11 (#37233)
删除 SCHEDULED_DEPS,自 2.0.0 以来已不再使用 (#37140)
在核心代码中将
datetime.datetime.utcnow
替换为airflow.utils.timezone.utcnow
(#35448)提升 aiohttp 的最低版本以避免 CVE-2024-23829 和 CVE-2024-23334 (#37110)
将与 FAB 身份验证管理器相关的配置移动到 FAB 提供程序 (#36232)
从 Airflow 核心中删除 MSSQL 支持 (#36514)
从身份验证管理器中删除
is_authorized_cluster_activity
(#36175)创建 FAB 提供程序并将 FAB 身份验证管理器移动到其中 (#35926)
仅文档更改¶
改进时间表文档 (#38505)
按字母顺序重新排列 OpenAPI 规范标签 (#38717)
更新文档中的 UI 屏幕截图 (#38680, #38403, #38438, #38435)
删除该部分,因为它在数据集表达式 PR 中不再正确 (#38370)
重构 DatasetOrTimeSchedule 时间表文档 (#37771)
将执行器文档迁移到相应的提供程序 (#37728)
添加指令以呈现 URI 方案列表 (#37700)
添加包含提供程序弃用的文档页面 (#37075)
添加对安全策略的交叉引用 (#37004)
改进 AIRFLOW__WEBSERVER__BASE_URL 文档 (#37003)
使用(希望)更清晰的 start_date 描述更新 faq.rst (#36846)
更新有关 operators 的公共接口文档 (#36767)
将
exception
添加到模板参考列表 (#36656)将身份验证管理器接口添加为公共接口 (#36312)
在 Airflow 文档中引用 fab 提供程序文档 (#36310)
创建身份验证管理器文档 (#36211)
更新权限文档 (#36120)
改进 _covers_every_hour 的文档字符串 (#36081)
添加任务实例、dag 和生命周期监听器是非实验性的说明 (#36376)
Airflow 2.8.4 (2024-03-25)¶
重大更改¶
没有重大更改。
Bug 修复¶
修复
FixedTimezone
的错误序列化 (#38139)修复日志任务处理程序的过度权限更改 (#38164)
修复任务实例列表链接 (#38096)
修复调度程序心跳参数未被使用的错误 (#37992)
添加填充以防止网格水平滚动重叠任务 (#37942)
修复
ObjectStoragePath
中的哈希缓存 (#37769)
其他¶
限制
importlib_resources
,因为它会破坏pytest_rewrites
(#38095, #38139)将
pandas
限制为<2.2
(#37748)升级
croniter
以修复 2 月 29 日 cron 表达式的问题 (#38198)
仅文档更改¶
告诉用户如果他们的扫描仪在图像中发现问题该怎么办 (#37652)
添加关于使用 PyCharm 在 Docker Compose 中调试的部分 (#37940)
更新可延期文档以阐明触发器恢复 operator 时的 kwargs (#38122)
Airflow 2.8.3 (2024-03-11)¶
重大更改¶
现在,在安装 Airflow 时,SMTP 提供程序已预先安装。 (#37713)¶
Bug 修复¶
在身份验证管理器中添加“MENU”权限 (#37881)
修复 external_executor_id 被覆盖的问题 (#37784)
使更多 MappedOperator 成员可修改 (#37828)
在 dag 测试命令中设置解析上下文 dag_id (#37606)
其他¶
从安全管理器中删除无用的方法 (#37889)
提高 TriggerRuleDep 的代码覆盖率 (#37680)
安装 Airflow 时,SMTP 提供程序现在已预先安装 (#37713)
提升 openapi 验证器的最低版本 (#37691)
正确包含
airflow_pre_installed_providers.txt
文件 (#37679)
仅文档更改¶
阐明 workers 和 scheduler 之间缺乏同步 (#37913)
简化一些围绕 airflow_local_settings 的文档 (#37835)
添加关于本地设置配置的部分 (#37829)
修复
BranchDayOfWeekOperator
的文档 (#37813)设计上不支持写入密钥存储 (#37814)
ERD
生成文档改进 (#37808)更新不正确的配置值 (#37706)
更新安全模型以阐明 Connection Editing 用户的能力 (#37688)
修复示例 dags 中的 ImportError (#37571)
Airflow 2.8.2 (2024-02-26)¶
重大更改¶
allowed_deserialization_classes
标志现在遵循 glob 模式 (#36147)。¶
例如,如果想要将类 airflow.tests.custom_class
添加到 allowed_deserialization_classes
列表,可以通过编写完整的类名 (airflow.tests.custom_class
) 或像 glob 搜索中使用的模式 (例如,airflow.*
, airflow.tests.*
) 来完成。
如果您当前使用自定义 regexp 路径,请确保将其重写为 glob 模式。
或者,如果您仍然希望将其作为 regexp 模式匹配,请将其添加到新的列表 allowed_deserialization_classes_regexp
下。
为了提高安全性,audit_logs 权限已更新 (#37501)。¶
这是在一种策略下完成的,即我们不希望像 Viewer、Ops 和其他非 Admin 用户访问 audit_logs。 此更改背后的意图是限制权限较少的用户查看用户详细信息,例如审计日志中的名字、电子邮件等,而他们未被允许这样做。
此更改的影响是,具有非管理员权限的现有用户将无法查看或访问 audit_logs,无论是从“浏览”选项卡还是从 DAG 运行。
AirflowTimeoutError
不再通过 Exception
默认 except
(#35653)。¶
现在 AirflowTimeoutError
继承 BaseException
而不是 AirflowException
->``Exception``。 参见 https://docs.pythonlang.cn/3/library/exceptions.html#exception-hierarchy
这可以防止代码捕获 Exception
意外地捕获 AirflowTimeoutError
并继续运行。 AirflowTimeoutError
是取消任务的明确意图,不应在尝试处理错误并返回一些默认值的过程中被捕获。
仍然可以通过显式 except``ing ``AirflowTimeoutError
或 BaseException
来捕获 AirflowTimeoutError
。 不建议这样做,因为它可能允许代码在发出此类取消请求后继续运行。 建议之前依赖于在每次捕获 Exception
后执行严格清理的代码使用 finally
块或上下文管理器。 仅执行清理,然后自动重新引发异常。 请参阅关于捕获 KeyboardInterrupt
的类似注意事项,网址为 https://docs.pythonlang.cn/3/library/exceptions.html#KeyboardInterrupt
Bug 修复¶
按 last_runtime 排序 dag 处理统计信息 (#37302)
允许通过 URL 参数预先填充触发器表单值 (#37497)
用于获取 dag 网格视图的基本日期必须包含选定的 run_id (#34887)
检查 ImportError 的权限 (#37468)
将
IMPORT_ERROR
从 DAG 相关权限移动到视图相关权限 (#37292)将
AirflowTaskTimeout
更改为继承BaseException
(#35653)还原“修复了当 max_active_runs 达到其上限时,未来的 DagRun 很少被竞争条件触发的问题。 (#31414)” (#37596)
将边距更改为内边距,以便可以选择第一个任务 (#37527)
修复
namedtuple
的 Airflow 序列化 (#37168)修复点击 url 不安全标签的错误 (#37395)
为
Treeview
函数设置确定性和新的 getter (#37162)修复日志文件处理程序的父文件夹的权限 (#37310)
修复指定
access_entity
时 DAG 的权限检查 (#37290)修复
dateTimeAttrFormat
常量的值 (#37285)解决触发器关闭时的处理程序关闭竞争条件 (#37206)
修复各种视图的状态图标对齐 (#36804)
删除多余的
@Sentry.enrich_errors
(#37002)使用 execution_date= 参数作为网格视图的基本日期的备份 (#37018)
处理任务中引发的 SystemExit。 (#36986)
从除管理员之外的所有用户撤销 audit_log 权限 (#37501)
修复 allowed_deserialization_classes 的中断正则表达式 (#36147)
修复影响 DAG 结束日期的错误 (#36144)
根据任务名称长度调整节点宽度 (#37254)
修复:如果任何 python_callable 函数与 DAG 在同一源文件中定义,则 PythonVirtualenvOperator 崩溃 (#37165)
修复折叠网格宽度,将选定的条与甘特图对齐 (#37205)
调整图节点布局 (#37207)
恢复初始化配置默认值的顺序 (#37155)
在 TaskInstance 视图中显示“实际”尝试次数 (#34635)
当启用 show_trigger_form_if_no_params 时,修复使用参数触发 DAG 成为强制性的 Bug (#37063)
Secret masker 忽略包含特殊字符的密码 (#36692)
修复具有 UPSTREAM_FAILED 任务的 DagRuns 卡在回填中的问题。(#36954)
禁用
dryrun
自动获取 (#36941)修复 DAG 运行配置上的复制按钮 (#36855)
修复了在 run_id 中用 + 替换空格引入的 Bug (#36877)
修复了如果用户未登录,Webserver 始终重定向到主页的问题 (#36833)
REST API 设置 POST 到
/variables
端点的描述 (#36820)清理 conn_id 以禁止潜在的脚本执行 (#32867)
修复了任务 ID 复制按钮复制错误 ID 的问题 (#34904)
修复 fab provider 中的安全管理器继承问题 (#36538)
避免使用
pendulum.from_timestamp
(#37160)
其他¶
安装最新的 docker
CLI
,而不是特定的版本 (#37651)将
/airflow/www
中的undici
从5.26.3
升级到5.28.3
(#37493)在
providers/pyproject.toml
中添加 Python3.12
的排除项 (#37404)从核心依赖项中移除
markdown
(#37396)移除未使用的
pageSize
方法。(#37319)添加 more-itertools 作为 common-sql 的依赖项 (#37359)
替换其他的
Python 3.11
和3.12
弃用 (#37478)将
airflow_pre_installed_providers.txt
包含到sdist
发行版中 (#37388)将 Pydantic 变为可选依赖项 (#37320)
限制
universal-pathlib to < 0.2.0
(#37311)允许针对用于测试的 SQLite 内存数据库运行 airflow (#37144)
添加
queue_when
的描述 (#36997)更新环境变量
sql_alchemy_connect_args
的config.yml
(#36526)将
Alembic 的最小版本升级到 1.13.1
(#36928)限制
flask-session
到<0.6
(#36895)
仅文档更改¶
修复升级文档以反映可用的真实
CLI
标志 (#37231)修复基础文档中的一个 Bug (#37440)
为已弃用的页面添加重定向 (#37384)
修复
otel
配置描述 (#37229)使用
prereqs
部分更新Objectstore
教程 (#36983)添加关于避免使用通用
package/module
名称的更精确的描述 (#36927)将 airflow 版本替换添加到 Docker Compose Howto (#37177)
将关于 DAG 作者功能的说明添加到安全模型 (#37141)
将 cron 基础知识的文档移动到 Authoring and Scheduling 部分 (#37049)
链接到升级文档中的发行说明 (#36923)
自动阻止运算符的
__init__
中的模板字段逻辑检查 (#33786)
Airflow 2.8.1 (2024-01-19)¶
重大变更¶
核心依赖项 pendulum
包的目标版本设置为 3 (#36281)。¶
对 pendulum 2.1.2 的支持将暂时保留一段时间,大概直到 Airflow 的下一个功能版本。建议尽快升级用户代码以使用 pendulum 3。
Pendulum 3 引入了一些细微的不兼容性,您可能在代码中依赖它们 - 例如,日期默认渲染中缺少渲染日期表示中的 T
,这不符合 ISO8601 标准。如果您依赖于日期的默认渲染,您可能需要调整您的代码以使用 isoformat()
方法以 ISO8601 格式渲染日期。
Airflow 打包规范遵循现代 Python 打包标准 (#36537)。¶
我们标准化了 Airflow 依赖配置,通过使用 pyproject.toml
来遵循 Python 打包的最新发展。Airflow 现在符合这些已接受的 PEP:
此外,我们还实现了来自草案的多个许可证文件支持,该草案尚未被接受(但受 hatchling
支持)PEP:* PEP 639 通过更好的包元数据提高许可证清晰度
如果用户使用的是现代 Python 打包和开发工具,这对用户几乎没有明显的影响,一般来说,从 PyPI 安装 Airflow 时,它的行为应该和以前一样,并且使用 pip install -e ".[devel]"
以开发目的安装它应该容易得多。
从用户角度来看,差异是
Airflow 的 extras 现在获得的 extras 规范化为
-
(遵循 PEP-685)而不是_
和.
(就像以前在某些 extras 中一样)。当您使用此类 extras 安装 airflow(例如dbt.core
或all_dbs
)时,您应该使用-
而不是_
和.
。
在大多数现代工具中,这将以向后兼容的方式工作,但在某些旧版本的工具中,您可能需要将 _
和 .
替换为 -
。您也可能会收到警告,提示您安装的 extra 不存在 - 但通常此警告是无害的,并且无论如何都会安装 extra。但是,建议在您的所有 Airflow extras 的依赖规范中更改为使用 -
。
发布的 airflow 包不包含
devel
、devel-*
、doc
和docs-gen
extras。只有当您以--editable
模式从源代码安装 Airflow 时,这些 extras 才可用。这是因为这些 extras 仅用于开发和文档构建目的,在为生产使用安装 Airflow 时不需要。无论如何,这些依赖项对于发布的包具有未指定的和不同的行为,并且您不应该在发布的包中使用它们。当使用约束安装 Airflow 时,
all
和all-*
extras 并非总是能正确工作,因为它们也被认为是仅用于开发的依赖项。通过此更改,这些依赖项现在可以正确处理约束,并且在使用约束时它们将通过约束正确安装,从而拉取正确的 providers 和依赖项集。
Graphviz 依赖项现在是可选的,而不是必需的 (#36647)。¶
作为 Airflow 的必需依赖项,graphviz
依赖项一直存在问题 - 尤其是对于基于 ARM 的安装。Graphviz 包需要二进制 graphviz 库 - 这已经是一个限制,但它们还需要安装 graphviz Python 绑定才能构建和安装。这对于旧的 Linux 安装不起作用,但更重要的是 - 当您尝试为 ARM M1 MacBooks 安装 Python 3.8、3.9 的 Graphviz 库时,由于 M1 的 Python 绑定编译只能用于 Python 3.10+,因此包安装失败。
从技术上讲,这不是一个重大更改 - 渲染 DAG 的 CLI 仍然存在,如果您已经安装了 graphviz,它将继续像以前一样工作。当它不起作用的唯一问题是您没有安装 graphviz 时,它会引发一个错误并通知您需要它。
对于大多数用户来说,仍然会安装 Graphviz
Airflow 镜像仍然会包含 graphviz 库,因为它作为 extra 添加在那里
如果已经安装了以前版本的 Airflow,那么 graphviz 库已经安装在那里,Airflow 将继续像以前一样工作
唯一的更改是从头开始全新安装新版本的 Airflow,为了启用 DAG 渲染选项,需要将 graphviz 指定为 extra 或单独安装。
Bug 修复¶
修复 airflow-scheduler 因异常退出代码为 0 的问题 (#36800)
修复当已删除的任务是
taskinstance
列表中最后一个任务时的回调异常 (#36693)当设置
AUTH_ROLE_PUBLIC=admin
时,允许匿名用户编辑/显示资源 (#36750)当 SQLite URL 使用相对路径时,提供更好的错误消息 (#36774)
强制将整数类型的 run_ids 作为字符串传递,需要显式字符串转换 (#36756)
为空的
op
子类型添加日志查找异常 (#35536)移除任务实例上未使用的索引 (#36737)
修复 Python 3.10+ 中
_infer_multiple_outputs
中typing.Union
的子类检查 (#36728)确保即使在使用
TypedDict
时也能正确推断multiple_outputs
(#36652)在旧版安全管理器中添加回 FAB 常量 (#36719)
修复使用
Dagrun.update_state
时出现的 AttributeError (#36712)如果
catchup=False
,则不允许EventsTimetable
调度过去的事件 (#36134)支持加密触发器参数 (#36492)
修复
_process_executor_events
中tis_query
的类型提示 (#36655)当用户没有访问页面的权限时,重定向到索引页 (#36623)
避免在
call_regular_interval
中使用 dict 作为默认值 (#36608)移除在 UI 中将任务实例设置为运行状态的选项 (#36518)
修复使用动态任务映射时未显示详细信息选项卡的问题 (#36522)
当运行
dag test
时,如果DagRun
失败,则引发错误 (#36517)通过批量刷新 TIs 重构
_manage_executor_state
(#36502)添加 Flask 配置:
MAX_CONTENT_LENGTH
(#36401)修复嵌套组中 teardown 的 get_leaves 计算 (#36456)
停止将时区未知的 datetime 序列化为具有 UTC 时区的时区已知的 datetime (#36379)
使
kubernetes
装饰器类型注释与操作符一致 (#36405)修复 Webserver 为匿名用户向
api/dag/*/dagrun
发出的 POST 请求返回 500 错误 (#36275)修复 get_variable 端点所需的访问权限 (#36396)
修复
DAG.is_fixed_time_schedule
中的 datetime 引用 (#36370)修复 BashOperator 引发的 AirflowSkipException 消息 (#36354)
允许 PythonVirtualenvOperator.skip_on_exit_code 为零 (#36361)
增加 trigger.html 中 execution_date 输入的宽度 (#36278)
修复暂停 DAG 的日志记录 (#36182)
当 enable_xcom_pickling 为 False 时,停止反序列化 pickle (#36255)
在访问 DAG 代码之前检查 DAG 读取权限 (#36257)
始终启用将任务标记为失败/成功 (#36254)
创建最新的日志目录符号链接作为相对链接 (#36019)
修复基于 Python 的装饰器的模板 (#36103)
其他¶
将并发标签重命名为最大活动任务数 (#36691)
恢复文件任务处理程序中的函数范围
httpx
导入以提高性能 (#36753)添加对 Pendulum 3 的支持 (#36281)
标准化 Airflow 构建过程并切换到
hatchling
构建后端 (#36537)移除
CVE-2023-47248
的pyarrow-hotfix
(#36697)使
graphviz
依赖项成为可选 (#36647)宣布 Airflow 2.9.0 中 MSSQL 支持结束,添加迁移脚本提示 (#36509)
将所有 provider 和 airflow 的最小
pandas
依赖项设置为 1.2.5 (#36698)在
/airflow/www
中将 follow-redirects 从 1.15.3 升级到 1.15.4 (#36700)提供 logger_name 参数给 base hook,以便覆盖 logger 名称 (#36674)
修复运行类型图标与运行类型文本的对齐 (#36616)
遵循 FSHook 中的 BaseHook 连接字段方法签名 (#36444)
移除冗余的
docker
装饰器类型注释 (#36406)简化工作日时间表的类型 (#36296)
使用
batch_is_authorized_dag
检查用户是否具有读取 DAG 的权限 (#36279)替换已弃用的 get_accessible_dag_ids 并在 get_dag_warnings 中使用 get_readable_dags (#36256)
仅文档更改¶
指标标签文档 (#36627)
在文档中使用 logical_date 代替已弃用的 execution_date (#36654)
添加关于 Airflow 实时升级的部分 (#36637)
用演示顶级代码的实际练习替换
numpy
示例 (#35097)改进并添加架构图的更完整描述 (#36513)
改进 Web 服务器出现错误时显示的错误消息 (#36570)
使用有关 DAG 暂停的信息更新
dags.rst
(#36540)升级到 Debian Bookworm 后更新安装先决条件 (#36521)
添加有关用户应如何进行数据库监控的描述 (#36483)
将基于映射的任务组示例添加到 dynamic-task-mapping.rst (#36480)
向替换文档添加更多详细信息 (#36485)
在描述优先级加权方法时使用卡片 (#36411)
更新
metrics.rst
以获得参数dagrun.schedule_delay
(#36404)更新 Python 运算符文档中的警告,以反映情感 (#36340)
改进 audit_logs.rst (#36213)
从托管 Postgres 后端的列表中删除 Redshift 提及 (#36217)
Airflow 2.8.0 (2023-12-18)¶
重大变更¶
默认情况下禁用 DAG 文档和 DAG 参数描述中的原始 HTML 代码 (#35460)¶
为了确保 DAG 作者不会通过 DAG 描述或触发 UI 表单注入恶意 javascript,添加了一个新参数 webserver.allow_raw_html_descriptions
,默认值为 False
。如果您信任 DAG 作者的代码并希望允许在 DAG 描述和参数中使用原始 HTML,则可以通过将配置值设置为 True
来恢复以前的行为。
为了确保 Airflow 默认是安全的,触发 UI 中的原始 HTML 支持已被 markdown 支持取代,通过 description_md
属性。如果您一直在使用 description_html
,请迁移到 description_md
。custom_html_form
现在已弃用。
新特性¶
AIP-58: 添加 Airflow 对象存储 (AFS) (AIP-58)
将 XCom 选项卡添加到 Grid (#35719)
添加 “literal” 包装器以禁用字段模板 (#35017)
添加任务上下文日志记录功能,以允许将消息转发到任务日志 (#32646, #32693, #35857)
为数据集添加监听器钩子 (#34418, #36247)
允许覆盖导航栏文本颜色 (#35505)
为 deltalake 表添加轻量级序列化 (#35462)
添加对 iceberg 表序列化的支持 (#35456)
prev_end_date_success
方法访问 (#34528)添加任务参数以设置自定义记录器名称 (#34964)
添加 pyspark 装饰器 (#35247)
将 trigger 添加为 db clean 命令的有效选项 (#34908)
为外部和 venv python 分支运算符添加装饰器 (#35043)
允许 PythonVenvOperator 使用其他 index url (#33017)
添加 Python 虚拟环境运算符缓存 (#33355)
为容器化执行器日志记录引入通用导出 (#34903)
添加清除
列表 任务 实例
视图中下游 tis 的能力 (#34529)属性
clear_number
用于跟踪正在清除的 DAG 运行 (#34126)添加 BranchPythonVirtualenvOperator (#33356)
允许 PythonVenvOperator 使用其他 index url (#33017)
向 provider 添加 CLI 通知命令 (#33116)
当日志选项卡中超过 10 个重试时,使用下拉菜单代替按钮 (#36025)
改进¶
在网格视图中将
multiselect
添加到运行状态 (#35403)修复 ImportError 的情况下
Connection.get_hook
中的警告消息 (#36005)将 processor_subdir 添加到 import_error 表以处理多个 dag 处理器 (#35956)
在核心执行器中合并 change_state 调用以失败或成功 (#35901)
放宽 schedule=None 时对 start_date 的强制性要求 (#35356)
使用 ExitStack 管理 dag.test 中 secrets_backend_list 的突变 (#34620)
提高
taskinstance
的 ActionModal 中任务的可见性 (#35810)基于
AIRFLOW_CONFIG
路径创建目录 (#35818)实现
JSON-string
连接表示生成器 (#35723)将
BaseOperatorLink
移动到单独的模块 (#35032)在 set_context 之后设置 mark_end_on_close (#35761)
将外部日志链接移动到 react 日志页面的顶部 (#35668)
在
execute_interactive
中将终端模式更改为cbreak
并处理SIGINT
(#35602)使原始 HTML 描述可配置 (#35460)
允许电子邮件字段被模板化 (#35546)
在触发 UI 表单中隐藏逻辑日期和运行 ID (#35284)
改进了 TaskFlow 中添加依赖项的说明 (#35406)
向列表导入错误添加可选的退出代码 (#35378)
限制 DB 上的查询结果,而不是
synchronize_log_template
函数中的客户端 (#35366)允许在使用变量 CLI 时传入描述 (#34791)
允许手动触发的 dag 的必填字段中存在可选的默认值 (#31301)
允许 airflow kerberos 在不同模式下运行 (#35146)
重构命令以统一守护程序上下文处理 (#34945)
将额外的字段添加到插件端点 (#34913)
向池视图添加描述 (#34862)
将 cli 的 Connection export 和 Variable export 命令打印逻辑移动到单独的函数 (#34647)
从 get_kerberos_principle 中提取并重用 get_kerberos_principle 函数 (#34936)
更改
BaseOperatorLink.operators
的类型注释 (#35003)优化并迁移到用于 TaskReschedule 的
SA2-compatible
语法 (#33720)合并 SlaMissModelView 中的权限名称 (#34949)
添加调试日志,说明正在运行的内容到
EventScheduler
(#34808)将日志读取器流循环睡眠持续时间增加到 1 秒 (#34789)
解决关于
update_forward_refs
的 pydantic 弃用警告 (#34657)统一映射的任务组查找逻辑 (#34637)
允许按属性过滤事件日志 (#34417)
使连接登录名和密码为 TEXT (#32815)
禁止在代码库中从
airflow
包导入Dataset
(#34610)在示例和测试中使用
airflow.datasets.Dataset
(#34605)增强任务状态可见性 (#34486)
简化 DAG 触发 UI (#34567)
禁止从 airflow 导入 AirflowException (#34512)
为 airflow 资源配置参数添加描述 (#34438)
简化触发器名称表达式 (#34356)
将 Pod*Exceptions 的定义移动到 pod_generator (#34346)
将延迟任务添加到 cluster_activity 视图的 Pools Slots (#34275)
修复心跳失败日志消息 (#34160)
重命名 dag 运行的变量 (#34049)
在 OpenAPI 规范中阐明 new_state (#34056)
从 docker compose 文件中删除顶层元素
version
(#33831)删除通用触发器取消错误日志 (#33874)
使用
NOT EXISTS
子查询代替tuple_not_in_condition
(#33527)允许上下文键参数不提供默认值 (#33430)
分配未分配的触发器时,按 - TI priority_weight 排序触发器 (#32318)
添加指标
triggerer_heartbeat
(#33320)允许
airflow variables export
打印到 stdout (#33279)解决运行 backfill 时出现的死锁问题 (#32991)
为批量任务实例 API 端点添加 dag_run_ids 和 task_ids 过滤器 (#32705)
触发器的可配置健康检查阈值 (#33089)
重构 provider manager,将 Airflow 核心钩子视为其他 provider 钩子 (#33051)
确保在取消映射时填充 DAG 级别的引用 (#33083)
使 Web 服务器 access_denied 警告可配置 (#33022)
在触发器表单 UI 中添加对不同数据类型数组的支持 (#32734)
添加一个机制,用于警告 executor 是否覆盖了现有的 CLI 命令 (#33423)
Bug 修复¶
计算下一个计划时,考虑 UTC 偏移量的变化 (#35887)
为查看者角色添加对 Pools 的读取权限 (#35352)
修复延迟任务 queued_dttm 大于 start_date 时,甘特图的排队持续时间 (#35984)
避免在 rm 时找不到目录而导致容器崩溃 (#36050)
更新
reset_user_sessions
以便从 CLI 或 Web 工作 (#36056)修复删除 DAG 后出现的 UI Grid 错误。 (#36028)
更改触发器 UI 以在 Web UI 中使用 HTTP POST (#36026)
修复 airflow db shell 需要额外按键才能退出的问题 (#35982)
将 dag grid
overscroll
行为更改为 auto (#35717)使用 dag 测试内联运行触发器 (#34642)
为 Firefox
scrollbar
向 grid 添加borderWidthRight
(#35346)修复由于 secrets_masker 导致的无限递归问题 (#35048)
修复 serialized_dag 表中的写入
processor_subdir
(#35661)为独立的 dag 文件处理器重新加载配置 (#35725)
长自定义操作员名称在图视图中溢出 (#35382)
将 try_number 添加到 extra links 查询 (#35317)
防止将非 JSON 可序列化的值分配给 DagRun.conf 字典 (#35096)
DAG 详细信息中的数值错误地呈现为时间戳 (#35538)
修复启用 statsd 指标时,Scheduler 和 triggerer 在守护进程模式下崩溃的问题 (#35181)
停用活动用户后出现无限 UI 重定向循环 (#35486)
修复 Partial Subset DAG 的 fetch_callback 错误 (#35256)
修复 DeltaDataIntervalTimetable 的 DagRun 数据间隔 (#35391)
修复
get_dag_by_pickle
util 函数中的查询 (#35339)修复当 reset_dag_run=True 时,TriggerDagRunOperator 无法触发后续运行的问题 (#35429)
修复
mappedoperator
中的 weight_rule 属性类型 (#35257)Bugfix/防止与缓存的 venv 并发 (#35258)
修复 dag 序列化 (#34042)
通过将 request.referrer 替换为 get_redirect() 来修复 py/url 重定向 (#34237)
修复变量导入期间更新变量的问题 (#33932)
在 Airflow 核心中使用来自 airflow.typing_compat 的 Literal (#33821)
始终使用来自
typing_extensions
的Literal
(#33794)
杂项¶
将默认 MySQL 客户端更改为 MariaDB (#36243)
将 daskexecutor provider 标记为已删除 (#35965)
将 FAB 升级到
4.3.10
(#35991)将 daskexecutor provider 标记为已删除 (#35965)
将
Connection.to_json_dict
重命名为Connection.to_dict
(#35894)升级到 Pydantic v2 (#35551)
将
moto
版本升级到>= 4.2.9
(#35687)使用
pyarrow-hotfix
来缓解 CVE-2023-47248 (#35650)将
axios
从0.26.0 to 1.6.0
升级到/airflow/www/
(#35624)使 docker 装饰器的类型注解与操作员一致 (#35568)
在样式中为
navbar_text_color
和rm
条件添加默认值 (#35553)避免在
dag_next_execution
中两次初始化会话 (#35539)解决示例和 providers 中的类型问题 (#35494)
启用
TCH004
和TCH005
规则 (#35475)人性化有关检索到的 DAG 的日志输出 (#35338)
从 Black 切换到 Ruff 格式化程序 (#35287)
升级到 Flask Application Builder 4.3.9 (#35085)
D401 支持 (#34932, #34933)
使用 requires_access 检查对 dag 的读取权限,而不是显式检查 (#34940)
弃用从 airflow 延迟导入
AirflowException
(#34541)在映射内容用例中查看 util 重构 (#34638)
将
postcss
从8.4.25 to 8.4.31
升级到/airflow/www
(#34770)将 Sqlalchemy 查询重构为 2.0 样式 (#34763, #34665, #32883, #35120)
更改为 pandas 序列化器中 io 的延迟加载 (#34684)
在示例中使用
airflow.models.dag.DAG
(#34617)在核心中使用 airflow.exceptions.AirflowException (#34510)
检查在请求中传递的 dag_ids 是否一致 (#34366)
重构以使代码更好 (#34278, #34113, #34110, #33838, #34260, #34409, #34377, #34350)
暂停 qubole provider (#33889)
为 Google ADS 生成 Python API 文档 (#33814)
改进模块中的导入 (#33812, #33811, #33810, #33806, #33807, #33805, #33804, #33803, #33801, #33799, #33800, #33797, #33798, #34406, #33808)
将 Elasticsearch 升级到 8 (#33135)
仅文档更改¶
在文档中添加对选项卡(和其他 UX 组件)的支持 (#36041)
用 diagrams-generated 图替换 Airflow 的架构图 (#36035)
添加描述 DAG 作者能力的安全模型的部分 (#36022)
增强有关 zombie 任务的文档 (#35825)
在文档中反映 DB 后端版本的删除/添加支持 (#35785)
有关强制性任务参数的更多详细信息 (#35740)
在 .airflowignore 文档中指示
re2
regex 引擎的用法。 (#35663)更新
best-practices.rst
(#35692)更新
dag-run.rst
以提及 Airflow 通过 croniter 对扩展 cron 语法的支持 (#35342)更新
webserver.rst
以包含受支持的 OAuth2 provider 的信息 (#35237)将 dag_run 添加回文档 (#35142)
修复
rst
代码块格式 (#34708)向具体的 taskflow 示例添加类型提示 (#33417)
为从 TaskFlow 任务访问上下文变量添加具体示例 (#33296)
修复安全文档中的链接 (#33329)
Airflow 2.7.3 (2023-11-06)¶
重大更改¶
没有重大更改。
Bug 修复¶
修复映射任务组中任务的过早评估 (#34337)
在 rest API 中添加 TriggerRule 缺失值 (#35194)
修复 dagrun 创建失败时 Scheduler 崩溃循环的问题 (#35135)
修复与
codemirror
和 extra 的连接测试 (#35122)修复自 v1.3.0 中 BC 以来的 cron-descriptor 的使用 (#34836)
修复基于类的监听器的
get_plugin_info
。 (#35022)dag_run 和 task_instance 端点的一些改进/修复 (#34942)
修复 Web 服务器主页中的 dags 计数过滤器 (#34944)
当 ~ 作为 dag_id 提供时,仅返回可读 dags 的 TIs (#34939)
修复守护进程模式下的触发器线程崩溃 (#34931)
修复错误的插件架构 (#34858)
在 TimeSensorAsync 中使用 DAG 时区 (#33406)
如果任何任务处于
upstream_failed
状态,则将具有all_skipped
触发规则的任务标记为skipped
(#34392)向只读字段添加只读验证 (#33413)
杂项/内部¶
改进测试工具以分离 DB 和非 DB 测试 (#35160, #35333)
将 pytest db_test 标记添加到我们的测试 (#35264)
添加 pip 缓存以加快构建速度 (#35026)
将
pendulum
依赖项限制在<3.0
范围内 (#35336)将
sentry_sdk
限制为1.33.0
(#35298)修复了测试中模拟 processor_agent 的一个细微错误 (#35221)
在
/airflow/www
中,将@babel/traverse
从7.16.0 升级到 7.23.2
(#34988)在
/airflow/www
中,将undici
从5.19.1 升级到 5.26.3
(#34971)从
SchedulerJobRunner
中删除未使用的集合 (#34810)移除关于
max_tis per query > parallelism
的警告 (#34742)通过将某些模块移动到类型检查块中,改进 Airflow 核心中的模块导入 (#33755)
修复测试,以响应 Python 3.12 对 sentry-sdk 中 utcnow 的处理 (#34946)
添加
connexion<3.0
上限 (#35218)将 Airflow 限制为
< 3.12
(#35123)更新 moto 版本 (#34938)
将 WTForms 限制为低于
3.1.0
(#34943)
仅文档更改¶
修复 Airflow 文档中的变量替换问题 (#34462)
在
conn.extras
中添加了默认值示例 (#35165)更新 datasets.rst,修复运行示例代码的问题 (#35035)
从推荐的 MySQL 驱动程序中删除
mysql-connector-python
(#34287)修复任务依赖
set_downstream
示例中的语法错误 (#35075)更新文档以启用测试连接 (#34905)
更新 docs errors.rst - 提及 sentry “transport” 配置选项 (#34912)
更新 dags.rst,将 SubDag 弃用说明放在 SubDag 章节标题之后 (#34925)
添加关于在自定义 Secrets 后端中获取变量和配置的信息 (#34834)
更详细地记录 BaseExecutor 接口,以帮助用户编写自定义执行器 (#34324)
修复指向
airflow_local_settings.py
模板的损坏链接 (#34826)修复 params.rst 中 python_callable 函数赋值上下文 kwargs 示例 (#34759)
在 TaskFlow 示例中添加缺失的 multiple_outputs=True 参数 (#34812)
删除 provider 部分名称中多余的
'>'
(#34813)修复 extra link 文档中的导入问题 (#34547)
Airflow 2.7.2 (2023-10-12)¶
重大更改¶
无重大更改
Bug 修复¶
检查配置端点中提供的较低值是否为敏感值 (#34712)
添加对 ZoneInfo 和通用 UTC 的支持,以修复日期时间序列化问题 (#34683, #34804)
修复 airflow db migrate 命令期间出现 AttributeError: ‘Select’ object has no attribute ‘count’ 的问题 (#34348)
使修补任务实例的 dry run 成为可选操作 (#34568)
修复非确定性的日期时间反序列化问题 (#34492)
使用迭代循环来查找映射的父级 (#34622)
通过检查父级
taskgroup
是否已映射来修复 is_parent_mapped 值 (#34587)避免顶层 airflow 导入,以避免循环依赖 (#34586)
向冗长的指标列表添加更多豁免 (#34531)
修复 dag 警告端点权限 (#34355)
修复批处理端点中的任务实例访问问题 (#34315)
更正网格视图中显示的错误时间 (#34179)
修复 www
cluster_activity
视图由于standaloneDagProcessor
模板而无法加载的问题 (#34274)在 ‘Not syncing
DAG-level
permissions’ 中设置loglevel=DEBUG
(#34268)使参数验证在 DAG 验证和触发方面保持一致 (#34248)
确保在选择任何选项卡时都显示详细信息面板 (#34136)
修复与
access_control={}
相关的问题 (#34114)修复 CLI 会话中找不到
ab_user
表的问题 (#34120)修复 FAB 相关的日志格式插值问题 (#34139)
修复
next_run_datasets_summary
端点中的查询错误 (#34143)修复重复标签的 TaskGroup 切换 (#34072)
修复从 UI 清除 TI 所需的权限 (#34123)
在映射的
render_template_fields
中重用_run_task_session
(#33309)修复调度程序逻辑,通过忽略手动运行来规划新的 DAG 运行 (#34027)
为 Flask 操作添加、编辑和删除操作添加缺失的审计日志 (#34090)
从集群活动页面隐藏不相关的 DAG 处理器 (#33611)
移除微调器的无限动画,旋转 1.5 秒 (#34020)
恢复使用
version_added
呈现提供程序配置的功能 (#34011)
仅文档更改¶
阐明审计日志权限 (#34815)
添加审计日志用户说明 (#34814)
在 WSGI 中间件示例中从 FAB 导入
AUTH_REMOTE_USER
(#34721)添加关于未来在 DB 后端中删除对 MsSQL 支持的信息 (#34375)
记录如何使用系统的时区数据库 (#34667)
阐明文档中 landing time 的含义 (#34608)
修复动态任务映射文档中的屏幕截图 (#34566)
修复公共接口文档中的类引用 (#34454)
阐明 var.value.get 和 var.json.get 的用法 (#34411)
调度默认值描述 (#34291)
triggered_dataset_event 的文档 (#34410)
添加 DagRun 事件 (#34328)
提供关于触发表单参数类型的表格概述 (#34285)
在核心文档中添加指向 Amazon Provider 配置的链接 (#34305)
向安全模型添加“安全基础设施”段落 (#34301)
将链接更改为 SQLAlchemy 1.4 (#34288)
在安全文档中添加 SBOM 条目 (#34261)
为 XCom push 和 pull 添加更多示例代码 (#34016)
将 state utils 添加到公共 Airflow 接口 (#34059)
将 Markdown 样式链接替换为 RST 样式链接 (#33990)
修复指向 “UPDATING.md” 文件的损坏链接 (#33583)
其他/内部¶
更新 min-sqlalchemy 版本以考虑使用的最新功能 (#34293)
修复 SesssionExemptMixin 拼写错误 (#34696)
限制
astroid
版本 < 3 (#34658)如果 defer 没有触发器,则 dag 测试失败 (#34619)
修复连接导出输出 (#34640)
创建新的 alembic 迁移时,不要运行 isort (#34636)
弃用 PythonVirtualEnvOperator 中的数字类型 Python 版本 (#34359)
将
os.path.splitext
重构为Path.*
(#34352, #33669)将 = 替换为 is 以进行类型比较 (#33983)
重构整数除法 (#34180)
重构:简化比较 (#34181)
重构:简化字符串生成 (#34118)
用 dict() 替换不必要的 dict 推导式 (#33858)
将“not all”更改为“any”,以方便阅读 (#34259)
在代码中用 if…raise 替换 assert (#34250, #34249)
将默认时区移动到 except 块 (#34245)
在核心中合并类似的 if 逻辑 (#33988)
重构:整合 random 的导入和使用 (#34108)
整合 os.path.* 的导入 (#34060)
在 Airflow 核心中,用解包替换序列连接 (#33934)
移除 repo 中不必要的 'continue' 跳转 (#33849, #33845, #33846, #33848, #33839, #33844, #33836, #33842)
从
pyproject.toml
中删除 [project] 部分 (#34014)如果可能,将 try 移到 Airflow 核心的循环之外 (#33975)
在核心中查找正值时,用 any 替换循环 (#33985)
不要创建我们不需要的列表 (#33519)
从核心中删除无用的字符串连接 (#33969)
将 TCH001 和 TCH002 规则添加到 pre-commit 以检测和移动类型检查模块 (#33865)
将 cancel_trigger_ids 添加到批量处理的 to_cancel 出队操作中 (#33944)
解析 stats datadog 标签时,避免创建不必要的列表 (#33943)
在核心中,当 key 未使用时,用 dict.values 替换 dict.items (#33940)
用推导式替换 lambdas (#33745)
通过将某些模块移动到类型检查块中,改进 Airflow 核心中的模块导入 (#33755)
重构:删除未使用的状态 - SHUTDOWN (#33746, #34063, #33893)
重构:使用原地 .sort() (#33743)
在 Airflow 核心中使用字面量 dict 而不是调用 dict() (#33762)
删除不必要的 map 并使用列表在 Airflow 核心中重写它 (#33764)
在 Airflow 核心中,用 def 方法替换 lambda (#33758)
用 fab_security 管理器中的
isinstance
替换 type 函数 (#33760)在所有 Airflow 模块中,用双引号替换单引号 (#33766)
在单个调用中合并相同对象的多个
isinstance
调用 (#33767)在核心中使用具有多个上下文的单个语句,而不是嵌套语句 (#33769)
重构:使用 f-strings (#33734, #33455)
重构:使用 random.choices (#33631)
使用
str.splitlines()
分割行 (#33592)重构:移除无用的 str() 调用 (#33629)
重构:改进重复检测和列表排序 (#33675)
简化对
len()
的条件 (#33454)
Airflow 2.7.1 (2023-09-07)¶
重大更改¶
CronTriggerTimetable 在尝试跳过运行时现在不那么激进了 (#33404)¶
当设置 catchup=False
时,如果调度程序未在触发上一次运行后立即查询时间表,则 CronTriggerTimetable 不再跳过运行。
在大多数情况下,这不应影响调度,但如果 DAG 被暂停-取消暂停以手动跳过运行,则可能会改变行为。以前,时间表(带有 catchup=False
)仅在 DAG 被取消暂停后才开始运行,但通过此更改,调度程序会尝试稍微回溯一下,以调度涵盖 DAG 暂停期间一部分的先前运行。这意味着您需要使 DAG 暂停更长时间(即,经过整个 cron 周期)才能真正跳过运行。
请注意,这也是各种其他基于 cron 的调度工具(例如 anacron
)所表现出的行为。
conf.set()
变为大小写不敏感,以匹配 conf.get()
的行为 (#33452)¶
此外,如果 conf.get()
与非字符串参数一起使用,现在将中断。
conf.set(section, key, value)
过去是区分大小写的,即 conf.set("SECTION", "KEY", value)
和 conf.set("section", "key", value)
被存储为两个不同的配置。 这与 conf.get(section, key)
的行为不一致,后者始终将 section 和 key 转换为小写。
因此,在 section 或 key 中使用大写字符设置的配置选项无法访问。 这就是为什么我们现在也在 conf.set
中将 section 和 key 转换为小写。
我们还稍微更改了 conf.get()
的行为。 它过去允许 section 或 key 中不是字符串的对象。 现在这样做会导致异常。 例如,conf.get("section", 123)
需要替换为 conf.get("section", "123")
。
Bug 修复¶
确保任务等待正在运行的间接设置 (#33903)
尊重核心异步传感器的 “soft_fail” (#33403)
区分 0 和未设置为默认参数值 (#33965)
如果未找到变量,则从 Variable PATCH API 引发 404 (#33885)
修复
MappedTaskGroup
任务不尊重上游依赖关系 (#33732)如果需要查询结果的第一个值,则添加 limit 1 (#33672)
修复 UI DAG 计数,包括已删除的 DAG (#33778)
修复清理僵尸 RESTARTING 任务 (#33706)
SECURITY_MANAGER_CLASS
应该是对类的引用,而不是字符串 (#33690)在安全管理器中添加回
get_url_for_login
(#33660)修复
2.7.0 db
迁移作业错误 (#33652)在模板内设置上下文 (#33645)
如果定义了 DAG 定义的 access_control,则将其视为权威 (#33632)
在尝试删除存档表之前绑定引擎 (#33622)
如果没有设置名字和姓氏,则添加回退 (#33617)
在 TIS 持续时间计算中的
groupby
之前对数据进行排序 (#33535)在没有 dagrun 时,停止向呈现的模板 UI 添加值 (#33516)
在 webserver 视图中解析日期时,将 strict 设置为 True (#33512)
在自定义 SA 类型中使用
dialect.name
(#33503)当
end_date
小于utcnow
时,不要返回正在进行的 dagrun (#33488)修复
formatDuration
方法中的一个 bug (#33486)使
conf.set
不区分大小写 (#33452)允许时间表略微错过追赶截止点 (#33404)
当调用
poke
时,尊重soft_fail
参数 (#33401)创建一个用于恢复任务的新方法,以便为运算符实现特定逻辑 (#33424)
修复 DagFileProcessor 干扰其
processor_subdir
之外的 dag (#33357)删除 Provider 视图中不必要的
<br>
文本 (#33326)当 ExternalTaskSensor 在可延迟模式下运行时,尊重
soft_fail
参数 (#33196)修复 Param 类的默认值和序列化处理 (#33141)
在添加之前检查动态添加的索引是否在表模式中 (#32731)
修复使用
expand_kwargs
方法时呈现映射参数的问题 (#32272)修复 Python 3.8 的 celery 和 opentelemetry 的依赖关系 (#33579)
其他/内部¶
恢复
Pydantic
1 兼容性 (#34081, #33998)对 PyPI 使用 README.md 的精简版本 (#33637)
升级到
Pydantic
2 (#33956)重新组织 Airflow 的 setup.py 中的
devel_only
extra (#33907)将
FAB
提升到4.3.4
以修复过滤器问题 (#33931)为
sqlalchemy
添加最低要求to 1.4.24
(#33892)更新配置文件中配置的 version_added 字段 (#33509)
将
OrderedDict
替换为普通 dict (#33508)合并 itertools 的导入和使用 (#33479)
静态检查修复 (#33462)
从 datetime 导入 utc 并规范化其导入 (#33450)
D401 支持 (#33352, #33339, #33337, #33336, #33335, #33333, #33338)
修复一些缺失的类型提示 (#33334)
D205 支持 - Stragglers (#33301, #33298, #33297)
重构:简化代码 (#33160, #33270, #33268, #33267, #33266, #33264, #33292, #33453, #33476, #33567, #33568, #33480, #33753, #33520, #33623)
修复有关
orm_mode
重命名的Pydantic
警告 (#33220)将 MySQL 8.1 添加到支持的版本。 (#33576)
删除版本 < 2 的
Pydantic
限制 (#33507)
仅文档更改¶
添加文档解释 template_ext(以及如何覆盖它)(#33735)
解释用户如何检查 python 代码是否是顶级的 (#34006)
澄清 DAG 作者也可以在 DAG 文件处理器中运行代码 (#33920)
修复 Modules Management 页面中的断开链接 (#33499)
修复 secrets backend 文档 (#33471)
修复 base_log_folder 的配置说明 (#33388)
Airflow 2.7.0 (2023-08-18)¶
重大更改¶
移除 Python 3.7 支持 (#30963)¶
从现在开始,Python 社区不再支持 Python 3.7。 因此,要使用 Airflow 2.7.0,您必须确保您的 Python 版本为 3.8、3.9、3.10 或 3.11。
旧的图形视图已移除 (#32958)¶
旧的图形视图已移除。 新的图形视图现在是默认视图。
如果 DAG 中未定义任何参数,则在 Web UI 中跳过触发 UI 表单 (#33351)¶
如果您使用 dag_run.conf
字典和 Web UI JSON 条目来运行您的 DAG,您应该:
启用新的配置
show_trigger_form_if_no_params
以恢复旧的行为
“db init”、“db upgrade”命令和“[database] load_default_connections”配置选项已弃用 (#33136)。¶
相反,您应该使用“airflow db migrate”命令来创建或升级数据库。 此命令不会创建默认连接。 为了创建默认连接,您需要在运行“airflow db migrate”之后显式运行“airflow connections create-default-connections”。
对于 SMTP SSL 连接,上下文现在使用“default”上下文 (#33070)¶
“default”上下文是 Python 的 default_ssl_contest
,而不是之前使用的“none”。 default_ssl_context
在安全性和兼容性之间提供了平衡,但在某些情况下,当证书是旧的、自签名的或配置错误时,它可能无法工作。 这可以通过在 Airflow 的“email”配置中设置“ssl_context”来配置。
将其设置为“none”会恢复 Airflow 2.6 及更早版本中使用的“none”设置,但不建议这样做,因为出于安全原因,此设置会禁用证书验证并允许 MITM 攻击。
禁用默认允许在 UI、API 和 CLI 中测试连接 (#32052)¶
出于安全考虑,测试连接功能在 Airflow UI、API 和 CLI 中默认禁用。 该功能的可用性可以通过 Airflow 配置 ( airflow.cfg
) 的 core
部分中的 test_connection
标志来控制。 也可以通过环境变量 AIRFLOW__CORE__TEST_CONNECTION
来控制。
此配置参数接受以下值: 1. Disabled
:禁用测试连接功能,并禁用 UI 中的“测试连接”按钮。
这也是 Airflow 配置中设置的默认值。 2. Enabled
:启用测试连接功能,并激活 UI 中的“测试连接”按钮。
3. Hidden
:禁用测试连接功能,并隐藏 UI 中的“测试连接”按钮。
有关用户功能的更多信息,请参阅文档:https://airflow.org.cn/docs/apache-airflow/stable/security/security_model.html#capabilities-of-authenticated-ui-users 强烈建议在确认只有高度信任的 UI/API 用户才拥有“编辑连接”权限后,才启用此功能。
xcomEntries
API 默认禁用对 deserialize
标志的支持 (#32176)¶
出于安全考虑,/dags/*/dagRuns/*/taskInstances/*/xcomEntries/*
API 端点现在禁用 deserialize
选项,以反序列化 Web 服务器中的任意 XCom 值。 为了向后兼容,服务器管理员可以将 [api] enable_xcom_deserialize_support
配置设置为 *True* 以启用该标志并恢复向后兼容性。
但是,强烈建议不要启用此功能,而是在客户端执行反序列化。
更改默认 Celery 应用程序名称 (#32526)¶
Celery 应用程序的默认名称从 airflow.executors.celery_executor
更改为 airflow.providers.celery.executors.celery_executor
。
- 您应该同时更改配置和健康检查命令以使用新名称
在配置中(
celery
部分中的celery_app_name
配置),使用airflow.providers.celery.executors.celery_executor
在您的健康检查命令中使用
airflow.providers.celery.executors.celery_executor.app
scheduler.max_tis_per_query
的默认值从 512 更改为 16 (#32572)¶
预计此更改将使 Scheduler 响应更快。
scheduler.max_tis_per_query
需要低于 core.parallelism
。 如果之前两者都保留为其默认值,则 scheduler.max_tis_per_query
的有效默认值为 32(因为它被限制为 core.parallelism
)。
为了尽可能保持与旧配置相似的行为,可以设置 scheduler.max_tis_per_query = 0
,在这种情况下,它将始终使用 core.parallelism
的值。
一些执行器已移至相应的提供程序 (#32767)¶
为了使用这些执行器,您需要安装这些提供程序
对于 Celery 执行器,您需要安装
apache-airflow-providers-celery
包 >= 3.3.0对于 Kubernetes 执行器,您需要安装
apache-airflow-providers-cncf-kubernetes
包 >= 7.4.0对于 Dask 执行器,您需要在任何版本中安装
apache-airflow-providers-daskexecutor
包
您也可以通过分别安装带有 [celery]
、[cncf.kubernetes]
、[daskexecutor]
附加功能的 airflow 来实现这一点。
将其映像基于 apache/airflow
参考映像(非 slim)的用户应该不受影响 - 基本参考映像附带所有三个已安装的提供程序。
改进变更¶
仅限 PostgreSQL 的改进:在 taskinstance 表上添加索引 (#30762)¶
此索引似乎在具有数千万此类行的设置中具有巨大的积极作用。
新功能¶
将 OpenTelemetry 添加到 Airflow (AIP-49)
触发按钮 - 实现 AIP-50 的第 2 部分 (#31583)
从核心 Airflow 中删除执行器耦合 (AIP-51)
自动设置和拆卸任务 (AIP-52)
Airflow 中的 OpenLineage (AIP-53)
实验性:在 dag 解析时调用时,向变量和连接添加缓存 (#30259)
允许池考虑延迟任务 (#32709)
允许为 SMTP 连接选择 SSL 上下文 (#33070)
新的 gantt 标签 (#31806)
从提供程序加载插件 (#32692)
添加
BranchExternalPythonOperator
(#32787, #33360)添加在提供程序中存储配置描述的选项 (#32629)
引入心跳参数以允许
Per-LocalTaskJob
配置 (#32313)添加执行器发现和文档 (#32532)
为作业状态常量添加 JobState (#32549)
添加禁用 'deserialize' XCom API 标志的配置 (#32176)
通过自定义运算符名称在 Web UI 中显示任务实例 (#31852)
添加 default_deferrable 配置 (#31712)
引入
AirflowClusterPolicySkipDag
异常 (#32013)使用
reactflow
用于数据集图 (#31775)添加一个选项,用于从数据库加载 dag 以运行命令任务 (#32038)
添加不需要匹配列表的
chain
版本 (#31927)在 UI 中使用 operator_name 代替 task_type (#31662)
向
airflow db check
添加--retry
和--retry-delay
(#31836)允许跳过任务状态 task_instance_schema.py (#31421)
为 celery result_backend 引擎选项添加一个新配置 (#30426)
UI 添加集群活动页面 (#31123, #32446)
向常用操作添加键盘快捷键 (#30950)
向 kubernetes 执行器日志添加更多信息 (#29929)
添加对配置自定义 alembic 文件的支持 (#31415)
在 UI 上为 DAG 添加运行和失败状态选项卡 (#30429)
为触发表单添加多选、提案和标签 (#31441)
使 Web 服务器配置可自定义 (#29926)
将 DAGCode 在网格视图中呈现为选项卡 (#31113)
添加 rest 端点以获取配置选项 (#31056)
在 get config rest API 中添加
section
查询参数 (#30936)创建指标以跟踪
Scheduled->Queued->Running
任务状态转换时间 (#30612)将任务组标记为成功/失败 (#30478)
添加 CLI 命令以列出提供程序触发器信息 (#30822)
为 DAG 添加 Fail Fast 功能 (#29406)
改进¶
改进图形嵌套逻辑 (#33421)
触发器的可配置健康检查阈值 (#33089, #33084)
为批量任务实例 API 端点添加 dag_run_ids 和 task_ids 过滤器 (#32705)
确保在取消映射时填充 DAG 级别的引用 (#33083)
在触发器表单 UI 中添加对不同数据类型数组的支持 (#32734)
始终显示 gantt 和代码选项卡 (#33029)
将侦听器成功挂钩移动到 SQLAlchemy 提交后 (#32988)
将
db upgrade
重命名为db migrate
并添加connections create-default-connections
(#32810, #33136)删除旧的 gantt 图表并重定向到网格视图 gantt 选项卡 (#32908)
根据选定的任务调整图形缩放 (#32792)
在渲染模板后调用侦听器 on_task_instance_running (#32716)
在图形视图任务实例工具提示中显示 execution_date。 (#32527)
允许提供程序贡献配置 (#32604, #32755, #32812)
减少每个查询的最大 TIs 的默认值,强制执行
<=
并行性 (#32572)将配置描述存储在 Airflow 配置对象中 (#32669)
使用
isdisjoint
代替not intersection
(#32616)加快任务组的叶子和根的计算速度 (#32592)
Kubernetes 执行器加载时间优化 (#30727)
如果 dag 不可调度,则保存 DAG 解析时间 (#30911)
更新健康检查端点以包括
dag_processor
状态。 (#32382)禁用默认设置,允许在 UI、API 和 CLI 中测试连接 (#32052, #33342)
修复调度程序部分下的配置变量类型 (#32132)
允许按字母顺序对网格视图进行排序 (#32179)
将主机名添加到触发器度量
[triggers.running]
(#32050)改进 DAG ORM 清理代码 (#30614)
TriggerDagRunOperator
: 将wait_for_completion
添加到template_fields
(#31122)在新选项卡中打开将我们带离 Airflow UI 的链接 (#32088)
仅当未选择任务时才显示代码选项卡 (#31744)
添加 celery 和 dask 证书配置的描述 (#31822)
PythonVirtualenvOperator
终止日志在警报中 (#31747)将所有 DAG 详细信息迁移到现有的网格视图 dag 详细信息面板 (#31690)
添加图表以帮助可视化计时器指标 (#30650)
Celery 执行器加载时间优化 (#31001)
更新
airflow db
命令的代码样式为 SQLAlchemy 2.0 样式 (#31486)在 FIPS 环境中将 md5 的使用标记为“不用于安全” (#31171)
将 pydantic 支持添加到 serde (#31565)
在 DagRun 和 TaskInstance 中的 note 列中启用搜索 (#31455)
通过为 dag_run 添加新的索引想法来节省调度程序执行时间 (#30827)
通过缓存 dags 来节省调度程序执行时间 (#30704)
支持按 Web UI 中的上次运行日期对 DAG 进行排序 (#31234)
Job 和 JobRunners 的更好类型 (#31240)
添加按 created_date 排序逻辑以获取触发器 (#31151)
移除访问控制文档中的 DAGs.can_create,调整测试装置 (#30862)
将 Celery 日志拆分为 stdout/stderr (#30485)
将指标客户端和
validators
解耦到它们自己的模块中 (#30802)为
get_log
api 中的分页添加描述 (#30729)优化调度映射任务的性能 (#30372)
添加 sentry 传输配置选项 (#30419)
更好的反序列化错误消息 (#30588)
Bug 修复¶
重置密码时移除用户会话 (#33347)
Gantt 图表:
如果与 dag 运行开始/结束日期不同,则使用最早/最旧的 ti 日期 (#33215)修复 Python
virtualenv
操作符的virtualenv
检测 (#33223)当尝试
chmod
airflow.cfg
时,正确记录问题 (#33118)将应用程序上下文传递给 webserver_config.py (#32759)
跳过非运行任务尝试的已提供日志 (#32561)
修复重新加载 gunicorn worker (#32102)
修复当
max_active_runs
达到上限时,很少由竞争条件触发的未来 DagRun。 (#31414)修复 BaseOperator
get_task_instances
查询 (#33054)修复在日志中使用各种状态枚举值的问题 (#33065)
使用字符串连接来预先添加 log_url 的基本 URL (#33063)
使用操作符样式属性更新图形节点 (#32822)
使 Web 服务器 access_denied 警告可配置 (#33022)
仅当用户可以编辑时才加载任务操作模式 (#32992)
OpenAPI 规范修复 alongside
$ref
(#32887) 的可为空性使
PythonOperator
子类的装饰器扩展其装饰器 (#32845)修复在
PythonVirtualenvOperator
中检查是否安装了virtualenv
(#32939)在 is_container() 中检查
__iter__
之前取消包装 Proxy (#32850)通过使用任务处理程序的 base_log_folder 覆盖基本日志文件夹 (#32781)
捕获 run_job 中的任意异常以防止僵尸调度程序 (#32707)
修复 depends_on_past 对动态任务的工作 (#32397)
对 extra_links 进行排序,以便在 UI 中实现可预测的顺序。 (#32762)
修复前缀组错误图形 (#32764)
修复 dagruns 的错误删除逻辑 (#32684)
修复 prune_dict 中的错误,即使在严格模式下也会删除空字典和列表 (#32573)
添加显式浏览器列表并更正空白目标链接的 rel (#32633)
当 multiple_outputs 为 True 时,处理返回的 None (#32625)
修复当 ShortCircuitOperator 条件为假且没有下游任务时的返回值 (#32623)
修复 ShortCircuitOperator 条件为假时的返回值 (#32569)
修复
dagRunTimeout
的呈现 (#32565)修复
/blocked
端点的权限 (#32571)错误修复,防止在触发 DAG 时强制取消暂停 (#32456)
修复
cli.dags.trigger
命令输出中的数据间隔 (#32548)从 airflow 连接表单中删除
whitespaces
(#32292)为传感器的适用参数添加 timedelta 支持 (#32515)
修复 API 中
readonly
属性的错误默认值 (#32510)将 xcom map_index 添加为 xcom 端点的过滤器 (#32453)
修复使用自定义时间表时的 CLI 命令 (#32118)
使用 WebEncoder 在 DagRun 的列表视图中编码 DagRun.conf (#32385)
修复 skip_all_except 方法的逻辑 (#31153)
确保动态任务组中的动态任务仅标记 (#32354)
处理 webserver.expose_config 设置为非敏感而不是布尔值的情况 (#32261)
添加重试功能,用于处理由数据库网络问题导致的进程终止 (#31998)
为 sla_miss_callback 适配 Notifier (#31887)
修复 XCOM 视图 (#31807)
修复 dag.html 初始加载时“按标签过滤 dags”闪烁的问题 (#31578)
修复扩展
resizer
不会扩展网格视图的问题 (#31581)修复 MappedOperator-BaseOperator 属性同步检查 (#31520)
始终将命名的
type_
arg 传递给 drop_constraint (#31306)修复迁移中的错误
drop_constraint
调用 (#31302)解决重新设计的网格视图的问题 (#31232)
支持
requirepass
redis sentinel (#30352)修复调用 get
/config
时 webserver 崩溃的问题 (#31057)
杂项/内部¶
修改 pathspec 版本限制 (#33349)
重构:简化
dag_processing
中的代码 (#33161)目前将
Pydantic
限制为< 2.0.0
(#33235)重构:简化模型中的代码 (#33181)
将 elasticsearch 组添加到 pre-2.7 默认值 (#33166)
重构:简化 airflow/cli 中的字典操作 (#33159)
删除冗余的 dict.keys() 调用 (#33158)
在 pre-commits 中将 ruff 升级到最新的 0.0.282 版本 (#33152)
将 openlineage 配置移动到提供程序 (#33124)
在 Airflow 执行器中用 TaskInstanceState 替换 State (#32627)
摆脱 Python 2 数字遗留问题 (#33050)
删除旧的 dag 代码 (#33058)
删除旧的任务实例模态框 (#33060)
删除旧的图形视图 (#32958)
将 CeleryExecutor 移动到 celery 提供程序 (#32526, #32628)
将所有 k8S 类移动到
cncf.kubernetes
提供程序 (#32767, #32891)重构存在检查 SQL 以辅助 (#32790)
将 Dask 执行器提取到新的 daskexecutor 提供程序 (#32772)
删除 atlas 配置定义 (#32776)
添加 Redis 任务处理程序 (#31855)
将 webserver 的写入配置移动到主 (webserver limited) (#32766)
改进在 Airflow API 端点中获取查询计数 (#32630)
删除点击上限 (#32634)
添加 D400
pydocstyle
检查 - 仅核心 Airflow (#31297)D205 支持 (#31742, #32575, #32213, #32212, #32591, #32449, #32450)
将 word-wrap 从
1.2.3 升级到 1.2.4
在/airflow/www
中 (#32680)强类型化所有单状态枚举值 (#32537)
更多强类型化状态转换 (#32521)
utils/db.py 中的 SQL 查询改进 (#32518)
将 semver 从
6.3.0 升级到 6.3.1
在/airflow/www
中 (#32506)将 jsonschema 版本提升到
4.18.0
(#32445)将
stylelint
从13.13.1 升级到 15.10.1
在/airflow/www
中 (#32435)将 tough-cookie 从
4.0.0 升级到 4.1.3
在/airflow/www
中 (#32443)升级 flask-appbuilder (#32054)
支持
Pydantic
2 (#32366)限制点击直到我们修复 mypy 问题 (#32413)
一些小的清理 (#31890)
用强类型化
enums
替换 State 用法 (#31735)将 ruff 升级到
0.272
(#31966)序列化没有名称的可调用对象时,提供更好的错误消息 (#31778)
稍微改进 views 模块 (#31661)
删除
asynctest
(#31664)将 sqlalchemy 查询重构为
2.0
样式 (#31569, #31772, #32350, #32339, #32474, #32645)删除 Python
3.7
支持 (#30963)为预安装的提供程序带回 min-airflow-version (#31469)
Docstring 改进 (#31375)
改进 SchedulerJobRunner 中的类型 (#31285)
将 ruff 升级到
0.0.262
(#30809)升级到 MyPy
1.2.0
(#30687)
仅文档更改¶
在安全模型中阐明 UI 用户类型 (#33021)
在 templates-ref.rst 中添加指向
DAGRun / DAG / Task
的链接 (#33013)添加有关如何测试 DAG 导入错误的文档 (#32811)
清理我们的新安全页面 (#32951)
清理 Extras 参考页面 (#32954)
更新 Dag 触发 API 和命令文档 (#32696)
将弃用信息添加到 Airflow 模块和类 docstring (#32635)
格式化安装文档以提高可读性 (#32502)
修复触发器 HA 文档 (#32454)
将类型注释添加到代码示例 (#32422)
记录 cron 和 delta 时间表 (#32392)
更新 index.rst 文档以更正语法 (#32315)
修复 python.py 中的一个小拼写错误 (#31474)
分离并阐明提供程序的策略 (#30657)
修复文档:向 pip install 添加“apache”前缀 (#30681)
Airflow 2.6.3 (2023-07-10)¶
重大更改¶
run_id 的默认允许模式已更改为 ^[A-Za-z0-9_.~:+-]+$
(#32293)。¶
以前,run_id 字符串上没有验证。现在有一个验证正则表达式,可以通过在 scheduler
部分中配置 allowed_run_id_pattern
来设置。
Bug 修复¶
使用线性时间正则表达式 (#32303)
修复触发器活动检查并为触发器心跳速率添加新的 conf (#32123)
捕获触发器初始化失败的异常 (#31999)
从连接编辑表单中的 extra 隐藏敏感值 (#32309)
清理
DagRun.run_id
并允许灵活性 (#32293)添加触发器取消日志 (#31757)
修复任务视图中显示的尝试次数 (#32361)
重试事务以处理偶尔的呈现字段死锁 (#32341)
修复导入失败时 LazyDictWithCache 的行为 (#32248)
从 Job 中删除
executor_class
- 修复自定义执行器的回填 (#32219)修复有问题的单例实现 (#32218)
使用
mapIndex
显示每个映射任务的额外链接。 (#32154)确保如果异步线程失败,则主触发器线程退出 (#32092)
使用
re2
匹配不受信任的正则表达式 (#32060)在呈现字段视图中呈现列表项 (#32042)
修复序列化 DAG 中
dag_dependencies
的哈希处理 (#32037)如果在 multiple_outputs 任务中 XComArg 解析失败,则返回
None
(#32027)在 URL 的查询参数和 kwargs 中检查 DAG ID (#32014)
当找不到映射索引时,在
rendered-templates
中显示错误消息而不是失败 (#32011)修复当当前执行日期没有任务组 TIs 时的
ExternalTaskSensor
(#32009)修复触发器模板中的数字参数 HTML 类型 (#31980, #31946)
修复屏蔽嵌套变量字段 (#31964)
修复映射任务中的
operator_extra_links
属性序列化 (#31904)解码旧式嵌套 Xcom 值 (#31866)
在 webserver base_url 中添加尾部斜杠的检查 (#31833)
修复主机包含 scheme 时的连接 URI 解析 (#31465)
修复使用
xcom_pull
和inlets
时的数据库会话关闭 (#31128)修复在测试 DAG 期间任务失败时,DAG 的
on_failure_callback
未被调用 (#30965)修复使用
ExternalPythonOperator
和调试日志级别时的 airflow 模块版本检查 (#30367)
其他/内部¶
修复类型存根中的
task.sensor
注释 (#31954)将
Pydantic
限制为< 2.0.0
,直到我们解决2.0.0
不兼容问题 (#32312)修复
Pydantic
2 对模型定义的挑剔 (#32307)
仅文档更改¶
添加关于标签创建和清理的说明 (#32406)
对文档的细微更新 (#32369, #32315, #32310, #31794)
阐明 Listener API 行为 (#32269)
为询问 requirements 的用户添加信息 (#32262)
在模板参考中添加 DAGRun / DAG / Task 的链接 (#32245)
添加注释以警告潜在的错误修复 (#32230)
添加一个注释,说明我们需要重新启动 triggerer 才能反映任何触发器的更改 (#32140)
添加指向教程文档的缺失超链接 (#32105)
添加可延迟和不可延迟运算符之间的区别 (#31840)
添加注释以解释特殊“trigger end”日志消息的必要性 (#31812)
插件更新的文档更新 (#31781)
修复安全文档中的 SemVer 链接 (#32320)
更新 Airflow 的安全模型 (#32098)
更新从 Airflow 核心到重组文档的引用 (#32282)
分离出高级日志记录配置 (#32131)
在显眼位置为 Airflow 添加
™
符号 (#31977)
Airflow 2.6.2 (2023-06-17)¶
重大变更¶
没有重大更改。
Bug 修复¶
将 TaskInstance 级联更新到 TaskMap 表 (#31445)
修复 Kubernetes 执行器检测已删除的 Pod (#31274)
为 mssql 的迁移方法使用关键字参数 (#31309)
控制从 airflow.cfg 中的 extra 配置驱动程序配置的许可性 (#31754)
修复 openapi/v1.yaml 中的损坏链接 (#31619)
使用不同的值测试连接时,隐藏旧的警报框 (#31606)
将 TriggererStatus 添加到 OpenAPI 规范 (#31579)
解决当详细信息折叠时,网格不会展开的问题 (#31561)
修复标签的排序 (#31553)
当跳过下游任务时,将缺少的
map_index
添加到 xcom 键 (#31541)修复 airflow users delete CLI 命令 (#31539)
在 Airflow
/health
端点中包含 triggerer 健康状态 (#31529)删除已为此任务注册的依赖项警告 (#31502)
使用 kube_client 而不是默认的 CoreV1Api 来删除 Pod (#31477)
确保基本传感器中的最小退避时间至少为 1 (#31412)
修复动态任务映射的
max_active_tis_per_dagrun
(#31406)修复在 DAG 中预导入模块时发生的错误处理 (#31401)
修复下拉列表默认值并调整教程以使用 42 作为默认值进行证明 (#31400)
修复在清除运行时,任务从正常状态变为映射状态时发生的崩溃 (#31352)
使 BaseJobRunner 成为作业类的泛型 (#31287)
修复
url_for_asset
回退和 DAG 审计日志上的 404 错误 (#31233)不要显示未定义的执行日期 (#31196)
在日志加载时添加微调器活动 (#31165)
将 rediss 包含到支持的 URL 方案列表中 (#31028)
通过跳过“不可调度”的 DAG 来优化调度器 (#30706)
在搜索排队的 dag_runs 期间节省调度器执行时间 (#30699)
修复 ExternalTaskSensor 以便与任务组一起正常工作 (#30742)
修复当清除 access_control 时,DAG.access_control 无法同步 (#30340)
修复最新 Python 3.8 和 3.9 的 get_safe_url 测试失败 (#31766)
修复 POST user 端点的类型 (#31767)
修复嵌套组默认参数的错误更新 (#31776)
修复覆盖嵌套任务组中的
default_args
(#31608)将
[secrets] backend_kwargs
标记为敏感配置 (#31788)执行器事件并不总是在此处“退出” (#30859)
验证连接 ID (#31140)
其他/内部¶
添加 Python 3.11 支持 (#27264)
用标准 csv 库替换 unicodecsv (#31693)
将 unicodecsv 带回作为 Airflow 的依赖项 (#31814)
从 get_flat_relative_ids 中删除 found_descendents 参数 (#31559)
修复外部任务触发器中的类型 (#31490)
更好地表达下一个和上一个运行 DAG 列 (#31467)
跳过使用 :meta private: 的自动文档 (#31380)
为 sql_alchemy_connect_args conf 添加一个示例 (#31332)
将 dask 上限绑定转换为排除 (#31329)
将 FAB 升级到 4.3.1 (#31203)
在 airflow dags list-jobs CLI 中为 –state 标志添加 metavar 和 choices,以建议有效的状态参数。 (#31308)
仅使用一行用于 tmp dir 日志 (#31170)
重述 setup.py 中的注释 (#31312)
在日志记录中添加所有者 fullname (#30185)
使连接 ID 验证在整个界面中保持一致 (#31282)
使用单一的事实来源来获取敏感配置项 (#31820)
仅文档更改¶
为 _read_remote_logs 添加文档字符串和签名 (#31623)
删除有关 triggerer 仅为 3.7+ 的注释 (#31483)
修复版本支持信息 (#31468)
将缺少的 BashOperator 导入添加到文档示例 (#31436)
修复由不正确的初始参数引起的 task.branch 错误 (#31265)
更新回调文档(错误和上下文) (#31116)
为具有非 TaskFlow 运算符的动态任务映射添加一个示例 (#29762)
一些文档修复 - 链接、语法和措辞 (#31719)
在更多的地方添加关于将 airflow 添加到 pip install 的描述 (#31448)
修复 docker 构建文档中的表格格式 (#31472)
更新约束安装的文档 (#31882)
Airflow 2.6.1 (2023-05-16)¶
重大变更¶
澄清外部健康检查机制和使用 Job
类 (#31277)。¶
过去,SchedulerJob 和其他 *Job
类已知用于执行 Airflow 组件的外部健康检查。 然而,这些是 Airflow DB ORM 相关的类。 Airflow 的 DB 模型和数据库结构被认为是内部实现细节,遵循 公共接口)。 因此,它们不应用于外部健康检查。 相反,您应该为此目的使用 airflow jobs check
CLI 命令(在 Airflow 2.1 中引入)。
Bug 修复¶
修复 SchedulerJob 的健康检查阈值的计算 (#31277)
修复 k8s 执行器 pod 尾随的 timestamp 解析失败 (#31175)
确保 DAG 处理器作业行在
job_type
列中填充了值 (#31182)修复
api_client_retry_configuration
的节名称引用 (#31174)确保 KPO 正确运行 pod mutation hooks (#31173)
从 OpenLineage 插件中删除令人担忧的关于编辑的日志消息 (#31149)
将
interleave_timestamp_parser
配置移动到日志记录部分 (#31102)如果未找到本地或远程日志,请确保我们检查 worker 是否提供日志 (#31101)
修复 taskinstance 文件中的
MappedTaskGroup
导入 (#31100)格式化 DagBag.dagbag_report() 输出 (#31095)
在任务详细信息视图上屏蔽任务属性 (#31125)
修复迭代 None 值时的模板错误,并修复参数文档 (#31078)
修复
apache-hive
extra,使其安装正确的软件包 (#31068)修复在预导入 Airflow 模块时,DAG 文件夹中 zip 文件的问题 (#31061)
将 TaskInstanceKey 移动到单独的文件以修复循环导入 (#31033, #31204)
修复删除具有注释的 DagRuns 和 TaskInstances (#30987)
修复
airflow providers get
命令输出 (#30978)修复 OpenAPI 规范中的 Pool 架构 (#30973)
添加对包含
pandas.DataFrame
的模板字段的动态任务的支持 (#30943)如果存在,则显式使用传递给“partial”的任务组 (#30933)
修复 list DAG rest api 中的
order_by
请求 (#30926)在居中任务逻辑中包含节点高度/宽度 (#30924)
从 dag trigger 命令中删除 print (#30921)
改进新图形中的任务组 UI (#30918)
修复网格视图中的映射状态 (#30916)
修复显示图形的问题 (#30765)
修复 try_number 不同步时的回填 KeyError (#30653)
重新启用 TaskInstance UI 中的清除和设置状态 (#30415)
防止 DagRun 的
state
和start_date
在清除正在运行的 DagRun 中的任务时被重置 (#30125)
其他/内部¶
上限绑定 dask,直到他们解决其测试套件中的副作用 (#31259)
在表格中显示受清除影响的任务实例 (#30633)
修复 API 文档中缺少的模型 (#31021)
仅文档更改¶
改进
dag_processing.processes
指标的描述 (#30891)改进快速入门说明 (#30820)
向 FAQ 添加有关缺少任务日志的部分 (#30717)
在 docker compose 中挂载
config
目录 (#30662)更新
might_contain_dag
和metrics_allow_list
的version_added
配置字段 (#30969)
Airflow 2.6.0 (2023-04-30)¶
重大变更¶
文件任务处理程序日志目录和文件的默认权限已更改为“所有者 + 组”可写 (#29506)。¶
默认设置处理需要模拟并且两个用户(airflow 和被模拟的用户)都将同一组设置为主组的情况。之前,默认设置也是其他用户可写的,如果用户希望使用其他用户可写的设置,可以通过配置 file_task_handler_new_folder_permissions
和 file_task_handler_new_file_permissions
在 logging
部分中进行配置。
SLA 回调不再将文件添加到 dag 处理器管理器的队列中 (#30076)¶
这可以防止 SLA 回调使 dag 处理器管理器永久处于繁忙状态。这意味着减少了 CPU 使用率,并修复了 SLA 阻止系统查看对现有 dag 文件更改的问题。添加了额外的指标来帮助跟踪队列状态。
BaseTrigger 中的 cleanup()
方法现在定义为异步(遵循 async/await 模式)(#30152)。¶
对于任何覆盖 cleanup()
方法并使用同步代码的自定义触发器实现,这可能是一个重大更改,但实际上在 cleanup 中使用同步操作是错误的,因为该方法是在 Triggerer 的主循环中执行的,并且引入了不必要的延迟,影响了其他触发器。此更改不太可能影响任何现有的触发器实现。
仪表 scheduler.tasks.running
不再存在 (#30374)¶
该仪表从未正常工作,其值始终为 0。要获得此指标的准确值非常复杂,因此决定删除此仪表比修复它但不能保证其值的正确性更有意义。
将任务停留在队列中的处理整合到新的 task_queued_timeout
配置下 (#30375)¶
用于处理停留在队列状态的任务的逻辑已被整合,并且所有负责使停留在队列中的任务超时的配置已被弃用并合并到 [scheduler] task_queued_timeout
中。已被弃用的配置是 [kubernetes] worker_pods_pending_timeout
、[celery] stalled_task_timeout
和 [celery] task_adoption_timeout
。如果设置了这些配置中的任何一个,将遵守最长的超时时间。例如,如果 [celery] stalled_task_timeout
是 1200,并且 [scheduler] task_queued_timeout
是 600,则 Airflow 会将 [scheduler] task_queued_timeout
设置为 1200。
改进变更¶
仅在配置视图中显示正在运行的配置 (#28892)¶
配置视图现在仅显示正在运行的配置。以前,默认配置显示在顶部,但不清楚此默认配置是否被覆盖。随后,未记录的端点 /configuration?raw=true
已被弃用,将在 Airflow 3.0 中删除。HTTP 响应现在返回一个额外的 Deprecation
标头。REST API 上的 /config
端点是以编程方式获取 Airflow 配置的标准方法。
ExternalTaskSensor 的显式跳过状态列表 (#29933)¶
ExternalTaskSensor 现在有一个显式的 skipped_states
列表
其他变更¶
处理下一个运行计算中指数退避的 OverflowError (#28172)¶
默认情况下,最大重试任务延迟设置为 24 小时(86400 秒)。您可以通过 core.max_task_retry_delay
参数全局更改它。
将 Hive 宏移动到提供程序 (#28538)¶
Hive 宏(hive.max_partition
、hive.closest_ds_partition
)仅在安装了 Hive Provider 时可用。使用这些宏时,请安装 Hive Provider > 5.1.0。
更新了应用程序以支持配置 FIPS v2 的缓存哈希方法 (#30675)¶
在 Python 3.9+ 中运行 Airflow 时,进行了各种更新以实现 FIPS 合规性。这包括一个新的 Web 服务器选项 caching_hash_method
,用于更改默认的 flask 缓存方法。
新特性¶
AIP-50 使用灵活用户表单概念触发 DAG UI 扩展 (#27063,#29376)
当 PythonVirtualenvOperator 任务返回提供的退出代码时跳过该任务 (#30690)
将 skip_exit_code 重命名为 skip_on_exit_code 并允许提供多个代码 (#30692)
还将 skip_on_exit_code 添加到 ExternalPythonOperator (#30738)
为动态任务映射添加
max_active_tis_per_dagrun
(#29094)为 pandas dataframe 添加序列化器 (#30390)
可延期的
TriggerDagRunOperator
(#30292)添加通过 CLI 获取 DAG 详细信息的命令 (#30432)
添加 ContinuousTimetable 并支持 @continuous schedule_interval (#29909)
允许自定义规则来检查文件是否具有 dag (#30104)
添加一个新的 Airflow conf 以指定 Kubernetes 客户端的 SSL ca 证书 (#30048)
Bash sensor 具有显式的重试代码 (#30080)
将过滤器任务上游/下游添加到网格视图 (#29885)
添加通过 Airflow CLI 测试连接 (#29892)
支持在使用远程日志记录时删除本地日志文件 (#29772)
Blocklist
用于禁用特定的指标标签或指标名称 (#29881)在网格视图中添加一个新的图表 (#29413)
添加数据库
check_migrations
配置 (#29714)为
cli.dags.trigger
添加输出格式参数 (#29224)使 json 和 yaml 在模板中可用 (#28930)
为现有的 Statsd 指标发布事件启用标记的指标名称 | influxdb-statsd 支持 (#29093)
向
db export-archived
命令添加参数 –yes。 (#29485)使策略函数可插拔 (#28558)
添加
airflow db drop-archived
命令 (#29309)启用单独的触发器日志记录 (#27758)
在图形视图中实现新的过滤选项 (#29226)
为 ExternalTask 添加触发器 (#29313)
添加将清除的记录导出到 CSV 文件的命令 (#29058)
添加
FileTrigger
(#29265)使用元数据标签发出 DataDog statsd 指标 (#28961)
为数据集添加一些 statsd 指标 (#28907)
向
connections import
CLI 命令添加 –overwrite 选项 (#28738)向 DAG 添加通用的“notifier”概念 (#28569)
添加一个新的 conf 以在跳过任务之前等待 past_deps (#27710)
添加 K8s 上的 Flink Operator (#28512)
允许用户通过配置禁用 SwaggerUI (#28354)
在图中显示映射的任务组 (#28392)
Log FileTaskHandler 以与 KubernetesExecutor 的 multi_namespace_mode 配合使用 (#28436)
添加一个新的配置,用于调整屏蔽的机密,以便更轻松地防止日志中的机密泄露 (#28239)
使用 cli 列出特定的配置部分及其值 (#28334)
KubernetesExecutor multi_namespace_mode 可以使用命名空间列表,而无需群集角色 (#28047)
自动保存并允许恢复最近的 DAG 运行配置 (#27805)
将 exclude_microseconds 添加到 cli (#27640)
改进¶
在 KubernetesExecutor 中将大多数 pod_id 用法重命名为 pod_name (#29147)
更新仅轮询传感器的无效用法的错误消息 (#30821)
更新调度程序关键部分边缘情况下的日志级别 (#30694)
AIP-51 从核心 Airflow 中删除执行程序耦合 (AIP-51)
在 BashOperator 的跳过逻辑中添加多个退出代码处理 (#30739)
更新了应用以支持为 FIPS v2 配置缓存哈希方法 (#30675)
在 dag 解析之前预加载 airflow 导入以节省时间 (#30495)
改进网格视图中的任务和运行操作
UX
(#30373)使用 group_id 的缓存属性加速 TaskGroups (#30284)
使用会话中提供的引擎 (#29804)
执行程序的类型相关导入优化 (#30361)
向代码库添加更多类型提示 (#30503)
始终在安全管理器中使用 self.appbuilder.get_session (#30233)
将 SQLAlchemy
select()
更新为新样式 (#30515)从模型中重构出 xcom 常量 (#30180)
将异常类名称添加到 DAG 解析错误消息 (#30105)
将 statsd_allow_list 和 statsd_block_list 重命名为
metrics_*_list
(#30174)改进元组和集合的序列化 (#29019)
使触发器中的 cleanup 方法成为异步方法 (#30152)
延迟加载序列化模块 (#30094)
SLA 回调不再将文件添加到 dag_processing 管理器队列 (#30076)
将 task.trigger 规则添加到 grid_data (#30130)
通过避免 ORM 来加速日志模板同步 (#30119)
将 cli_parser.py 分成两个模块 (#29962)
ExternalTaskSensor 的显式跳过状态列表 (#29933)
将任务状态悬停突出显示添加到新图形 (#30100)
在 url 参数中存储网格选项卡 (#29904)
使用自定义 Connexion 解析器来延迟加载 (#29992)
延迟 Kubernetes 在秘密掩码器中的导入 (#29993)
延迟 ConnectionModelView 初始化,直到访问它 (#29946)
Scheduler,使过时的 DAG 停用阈值可配置,而不是使用 dag 处理超时 (#29446)
改进网格视图高度计算 (#29563)
避免在 conf 验证期间导入执行程序 (#29569)
使 FileTaskHandler 的权限可组写入且可配置 (#29506)
在 Airflow CLI 命令的帮助输出中添加颜色 #28789 (#29116)
为 get_dags 端点添加参数,仅列出未暂停的 DAG (#28713)
为 DAG 运行和任务实例端点暴露 updated_at 过滤器 (#28636)
增加用户标识符列的长度 (#29061)
更新甘特图 UI 以显示任务的排队状态 (#28686)
在 log.dttm 上添加索引 (#28944)
仅在配置视图中显示正在运行的配置 (#28892)
动态限制下拉菜单大小 (#28736)
为连接编辑/添加 UI 的 extra 字段添加 JSON linter。在连接编辑界面,现有的 extra 数据将以缩进格式显示 (#28583)
在 k8s exec 中使用标签而不是 Pod 名称来读取 Pod 日志 (#28546)
使用时间而不是尝试次数来进行排队和运行的重新检查 (#28586)
CustomTTYColoredFormatter 应该继承 TimezoneAware formatter (#28439)
改进 Airflow CLI tasks.run 命令中对 past depends 的处理 (#28113)
支持在
on_*_callback/sla_miss_callbacks
中使用回调列表 (#28469)更好的数据库清理表名验证 (#28246)
在 config.yml 中,配置模板使用对象而不是数组 (#28417)
为任务注释添加 Markdown 渲染 (#28245)
在网格视图中显示映射的任务组 (#28208)
在配置节中添加
renamed
和previous_name
(#28324)加速大多数 Users/Role CLI 命令 (#28259)
加速 Airflow 角色列表命令 (#28244)
重构序列化 (#28067, #30819, #30823)
允许 k8s executor / KPO 使用更长的 Pod 名称 (#27736)
更新健康检查端点以包含
triggerer
状态 (#27755)
Bug 修复¶
修复 cli 应用的 static_folder (#30952)
初始化 cli appbuilder 的插件 (#30934)
修复 DAG 文件处理器心跳,仅在必要时运行 (#30899)
修复 KubernetesExecutor 将状态发送到调度器的问题 (#30872)
仅当所有映射的上游任务都完成时才计数 (#30641)
ExternalTaskSensor: 将 external_task_group_id 添加到 template_fields (#30401)
改进任务实例详细信息的 URL 检测 (#30779)
为 DAG 导入错误横幅使用 Material Icons (#30771)
修复各种网格/图形视图 UI bug (#30752)
添加一个折叠网格按钮 (#30711)
修复 d3 依赖 (#30702)
简化逻辑以解决卡在排队中的任务,尽管 stalled_task_timeout 已到期 (#30375)
清除任务实例时,尝试从数据库获取关联的 DAG (#29065)
修复当提供 DAG 默认参数时,映射的任务部分参数 (#29913)
停用从 zip 文件中删除的 DAG (#30608)
通过检索最新的
resource_version
,从too old resource version exception
中恢复 (#30425)修复刷新 DAG 时可能出现的竞争条件 (#30392)
为 OpenAPI 请求正文使用自定义验证器 (#30596)
修复带有可延期参数的
TriggerDagRunOperator
(#30406)加速 DAG 运行删除 (#30330)
不要使用模板文字来构造 HTML 元素 (#30447)
修复
example_sensor_decorator
DAG 中的弃用警告 (#30513)避免在 triggerer 作业日志中记录敏感信息 (#30110)
为基本传感器添加一个新参数,以捕获 poke 方法中的异常 (#30293)
修复带有非 JSON 可序列化值的 DAG 运行配置编码 (#28777)
添加了修复程序,使 Airflow 可以在 Windows Dask-Workers 上使用 (#30249)
强制 DAG 最后修改时间为 UTC (#30243)
修复示例 DAG 中的 EmptySkipOperator (#30269)
使 Web 服务器启动尊重 update_fab_perms (#30246)
更改日志文件夹权限时忽略错误 (#30123)
禁用按注释对 DagRuns 进行排序 (#30043)
修复从已完成的 KubernetesExecutor worker pod 读取日志的问题 (#28817)
比较文件模式时,屏蔽非访问位 (#29886)
从 UI 中删除运行任务操作 (#29706)
修复旧版日志视图的日志尾部问题 (#29496)
修复 DebugExecutor 如何处理传感器 (#28528)
确保在记录 Pod 名称之前调用 pod_mutation_hook (#28534)
处理 next_run_calculation 中指数退避时的 OverflowError (#28172)
其他/内部¶
使 Eager Upgrade 的其他依赖项成为可选 (#30811)
升级到 pip 23.1.1 (#30808)
从 Eager Upgrade 中删除 protobuf 限制 (#30182)
从 Eager Upgrade 中删除 protobuf 限制 (#30182)
弃用
BashOperator
中的skip_exit_code
(#30734)删除 gauge
scheduler.tasks.running
(#30374)将 json5 升级到 1.0.2,将 eslint-plugin-import 升级到 2.27.5,位于
/airflow/www
中 (#30568)为 PythonOperator 添加测试 (#30362)
将 asgiref 添加为核心依赖项 (#30527)
发现安全模式切换注释说明 (#30459)
升级 moment-timezone 包以修复 Tehran 时区 (#30455)
将 loader-utils 从 2.0.0 升级到 2.0.4,位于
/airflow/www
中 (#30319)将 babel-loader 从 8.1.0 升级到 9.1.0,位于
/airflow/www
中 (#30316)DagBag: 在异常消息中使用
dag.fileloc
而不是dag.full_filepath
(#30610)更改序列化信息的日志级别 (#30239)
小的 DagRun 辅助方法清理 (#30092)
改进 stats.py 中的类型提示 (#30024)
将
importlib-metadata
backport 限制为 < 5.0.0 (#29924)使 cncf 提供程序文件名与 AIP-21 对齐 (#29905)
将 FAB 升级到 4.3.0 (#29766)
清除测试中的 ExecutorLoader 缓存 (#29849)
在 UI 中延迟加载任务实例日志 (#29827)
为超过 API 调用次数的最大页面限制添加警告日志 (#29788)
积极地缓存进程中的入口点 (#29625)
不要使用
importlib.metadata
获取版本以提高速度 (#29723)将 Mypy 升级到 1.0 (#29468)
将
db export-cleaned
重命名为db export-archived
(#29450)listener:通过直接调用替换 SQLAlchemy 事件监听来简化 API (#29289)
Bash 环境变量没有多行日志条目 (#28881)
切换到 ruff 以进行更快的静态检查 (#28893)
删除 TI 日志中的水平线 (#28876)
使 allowed_deserialization_classes 更直观 (#28829)
在 k8s executor pod 中将日志传播到 stdout (#28440, #30860)
修复代码可读性,向 json_client 添加文档字符串 (#28619)
AIP-51 - 其他兼容性检查 (#28375)
修复 LocalKubernetesExecutor 的 is_local (#28288)
将 Hive 宏移动到 provider (#28538)
重新运行不稳定的 PinotDB 集成测试 (#28562)
添加 pre-commit hook 以检查会话默认值 (#28007)
重构 web UI 的 get_mapped_group_summaries (#28374)
添加对 k8s 1.26 的支持 (#28320)
用 time-machine 替换
freezegun
(#28193)完成
airflow/kubernetes/*
的 D400 (#28212)完成多个文件夹的 D400 (#27969)
删除 k8s 1.21 和 1.22 支持 (#28168)
从 k8s 调度器类中删除未使用的 task_queue 属性 (#28049)
完成多个文件夹的 D400 (#27767, #27768)
仅文档更改¶
添加关于如何避免意外 Airflow 升级/降级的说明 (#30813)
添加关于如何编写任务日志的明确信息 (#30732)
更好地解释如何从任务中记录日志 (#30746)
为 Dataset 使用正确的导入路径 (#30617)
创建
audit_logs.rst
(#30405)为传感器添加 taskflow API 示例 (#30344)
添加关于时区感知 DAG 的说明 (#30467)
清晰化参数文档 (#30345)
修复任务持续时间指标的单位 (#30273)
更新 dag-run.rst 以处理 cli 命令的死链接 (#30254)
添加编写高效 Python 代码部分到降低 DAG 复杂性 (#30158)
允许使用
*_lookup_pattern
参数指定后端中正在查找的连接、变量或配置 (#29580)为通知功能扩展添加文档 (#29191)
阐明执行器接口是公共的,但实例不是 (#29200)
向 Airflow 文档添加公共接口描述 (#28300)
为任务组映射添加文档 (#28001)
对指标文档进行了一些修复 (#30290)
Airflow 2.5.3 (2023-04-01)¶
重大变更¶
没有重大更改。
Bug 修复¶
修复独立 dag-processor 的 DagProcessorJob 集成 (#30278)
修复 gunicorn 挂起时的正确终止 (#30188)
修复 XCom.get_one 完全一个异常文本 (#30183)
更正 VARCHAR 大小为 250 (#30178)
当任务收到 SIGTERM 时,恢复 on_failure_callback 的修复 (#30165)
将只读属性移动到 DagState 以修复生成的文档 (#30149)
确保
dag.partial_subset
不会改变任务组属性 (#30129)修复
airflow dags next-execution
cli 命令的不一致返回值 (#30117)修复 www/utils.dag_run_link 重定向 (#30098)
当映射的任务计数为 0 时,修复
TriggerRuleDep
(#30084)Dag processor manager,将 retry_db_transaction 添加到 _fetch_callbacks (#30079)
修复 mysql 数据库的 db clean 命令 (#29999)
避免在 mini scheduler 中考虑 EmptyOperator (#29979)
修复了一些长期存在的图形视图界面问题 (#29971, #30355, #30360)
修复了 DAG 文档切换图标的初始角度 (#29970)
修复了 DAG 界面中的标签选择 (#29944)
将 airflow/example_dags/sql/sample.sql 包含到 MANIFEST.in 中 (#29883)
修复了 /taskinstance/list 视图中的损坏的过滤器 (#29850)
允许使用通用参数字典 (#29782)
修复了 patch variable 路由中的 update_mask (#29711)
如果 instance_name_has_markup = True,则从 app_name 中删除标记 (#28894)
其他/内部¶
恢复 “也限制 Python 3.9 上的 importlib (#30069)” (#30209)
将 custom_operator_name 添加到 @task.sensor 任务 (#30131)
在 /airflow/www 中将 webpack 从 5.73.0 升级到 5.76.0 (#30112)
格式化配置 (#30103)
删除 astroid 的上限限制 (#30033)
删除意外合并的供应商守护进程补丁代码 (#29895)
修复 airflow tasks test 命令中关于缺少 data_interval 的警告 (#27106)
仅文档更改¶
添加关于顶级代码的更多信息 (#30040)
更新 workday 示例 (#30026)
修复 DAG 文档中的一些拼写错误 (#30015)
更新 set-up-database.rst (#29991)
修复 Kubernetes 文档中的一些拼写错误 (#29936)
修复一些标点符号和语法 (#29342)
Airflow 2.5.2 (2023-03-15)¶
重大更改¶
作为 API 参数或参数传递的日期时间字段应符合 RFC3339 标准 (#29395)¶
在 API 调用的情况下,作为日期时间字段一部分传递的“+”可能未进行 URL 编码,并且此类日期时间字段可以通过验证。 此类日期时间参数现在应进行 URL 编码(如 %2B
)。
对于参数,我们仍然允许符合 IS8601 标准的日期时间(例如,可以使用的“ ”代替 T
分隔日期和时间,并且未指定时区),但我们会发出弃用警告。
[webserver] expose_hostname
的默认值已更改为 False
(#29547)¶
[webserver] expose_hostname
的默认值已设置为 False
,而不是 True
。 这意味着管理员必须选择启用才能将 Web 服务器主机名公开给最终用户。
Bug 修复¶
修复 API 和参数模式中日期时间字段的验证 (#29395)
修复大型日志的网格日志 (#29390)
修复任务收到 SIGTERM 时的 on_failure_callback (#29743)
更新 python-daemon 的最低版本以修复 containerd 文件限制 (#29916)
如果 dag 未激活,则 POST
/dagRuns
API 应返回 404 (#29860)切换页面时,DAG 列表排序丢失 (#29756)
修复当清除先前运行的普通任务(现在是映射任务)时,调度程序崩溃的问题 (#29645)
将带有时区的 moment 转换为 UTC,而不是引发异常 (#29606)
通过添加其他返回类型来修复 clear dag run
openapi
规范响应 (#29600)不要在任务实例详细信息页面中显示空的呈现属性 (#29545)
从 get-value 命令中删除 section 检查 (#29541)
不要为未经身份验证的用户在 UI 回溯中显示版本/节点 (#29501)
使
prev_logical_date
变量具有偏移感知能力 (#29454)修复映射运算符中嵌套字段的呈现 (#29451)
数据集,next_run_datasets,删除不必要的时间戳过滤器 (#29441)
Edgemodifier
在 TaskGroup 边缘情况下使用标签进行重构 (#29410)修复 Rest API 更新用户输出 (#29409)
确保已删除序列化 DAG (#29407)
如果显式设置,则在 TaskFlow API 中持久化 DAG 和任务文档值 (#29399)
使用所有参数重定向到原始页面 (#29212)
修复仅在手动 DAG 运行情况下的任务持续时间视图 (#22015) (#29195)
删除 poke 方法以回退到父实现 (#29146)
PR:引入修复以在 Windows 系统上运行任务 (#29107)
修复关于旧配置的迁移中的警告 (#29092)
超时时发出 dagrun 失败持续时间 (#29076)
处理集群策略本身的错误 (#29056)
修复 REST API 的 Kerberos 身份验证。 (#29054)
修复通过异常上的 V1EnvVar 泄漏敏感字段的问题 (#29016)
在传递之前,清理 url_for 参数 (#29039)
修复带有注释的 dag 运行触发器。 (#29228)
通过 API 触发 DAG 运行时,将操作日志写入数据库 (#28998)
解析 pickled XCom 迭代器中的所有变量 (#28982)
允许在
airflow connections add
中使用没有 authority 和 host 块的 URI (#28922)在使用 KubernetesExecutor 时更有选择性地采用 pod (#28899)
KubenetesExecutor 即使成功也会发送状态 (#28871)
注释我们不删除的 KubernetesExecutor pod (#28844)
限制流式日志读取 (#28818)
引入 dag 处理器作业 (#28799)
修复 #28391 从 UI 手动触发任务对于 k8s 执行程序失败的问题 (#28394)
当外部 dag 不为 none 并且 task_id 和 task_ids 为 none 时,记录 poke 信息 (#28097)
修复检查 DAG 的编辑权限中的不一致问题 (#20346)
其他/内部¶
添加对不可模板化字段的检查 (#29821)
删除 continue for not in (#29791)
移动网格视图中的额外链接位置 (#29703)
将
undici
从5.9.1
升级到5.19.1
(#29583)将 expose_hostname 默认值更改为 false (#29547)
更改 airflow 创建的 config/password 文件的权限 (#29495)
使用较新的 setuptools
v67.2.0
(#29465)增加网格视图元素的最大高度 (#29367)
阐明 worker 控制配置的描述 (#29247)
将
ua-parser-js
从0.7.31
升级到0.7.33
,位于/airflow/www
中 (#29172)删除
pytest
的上限限制 (#29086)链接到
graph/gantt
视图时,检查run_id
url 参数 (#29066)阐明图形视图动态任务标签 (#29042)
修复数据集的导入错误 (#29007)
更新 PythonSensor 如何从
python_callable
返回值 (#28932)添加 dep 上下文描述以获得更好的日志消息 (#28875)
将
swagger-ui-dist
从3.52.0
升级到4.1.3
,位于/airflow/www
中 (#28824)将
importlib-metadata
向后移植限制为< 5.0.0
(#29924, #30069)
仅文档更改¶
更新 pipeline.rst - 修复
merge_data()
任务中的查询 (#29158)更正 timetable.rst 中 Workday 时间表的参数名称 (#29896)
更新 Connection how-to 文档中 env var 链接的 ref 锚点 (#29816)
更好地描述 api 中的限制 (#29773)
dag_processing.last_duration 的描述 (#29740)
更新有关 template_fields 类型和子类的文档 (#29725)
修复 TaskFlow 概念中数据集入口/出口注释的格式 (#29678)
特定用例:通过 compose 中的 requirements.txt 添加软件包 (#29598)
检测“docker-compose”是否存在 (#29544)
将着陆时间条目添加到 UI 文档 (#29511)
改进示例 docker-compose 中的运行状况检查并阐明用法 (#29408)
从 TriggerDagRunOperator 文档字符串中删除
notes
参数 (#29298)在 Timetables 文档中使用
schedule
参数而不是timetable
(#29255)将触发器进程添加到 Airflow Docker 文档 (#29203)
更新 set-up-database.rst (#29104)
Params 文档的几个改进 (#29062)
电子邮件配置文档中更明确的环境变量示例 (#28845)
添加了侦听器插件示例 (#27905)
Airflow 2.5.1 (2023-01-20)¶
重大更改¶
通过环境变量触发 gevent monkeypatching
(#28283)¶
如果您正在使用 gevent 进行 Web 服务器部署,并且使用本地设置来 monkeypatch
gevent,您可能希望将本地设置修补替换为在 Web 服务器中将 _AIRFLOW_PATCH_GEVENT
环境变量设置为 1。 这确保尽早完成 gevent 修补。
Bug 修复¶
修复非敏感环境变量的屏蔽 (#28802)
从 connexion 中删除 swagger-ui 额外组件,并通过 npm 包安装
swagger-ui-dist
(#28788)修复设置
AUTH_ROLE_PUBLIC
时的UIAlert
should_show (#28781)仅在采用 pod 时修补单个标签 (#28776)
更新 CSRF 令牌以随会话过期 (#28730)
修复映射任务实例的 “airflow tasks render” cli 命令 (#28698)
允许 ExternalTaskSensor 的
external_task_ids
使用 XComArgs (#28692)行锁定 TIs 以在映射任务扩展期间删除 (#28689)
处理执行程序清理中的 ConnectionReset 异常 (#28685)
修复 gunicorn 的 access_log 的输出重定向的描述 (#28672)
将 join 添加回在 #28198 中删除的僵尸查询 (#28544)
修复 CronTriggerTimeTable dags 的日历视图 (#28411)
运行 DAG 后,employees 表为空。(#28353)
修复在 DAG 解析过程中查找僵尸进程时出现的
DetachedInstanceError
。(#28198)将头部块嵌套在
divs
中,以修复 dag.html 上的dagid
复制错误。(#28643)修复 UI 箭头方向。(#28624)
在触发规则依赖项中保护尚未展开的 ti。(#28592)
将 TI
setNote
端点移动到 OpenAPI 中的 TaskInstance 下。(#28566)在
CronTriggerTimetable
中考虑之前的运行。(#28532)确保文件任务处理程序中的日志目录正确。(#28477)
修复执行器配置中错误的 pickled pods。(#28454)
在触发 DAG 运行 API 中添加
ensure_ascii=False
。(#28451)在 MappedOperator 上添加 setters 到 on_*_callbacks。(#28313)
修复 deferred 和 up_for_reschedule 任务的
ti._try_number
。(#26993)将
callModal
从 dag.js 中分离出来。(#28410)手动运行不能看起来像计划运行。(#28397)
当没有 start_date 时,不要显示任务/运行持续时间。(#28395)
在任务日志中保持手动滚动位置。(#28386)
正确选择映射任务的“previous”任务。(#28379)
通过环境变量触发 gevent
monkeypatching
(#28283)修复 db 清理警告。(#28243)
使参数 'offset' 和 'length' 成为非必需参数。(#28234)
使实时日志读取适用于“其他” k8s 执行器。(#28213)
向
LazyXComAccess
添加自定义 pickling hooks。(#28191)修复下一个运行数据集错误。(#28165)
确保
@dag
装饰器的警告在 DAG 文件中报告。(#28153)当使用 airflow dags tests 命令时不发出警告。(#28138)
确保当文件被删除时,
dagbag_size
指标会减小。(#28135)改进运行/任务网格视图操作。(#28130)
使 BaseJob.most_recent_job 优先选择“running” jobs。(#28119)
当代码未调用旧键时,不要发出 FutureWarning。(#28109)
在 compose 中将
airflow.api.auth.backend.session
添加到后端会话。(#28094)解决关于在移动项目上调用 conf.get 的错误警告。(#28075)
返回将被更改的任务列表。(#28066)
在解析 DAG 时,优雅地处理错误的 zip 文件。(#28011)
防止从本地路径重复加载 providers。(#27988)
修复链接多个空映射任务时出现的死锁。(#27964)
修复:TaskInstance 上的 current_state 方法不按 map_index 过滤。(#27898)
如果数据库未初始化,则不要记录 CLI 操作。(#27851)
确保我们可以摆脱错误的调度器状态。(#27834)
dagrun,
next_dagruns_to_examine
,添加 MySQL 索引提示。(#27821)处理 DAG 验证发生时 DAG 消失的情况。(#27720)
修复:继续检查 sla。(#26968)
允许在没有 conn type 时生成连接 URI。(#26765)
其他/内部¶
在 eventlet 修复后,移除
dnspython
的限制。(#29004)将
dnspython
限制为 <2.3.0
,直到 eventlet 不兼容问题解决。(#28962)在示例 DAG 索引中添加自动版本替换。(#28090)
清理插件示例并进行整理。(#28537)
将
SQLAlchemy
限制为低于2.0
。(#28725)将
/airflow/www
中的json5
从1.0.1
升级到1.0.2
。(#28715)修复一些关于将传感器与 taskflow 结合使用的文档。(#28708)
将 Architecture 和 OperatingSystem 类更改为
Enums
。(#28627)添加文档字符串并对 email util 进行小的改进。(#28634)
修复
Connection.get_extra
类型。(#28594)navbar,限制下拉菜单大小,并添加滚动条。(#28561)
从正确的源位置发出
conf.get*
的警告。(#28543)将我们的 MyPY 插件移动到 dev 文件夹。(#28498)
向
purge_inactive_dag_warnings
添加重试。(#28481)在 ARM 上重新启用 Plyvel,因为它现在可以干净地构建。(#28443)
为 LocalTaskJob 和 workers 添加 SIGUSR2 处理程序以帮助调试。(#28309)
将
test_task_command
转换为 Pytest 并在其中unquarantine
测试。(#28247)使无效字符异常更具可读性。(#28181)
将
/airflow/www
中的 decode-uri-component 从0.2.0
升级到0.2.2
。(#28080)对于未启动的执行器,使用断言代替异常。(#28019)
简化数据集
subgraph
逻辑。(#27987)按
map_index
排序 TIs。(#27904)有关
LocalTaskJob
中 Segmentation Fault 的更多信息。(#27381)
仅文档更改¶
在集群策略文档中提及映射的运算符。(#28885)
稍微改进动态 DAG 生成前言的描述。(#28650)
重组文档。(#27235)
更新关于低优先级任务的调度程序文档。(#28831)
阐明版本化的约束在发布时是固定的。(#28762)
阐明关于 docker compose 的信息。(#28729)
为动态任务映射添加一个示例 dag。(#28325)
使用 docker compose v2 命令。(#28605)
将 AIRFLOW_PROJ_DIR 添加到 docker-compose 示例。(#28517)
删除过时的可选 Provider Feature 过时文档。(#28506)
添加 [core] mp_start_method config 的文档。(#27993)
LocalTaskJob 返回代码计数器的文档。(#27972)
注意支持哪些 Python 版本。(#27798)
Airflow 2.5.0 (2022-12-02)¶
重大更改¶
airflow dags test
不再执行回填作业。(#26400)¶
为了使 airflow dags test
作为测试和调试工具更有用,我们不再运行回填作业,而是运行“本地任务运行器”。用户仍然可以使用 airflow dags backfill
命令回填他们的 DAG。
Airflow 配置节 kubernetes
重命名为 kubernetes_executor
。(#26873)¶
KubernetesPodOperator 不再考虑任何核心 kubernetes 配置参数,因此本节现在仅适用于 kubernetes 执行器。重命名它减少了潜在的混淆。
一旦 ExternalTaskSensor 的任何依赖任务失败,现在就会抛出 AirflowException
。(#27190)¶
当设置了 failed_states
,使用了 execute_date_fn
,并且部分(但不是全部)依赖任务失败时,ExternalTaskSensor
不再无限期地挂起。相反,一旦任何依赖任务失败,就会抛出 AirflowException
。除了超时之外,任何处理此失败的代码都应移动到缓存 AirflowException
BaseClass
,而不仅仅是 AirflowSensorTimeout
子类。
Airflow 配置选项 scheduler.deactivate_stale_dags_interval
已重命名为 scheduler.parsing_cleanup_interval
。(#27828)。¶
旧选项将继续工作,但会发出弃用警告,并且将在 Airflow 3 中完全删除。
新功能¶
TaskRunner
:通知组件启动和完成。(#27855)将 DagRun 状态更改添加到 Listener 插件系统。(#27113)
原始任务返回代码的指标。(#27155)
添加逻辑,使 XComArg 可以拉取特定的 map indexes。(#27771)
清除 TaskGroup (#26658, #28003)
添加关键部分查询持续时间指标。(#27700)
添加:#23880 ::
AirflowModelViews(Variables/Connection)
的审计日志 (#24079, #27994, #27923)添加 postgres 15 支持。(#27444)
在运行时扩展映射组中的任务。(#27491)
重置提交,清理子模块。(#27560)
scheduler_job,为调度器循环计时器添加指标。(#27605)
允许在 taskflow 中使用数据集。(#27540)
将 expanded_ti_count 添加到 ti 上下文。(#27680)
向任务实例和 dag 运行添加用户评论。(#26457, #27849, #27867)
启用将 DagRun JSON 复制到剪贴板。(#27639)
为 SLAs 实施额外的控制。(#27557)
在 DAG 视图中添加 dag 解析时间。(#27573)
在 BaseSensor 中为 exponential_backoff 添加 max_wait。(#27597)
在解析时扩展映射组中的任务。(#27158)
在回填中添加禁用重试标志。(#23829)
添加传感器装饰器。(#22562)
Api endpoint update ti (#26165)
按最近更新事件过滤数据集。(#26942)
支持
Is /not
Null 过滤器,用于webui
上值为 None 的情况。(#26584)向数据集列表添加搜索。(#26893)
在映射的运算符中分离并处理 ‘params’。(#26100)
添加用于 TaskGroup 映射的 authoring API (#26844)
添加
one_done
触发规则 (#26146)创建一个更高效的 airflow dag 测试命令,并具有更好的本地日志记录 (#26400)
支持添加/删除角色权限的命令 (#26338)
在 Web UI 中自动 tail 文件日志 (#26169)
在 API 中将 triggerer 信息添加到任务实例 (#26249)
用于反序列化自定义 XCom 后端值的标志 (#26343)
改进¶
允许深度优先执行 (#27827)
UI: 如果数据更改,则更新偏移高度 (#27865)
改进 TriggerRuleDep 类型和可读性 (#27810)
使需要会话的视图仅使用关键字参数 (#27790)
使用显式 task_ids 和 map_indexes 优化
TI.xcom_pull()
(#27699)允许 k8s executor 使用的 pod id 中包含连字符 (#27737)
优化任务实例过滤 (#27102)
使用上下文管理器来简化日志服务管理 (#27756)
修复格式化遗留问题 (#27750)
改进任务死锁消息 (#27734)
改进“sensor 超时”消息 (#27733)
将 urlparse 替换为
urlsplit
(#27389)使 TaskGroup 语义与 AbstractOperator 对齐 (#27723)
在 dag 处理的每个循环中向解析队列添加新文件 (#27060)
使 Kubernetes Executor 和 Scheduler 在 PMH 执行期间对错误具有弹性 (#27611)
将数据集依赖项分离到单独的图中 (#27356)
使用 log.exception,它比 log.error 更经济 (#27517)
将验证
branch_task_ids
移动到SkipMixin
(#27434)强制 LazyXComAccess 在推送到 XCom 时转换为列表 (#27251)
更新 cluster-policies.rst 文档 (#27362)
如果连接类型已在 provider 中注册,则添加警告 (#27520)
使用 –verbose 选项在命令中激活调试日志记录 (#27447)
为 Python Operators 添加经典示例 (#27403)
将
.first()
更改为.scalar()
(#27323)改进 reset_dag_run 描述 (#26755)
添加关于 sensors 的示例和
howtos
(#27333)使网格视图宽度可调整 (#27273)
在名称之前按类别对插件自定义菜单链接进行排序 (#27152)
简化 DagRun.verify_integrity (#26894)
将映射的任务组信息添加到序列化 (#27027)
更正网格视图中 Run config 使用的 JSON 样式 (#27119)
UI 行为不需要
extra__conn_type__
前缀 (#26995)改进数据集更新摘要 (#26878)
将 kubernetes config section 重命名为 kubernetes_executor (#26873)
解码数据集搜索的参数 (#26941)
删除 DAGRun 详细信息页面,完全依赖网格 (#26837)
修复使用
hostname_callable
时的 schedulercrashloopbackoff
(#24999)减少 KubernetesExecutor 中的日志冗余 (#26582)
不要无缘无故地迭代两次 tis 列表 (#26740)
PodGenerator.deserialize_model_file 的更清晰代码 (#26641)
除非您有 V1Pod,否则不要导入 kubernetes (#26496)
将 updated_at 列添加到 DagRun 和 Ti 表 (#26252)
将自定义 XCom 后端的反序列化移动到 2.4.0 (#26392)
避免在需要一个项目时计算所有元素 (#26377)
通过 isort 自动添加
__future__
.annotations (#26383)在序列化 expand_kwargs 时处理列表 (#26369)
将 PEP-563(延迟评估注解)应用于核心 airflow (#26290)
添加更多工作日 operator 和 sensor 示例 #26071 (#26098)
使 TaskGroup 语义与 AbstractOperator 对齐 (#27723)
Bug 修复¶
优雅地处理整个配置部分被重命名的情况 (#28008)
在反序列化期间添加导入的允许列表 (#27887)
软删除 DAG 计划或任务出口中不再引用的数据集 (#27828)
当 URL 中没有有效的 tags 时,重定向到主页视图 (#25715)
刷新 dags 视图中的下一次运行数据集信息 (#27839)
使 MappedTaskGroup 依赖于其扩展输入 (#27876)
使暂停的 DAG 的 DagRun 状态更新更快 (#27725)
不要在任务运行命令上显式地将 include_examples 设置为 False (#27813)
修复菜单边框颜色 (#27789)
修复回填排队的任务被重置为计划状态的问题 (#23720)
修复从父 dag 清除子 dag 映射任务的问题 (#27501)
处理任务回调中
V1Pod
的 json 编码 (#27609)修复 ExternalTaskSensor 无法检查 zipped dag 的问题 (#27056)
避免在 TriggerDagRunOperator 中重新获取 DAG 运行 (#27635)
在检索元数据时继续执行 (#27665)
外部任务 sensor 失败修复 (#27190)
在 pop 操作时添加默认的 None (#27537)
在触发 dag 视图中显示来自序列化 dag 的参数值 (#27482, #27944)
将 TriggerDagRun conf 检查移动到 execute (#27035)
解决触发器分配竞争条件 (#27072)
更新 google_analytics.html (#27226)
修复 web ui dags 列表页面中的一些 bug (自动刷新 & 跳转搜索空状态) (#27141)
修复 docker-compose.yaml 的 broken URL (#26721)
修复 xcom arg.py .zip bug (#26636)
修复 404
taskInstance
错误并将其拆分为两个表 (#26575)修复浏览器警告的不当线程使用 (#26551)
template rendering issue fix (#26390)
如果有任何导入错误,则清除
autoregistered
DAG (#26398)修复
from airflow import version
的延迟导入 (#26239)允许在触发的 dag runs 模态框中滚动 (#27965)
其他/内部¶
删除
is_mapped
属性 (#27881)简化 FAB 表重置 (#27869)
修复 Base Sensor 中的旧式类型 (#27871)
切换(返回)到延迟导入 (#27730)
完成了多个文件夹的 D400 (#27748)
简化 notes 手风琴测试 (#27757)
完成了
airflow/callbacks/* airflow/cli/*
的 D400 (#27721)完成了
airflow/api_connexion/* directory
的 D400 (#27718)完成了
airflow/listener/* directory
的 D400 (#27731)完成了
airflow/lineage/* directory
的 D400 (#27732)更新 API & Python Client 版本 (#27642)
完成了
airflow/api/*
目录的 D400 & D401 (#27716)完成了多个文件夹的 D400 (#27722)
将
/airflow/www
中的minimatch
从3.0.4 升级到 3.0.8
(#27688)将
/airflow/www
中的 loader-utils 从1.4.1 升级到 1.4.2
(#27697)暂时禁用嵌套任务映射 (#27681)
增加 alembic 最低版本 (#27629)
删除未使用的 code.html (#27585)
在所有地方启用 python 字符串规范化 (#27588)
升级依赖以避免回溯 (#27531)
稍微加强并阐明 issue 分类的重要性 (#27262)
删除重复的类型提示 (#27508)
向
BaseTrigger.run
添加存根“yield” (#27416)删除 dask 的上限限制 (#27415)
将 Dask 限制在
2022.10.1
以下 (#27383)更新旧式类型 (#26872)
启用 docs 的字符串规范化 (#27269)
稍微加快 up/downgrade 测试 (#26939)
弃用在 PodManager 中使用核心 get_kube_client (#26848)
将
memray
文件添加到gitignore / dockerignore
(#27001)提升 sphinx 和
sphinx-autoapi
(#26743)简化
RTIF.delete_old_records()
(#26667)将最后的 react 文件迁移到 typescript (#26112)
解决
pyupgrade
边缘情况 (#26384)
仅文档更改¶
将 dag_file_processor_timeouts 指标记录为已弃用 (#27067)
删除对 PostgreSQL 10 的支持 (#27594)
更新 index.rst (#27529)
添加关于将 lazy XCom proxy 推送到 XCom 的注释 (#27250)
修复 BaseOperator 链接 (#27441)
[docs] 最佳实践添加使用带有模板的变量的示例 (#27316)
使用插件的自定义视图的文档 (#27244)
更新概述页面上的图表视图和网格视图 (#26909)
文档修复 (#26819)
使标记标题字符串级别保持一致 (#26696)
添加 dag 测试函数的文档 (#26713)
修复
docker-compose.yaml
的 broken URL (#26726)添加关于时间表中使用顶级代码的注释 (#26649)
修复 example_datasets dag 名称 (#26495)
更新文档:现在可以在任务映射中实现 zip 类似的效果 (#26435)
从经典 operator 使用更改为 docs 中的任务装饰器 (#25711)
Airflow 2.4.3 (2022-11-14)¶
重大变更¶
使 DagProcessor
中使用的 RotatingFilehandler
非缓存 (#27223)¶
如果您想在使用 CONFIG_PROCESSOR_MANAGER_LOGGER=True
时减少缓存内存,并且您之前创建了本地设置,则可以更新 processor_manager_handler
以使用 airflow.utils.log.non_caching_file_handler.NonCachingRotatingFileHandler
处理程序,而不是 logging.RotatingFileHandler
。
Bug 修复¶
修复某些任务日志处理程序中的双重日志记录 (#27591)
用 Airflow 的函数替换 FAB url 过滤函数 (#27576)
修复映射任务的 mini scheduler 扩展 (#27506)
SLAMiss
是可空的,并且在拉取任务实例时并非总是返回 (#27423)修复搜索 DAG 时
_
的行为 (#27448)修复从 BaseExecutor 获取
dag/task
id 的问题 (#27550)修复 DDRQ 上的 SQLAlchemy 主键黑屏错误 (#27538)
修复 webserver 启动期间的 IntegrityError (#27297)
为用户名添加不区分大小写的约束 (#27266)
修复 python 外部模板键 (#27256)
减少多余的任务日志请求 (#27233)
使
DagProcessor
中使用的RotatingFilehandler
不缓存 (#27223)监听器:在 SQLAlchemy TaskInstance 对象上设置任务 (#27167)
修复 dags 列表页面自动刷新 & 跳转搜索空状态 (#27141)
将
executor.job_id
设置为 backfill 的BackfillJob.id
(#27020)
其他/内部¶
将 loader-utils 从
1.4.0
升级到1.4.1
in/airflow/www
(#27552)降低 k8s
TCP_KEEPALIVE
等警告的日志级别 (#26981)
仅文档更改¶
在 docker compose 文档中使用正确的 executable (#27529)
修复 DAG Runs 描述中的措辞 (#27470)
记录
KubernetesExecutor
覆盖容器参数 (#27450)修复
BaseOperator
链接 (#27441)将计时器单位从毫秒更正为秒。 (#27360)
在触发规则示例中添加遗漏的 import (#27309)
更新 SLA 措辞以反映其相对于
Dag Run
启动时间。 (#27111)将
kerberos
环境变量添加到文档 (#27028)
Airflow 2.4.2 (2022-10-23)¶
重大变更¶
[webserver] expose_stacktrace
的默认值更改为 False
(#27059)¶
[webserver] expose_stacktrace
的默认值已设置为 False
,而不是 True
。 这意味着管理员必须选择启用才能向最终用户公开堆栈跟踪。
错误修复¶
使堆栈跟踪成为可选 (#27059)
为 FAB 表添加缺失的 AUTOINC/SERIAL (#26885)
为 405(不允许的方法)错误添加单独的错误处理程序 (#26880)
不要重新修补已由当前 worker 控制的 pods (#26778)
处理任务持续时间图表中的映射任务 (#26722)
修复任务持续时间累积图表 (#26717)
避免 dag 重定向上的 500 错误 (#27064)
在 webserver 上过滤数据集依赖数据 (#27046)
删除
airflow dags reserialize
中重复的 dags 集合 (#27030)修复图表视图的自动刷新 (#26926)
不要用无效的 json 覆盖连接 extra (#27142)
修复下一个运行数据集模态链接 (#26897)
将 dag 审计日志按日期排序从升序更改为降序 (#26895)
提升 jinja2 的最低版本 (#26866)
将缺失的颜色添加到
state_color_mapping
jinja 全局变量 (#26822)修复在
airflow tasks test
中运行调试器 (#26806)修复使用 xcomarg 依赖项时的警告 (#26801)
降低已删除状态在显示任务摘要中的优先级 (#26789)
确保解析期间运算符的日志消息能够记录 (#26779)
在 REST API 中的 TaskState 枚举中添加重新启动状态 (#26776)
允许从 data.detail 中检索错误消息 (#26762)
简化 origin 字符串清理 (#27143)
从 StandardTaskRunner 中删除 DAG 解析 (#26750)
修复持续时间视图上的非隐藏累积图表 (#26716)
删除 TaskFail 重复项检查 (#26714)
修复当 dags_folder 与处理器不同时 airflow tasks run –local 的问题 (#26509)
修复来自 d3-color 的 yarn 警告 (#27139)
修复几个配置的版本 (#26491)
恢复 “No grid auto-refresh for backfill dag runs (#25042)” (#26463)
在 Airflow 调度 DAG 运行 DB 死锁时重试 (#26347)
其他/内部¶
围绕任务映射代码的清理 (#26879)
将面向用户的字符串移动到模板 (#26815)
向数据集图添加图标图例 (#26781)
升级
sphinx
和sphinx-autoapi
(#26743)简化
RTIF.delete_old_records()
(#26667)将 FAB 升级到
4.1.4
(#26393)
仅文档更改¶
修复了任务组示例中的三引号 (#26829)
文档修复 (#26819)
使标记标题字符串级别保持一致 (#26696)
添加关于时间表中使用顶级代码的注释 (#26649)
修复
docker-compose.yaml
的 broken URL (#26726)
Airflow 2.4.1 (2022-09-30)¶
重大变更¶
没有重大更改。
错误修复¶
渲染模板时,在上下文中取消映射任务 (#26702)
修复 ConfirmDialog 的滚动溢出 (#26681)
解决关于
Table.exists()
的弃用警告 (#26616)修复 XComArg zip 错误 (#26636)
排序运行以处理 NULL 时使用 COALESCE (#26626)
检查用户是否处于活动状态 (#26635)
公共管理员没有缺失用户警告 (#26611)
允许 MapXComArg 在序列化后解析 (#26591)
解决 dags 视图上关于 DISTINCT ON 查询的警告 (#26608)
当 secret backend kwargs 无效时记录警告 (#26580)
修复网格视图日志尝试次数 (#26556)
将
templates_dict
传递给任务装饰器的模板渲染问题 (#26390)修复在回填期间 Deferrable 卡在
scheduled
状态的问题 (#26205)在 db init 中抑制 SQLALCHEMY_TRACK_MODIFICATIONS 警告 (#26617)
在 Flask app 上正确设置
json_provider_class
,以便它使用我们的编码器 (#26554)修复 WSGI 根应用程序 (#26549)
修复重新运行具有已删除上游的映射任务时的死锁 (#26518)
ExecutorConfigType 应该是
cacheable
(#26498)修复从 Celery workers 检索的日志的路径的正确连接 (#26493)
DAG Deps 扩展
base_template
(#26439)不要从调度程序更新回填运行 (#26342)
仅文档更改¶
阐明所有者链接文档 (#26515)
修复数据集概念文档中的无效 RST (#26434)
记录
expose_config
的non-sensitive-only
选项 (#26507)修复
example_datasets
dag 名称 (#26495)现在可以在任务映射中实现类似 Zip 的效果 (#26435)
在文档中使用任务装饰器而不是经典运算符 (#25711)
Airflow 2.4.0 (2022-09-19)¶
重大变更¶
数据感知调度和 Dataset
概念已添加到 Airflow¶
Airflow 的此版本新增了 Dataset 概念,以及一种新的调度 dags 的方式:数据感知调度。
这允许由于任务“生成”数据集而自动创建 DAG 运行。 在某些方面,这可以被认为是 TriggerDagRunOperator
的逆运算,即生成 DAG 不控制创建哪些 DAG,而是消耗 DAG 可以“侦听”更改。
数据集由 URI 标识
from airflow import Dataset
# The URI doesn't have to be absolute
dataset = Dataset(uri="my-dataset")
# Or you can use a scheme to show where it lives.
dataset2 = Dataset(uri="s3://bucket/prefix")
要创建一个在 Dataset 更新时运行的 DAG,请使用新的 schedule
参数(见下文)并传递一个或多个 Dataset 的列表
with DAG(dag_id='dataset-consumer', schedule=[dataset]):
...
要将任务标记为生成数据集,请将数据集传递给 outlets
属性
@task(outlets=[dataset])
def my_task(): ...
# Or for classic operators
BashOperator(task_id="update-ds", bash_command=..., outlets=[dataset])
如果在不同的文件中具有生产者和消费者,则无需使用相同的 Dataset 对象,两个使用相同 URI 创建的 Dataset()
相等。
数据集代表数据集的抽象概念,并且(目前)没有任何直接的读取或写入能力 - 在此版本中,我们添加了将要构建的基础功能。
有关 Datasets 的更多信息,请参见 Datasets 文档。
扩展的动态任务映射支持¶
动态任务映射现在包括对 expand_kwargs
,zip
和 map
的支持。
有关动态任务映射的更多信息,请参阅动态任务映射。
在上下文管理器中使用的 DAGS 不再需要分配给模块变量 (#23592)¶
以前,您必须将 DAG 分配给模块级变量,Airflow 才能识别它。例如,这样:
with DAG(dag_id="example") as dag:
...
@dag
def dag_maker(): ...
dag2 = dag_maker()
可以变成这样:
with DAG(dag_id="example"):
...
@dag
def dag_maker(): ...
dag_maker()
如果由于任何原因要禁用此行为,请在 DAG 上设置 auto_register=False
# This dag will not be picked up by Airflow as it's not assigned to a variable
with DAG(dag_id="example", auto_register=False):
...
弃用 schedule_interval
和 timetable
参数 (#25410)¶
我们添加了新的 DAG 参数 schedule
,它可以接受 cron 表达式、timedelta 对象、timetable 对象或数据集对象列表。参数 schedule_interval
和 timetable
已被弃用。
如果您之前使用过 @daily
cron 预设,您的 DAG 可能是这样的:
with DAG(
dag_id="my_example",
start_date=datetime(2021, 1, 1),
schedule_interval="@daily",
):
...
今后,您应该改用 schedule
参数:
with DAG(
dag_id="my_example",
start_date=datetime(2021, 1, 1),
schedule="@daily",
):
...
如果您使用自定义时间表也是如此。以前,您会使用 timetable
参数:
with DAG(
dag_id="my_example",
start_date=datetime(2021, 1, 1),
timetable=EventsTimetable(event_dates=[pendulum.datetime(2022, 4, 5)]),
):
...
现在您应该使用 schedule
参数:
with DAG(
dag_id="my_example",
start_date=datetime(2021, 1, 1),
schedule=EventsTimetable(event_dates=[pendulum.datetime(2022, 4, 5)]),
):
...
移除实验性的智能传感器 (#25507)¶
智能传感器在 2.0 中添加,在 2.2 中为了支持可延迟操作符而被弃用,现在已被移除。
airflow.contrib
包和已弃用的模块是动态生成的 (#26153, #26179, #26167)¶
airflow.contrib
包和 Airflow 1.10 中 airflow.hooks
、airflow.operators
、airflow.sensors
包中已弃用的模块现在是动态生成的模块。虽然用户可以继续使用已弃用的 contrib 类,但静态代码检查工具不再能看到它们,并且会被报告为缺失。建议用户迁移到未弃用的类。
DBApiHook
和 SQLSensor
已移动 (#24836)¶
DBApiHook
和 SQLSensor
已移动到 apache-airflow-providers-common-sql
provider。
网格视图中的 DAG 运行排序逻辑已更改 (#25090)¶
网格视图中 DAG 运行的排序方式已更改,使其更“自然”。新的逻辑通常按数据间隔排序,但可以通过将 DAG 设置为使用自定义时间表来应用自定义排序。
新特性¶
添加数据感知调度 (AIP-48)
添加
@task.short_circuit
TaskFlow 装饰器 (#25752)使
execution_date_or_run_id
在tasks test
命令中变为可选 (#26114)自动注册在上下文管理器中使用的 DAG (#23592, #26398)
添加将 DAG 解析器日志发送到 stdout 的选项。 (#25754)
支持多个
DagProcessors
解析来自不同位置的文件。 (#25935)实现
ExternalPythonOperator
(#25780)使 execution_date 对于命令
dags test
变为可选 (#26111)针对字面列表实现
expand_kwargs()
(#25925)添加触发规则工具提示 (#26043)
为 airflow dags test 添加 CLI 的 conf 参数 (#25900)
在池视图中包含计划的插槽 (#26006)
将
output
属性添加到MappedOperator
(#25604)向 CLI 添加角色删除命令 (#25854)
添加 Airflow 特定的警告类 (#25799)
添加对
ExternalTaskSensor
中TaskGroup
的支持 (#24902)添加
@task.kubernetes
taskflow 装饰器 (#25663)添加一种在没有副作用的情况下导入 Airflow 的方法 (#25832)
让时间表控制生成的 run_ids。 (#25795)
允许在网格视图中进行每个时间表的排序覆盖 (#25633)
映射实例的网格日志 (#25610, #25621, #25611)
合并为一个
schedule
参数 (#25410)回填命令中的 DAG 正则表达式标志 (#23870)
在 Dags 视图 UI 中添加对所有者链接的支持 (#25280)
能够通过 REST API 清除特定 DAG 运行的任务实例 (#23516)
可以使用单独的 markdown 文件来记录 DAG (#25509)
将解析上下文添加到 DAG 解析 (#25161)
实现
CronTriggerTimetable
(#23662)添加在 UI 配置页面中屏蔽敏感数据的选项 (#25346)
从 ORM 创建新数据库 (#24156)
实现
XComArg.zip(*xcom_args)
(#25176)引入
sla_miss
指标 (#23402)实现
map()
语义 (#25085)将覆盖方法添加到 TaskGroupDecorator (#25160)
实现
expand_kwargs()
(#24989)添加用于关闭 SQL 查询日志记录的参数 (#24570)
添加
DagWarning
模型,并检查缺失的池 (#23317)将任务日志添加到网格详细信息面板 (#24249)
在调度程序中添加了小型健康检查服务器和端点 (#23905)
为
ExternalTaskMarker
运算符添加内置的外部链接 (#23964)添加默认任务重试延迟配置 (#23861)
添加清除 DagRun 端点。 (#23451)
添加对 cron 间隔时间表中字符串形式时区的支持 (#23279)
向 dags 主页添加自动刷新 (#22900, #24770)
改进¶
添加更多工作日 operator 和 sensor 示例 #26071 (#26098)
将 subdir 参数添加到 dags reserialize 命令 (#26170)
更新僵尸消息以更具描述性 (#26141)
仅在计划 DAG 时发送
SlaCallbackRequest
(#26089)更多地推广
Operator.output
(#25617)将 API 文件升级到 typescript (#25098)
减少映射任务中
hacky
双重渲染预防 (#25924)改进审计日志 (#25856)
删除映射的操作员验证代码 (#25870)
更多
DAG(schedule=...)
改进 (#25648)减少序列化 JSON 中的
operator_name
重复 (#25819)使网格视图组/映射摘要 UI 更加一致 (#25723)
删除
task_group_to_grid
中的无用语句 (#25654)将可选数据间隔添加到
CronTriggerTimetable
(#25503)删除
/grid
端点中未使用的代码 (#25481)添加和记录描述字段 (#25370)
改进 Airflow 对操作员 Jinja 模板处理的日志记录 (#25452)
更新核心示例 DAG 以使用
@task.branch
装饰器 (#25242)更新 DAG
audit_log
路由 (#25415)在命令中将 stdout 和 stderr 访问模式更改为追加 (#25253)
从网格视图中删除
getTasks
(#25359)使用 ParamSpec 改进 taskflow 类型提示 (#25173)
在网格详细信息窗格中使用表格 (#25258)
显式列出
@dag
参数 (#25044)更多
SchedulerJob
和TaskInstance
中的类型 (#24912)使用更具弹性的版本修补
getfqdn
(#24981)用
whitespaces
替换所有NBSP
字符 (#24797)在
airflow db upgrade
上重新序列化所有 DAG (#24518)重新制定 try_adopt_task_instances 方法的合同 (#23188)
使
expand()
错误变得模糊,以免产生误导 (#24018)为
[webserver]analytics_tool
添加枚举验证 (#24032)在审计日志中添加
dttm
可搜索字段 (#23794)允许通过
execute_in_subprocess
传递更多参数 (#23286)使用
func.count
来计算行数 (#23657)删除过时的序列化 dags (#22917)
AIP45 删除 airflow run local 中的 dag 解析 (#21877)
在 DagRun 更新端点中添加对排队状态的支持。 (#23481)
向 dagrun 端点添加字段 (#23440)
当未设置
result_backend
时,将sql_alchemy_conn
用于 celery 结果后端 (#24496)
Bug 修复¶
在 ORM 和迁移文件之间具有一致的类型 (#24044, #25869)
禁止任何超过 100 个字符的 dag 标签 (#25196)
将 dag_id 添加到
AirflowDagCycleException
消息 (#26204)正确构建 URL 以从系统中独立检索日志 (#26337)
对于工作节点日志服务器,仅在双栈可用时才绑定到 IPV6 (#26222)
修复
TaskInstance.task
在handle_failure
之前未定义 (#26040)撤消秘密后端配置缓存 (#26223)
修复错误的执行器配置序列化逻辑 (#26191)
根据角色权限显示
DAGs
和Datasets
菜单链接 (#26183)允许通过函数文档字符串设置
TaskGroup
工具提示 (#26028)修复具有大量任务的 DAG 的图形视图上的 RecursionError (#26175)
修复回填时偶尔发生的死锁 (#26161)
修复在使用
--reset-dagruns
True 进行回填期间未设置DagRun.start_date
的问题 (#26135)在图形中使用标签而不是 ID 作为动态任务标签 (#26108)
当叶子
mapped_task
为 SKIPPED 时,不要使 DagRun 失败 (#25995)将组前缀添加到装饰的映射任务 (#26081)
修复使用重复的逻辑日期触发时 UI 闪烁的问题 (#26094)
修复使
TaskInstance
相关端点的项目可为空,以避免 API 错误 (#26076)修复
BranchDateTimeOperator
以实现timezone-awreness-insensitive
(#25944)修复旧版时间表计划间隔参数 (#25999)
修复
list-mapped-task-instance
的响应模式 (#25965)正确检查缺失的映射 TIs 的存在性 (#25788)
修复网格视图上损坏的自动刷新 (#25950)
在网格 UI 中使用每个时间表的排序 (#25880)
将 DAG 解析为迭代时重写递归 (#25898)
在
iter_mapped_dependants
中查找跨组任务 (#25793)如果映射上游失败,则使任务失败 (#25757)
支持变量 get 端点中的
/
(#25774)将 cfg default_wrap 值用于网格日志 (#25731)
触发运行时添加原始请求参数 (#25729)
运算符名称与类分离 (#22834)
修复由于对输入时间对齐的假设而导致的数据间隔对齐不正确的问题 (#22658)
如果
XComArg
无法解析,则返回 None (#25661)更正
airflow variables set
命令中的json
参数帮助信息 (#25726)添加 MySQL 索引提示以在
find_zombies
查询中使用ti_state
(#25725)仅从渲染中排除实际展开的字段 (#25599)
网格,修复
axios
错误的 toast (#25703)修复 UI 重定向 (#26409)
dags list-runs 需要 dag_id 参数 (#26357)
检查 dags 自动刷新的排队状态 (#25695)
修复
dag_owner_attributes
表的升级代码 (#25579)将映射索引添加到任务日志 API (#25568)
确保清除具有错误的 dag 的僵尸任务 (#25550)
使额外的链接在 UI 中工作 (#25500)
同步插件 API 模式和定义 (#25524)
名字/姓氏可以为空 (#25476)
重构 DAG 页面以保持一致 (#25402)
在取消映射之前检查
expand_kwargs()
输入类型 (#25355)在计算映射长度时按键过滤 XCOM (#24530)
修复
ExternalTaskSensor
不适用于动态任务 (#25215)添加了异常捕获以在模板文件引发任何异常时发送默认电子邮件 (#24943)
使
MappedOperator
成员与BaseOperator
同步 (#24034)
其他/内部¶
为
MetaData
DB 添加自动生成的ERD
模式 (#26217)将序列化函数标记为内部 (#26193)
删除剩余的已弃用类,并将其替换为
PEP562
(#26167)将
dag_edges
和task_group_to_dict
移动到相应的 util 模块 (#26212)延迟导入许多模块以提高导入速度 (#24486, #26239)
修复不正确的类型信息 (#26077)
将缺少的 contrib 类添加到已弃用的字典 (#26179)
在 fork 后重新配置/连接
ORM
以运行 DAG 处理器 (#26216)从 lineage 处理中删除 cattrs。 (#26134)
删除了已弃用的 contrib 文件,并将其替换为
PEP-562
getattr (#26153)使
BaseSerialization.serialize
对其他类“公开”。 (#26142)更改模板以使用人类可读的任务实例描述 (#25960)
在
/airflow/www
中将moment-timezone
从0.5.34
升级到0.5.35
(#26080)修复 Flask 弃用警告 (#25753)
将
CamelCase
添加到生成的 operations 类型 (#25887)修复迁移问题并收紧 CI 升级/降级测试 (#25869)
修复
SkipMixin
中的类型注释 (#25864)解决 setuptools 可编辑包路径问题 (#25848)
在 /airflow/www 中将
undici
从5.8.0 to 5.9.1
升级 (#25801)将 custom_operator_name attr 添加到
_BranchPythonDecoratedOperator
(#25783)阐明
filename_template
弃用消息 (#25749)使用
ParamSpec
替换 Callable 中的...
(#25658)删除已弃用的模块 (#25543)
有关任务映射添加的文档 (#24489)
删除智能传感器 (#25507)
修复
elasticsearch
测试配置以避免有关已弃用模板的警告 (#25520)在 /airflow/ui 中将
terser
从4.8.0 to 4.8.1
升级 (#25178)从 rest
API
文档生成typescript
类型 (#25123)将 utils 文件升级到
typescript
(#25089)将剩余的上下文文件升级到
typescript
。 (#25096)将文件迁移到
ts
(#25267)将网格 Table 组件升级到
ts.
(#25074)如果映射的
ti
返回 None,则跳过针对它的映射 (#25047)重构
js
文件结构 (#25003)将映射的 kwargs 自省移动到单独的类型 (#24971)
仅在类型检查时断言 mypy 的内容 (#24937)
在
/airflow/www
中将moment
从2.29.3 to 2.29.4
升级 (#24885)从我们的代码库中删除“坏字符” (#24841)
从
BashOperator
中删除xcom_push
标志 (#24824)将 Flask 钩子注册移动到文件末尾 (#24776)
将更多 javascript 文件升级到
typescript
(#24715)清理任务装饰器类型提示和文档字符串 (#24667)
在 UI 中保留提供程序连接额外字段的原始顺序 (#24425)
将
charts.css
重命名为chart.css
(#24531)将
grid.css
重命名为chart.css
(#24529)其他:通过
set_new_process_group
实用程序创建新的进程组 (#24371)Airflow UI 修复原型污染 (#24201)
升级
moto
版本 (#24222)从 ref docs 中删除未使用的
[github_enterprise]
(#24033)清理日志调用中的
f-strings
(#23597)添加
JPype1
的限制 (#23847)简化 json 响应 (#25518)
添加最小 attrs 版本 (#26408)
仅文档更改¶
为
Celery
Flower 添加 url 前缀设置 (#25986)更新示例中已弃用的配置 (#26037)
修复 taskflow 教程的错误链接 (#26007)
将教程重组为一个部分 (#25890)
修复动态任务映射的概念文档 (#26002)
将代码示例从“经典”运算符更新到 taskflow (#25845, #25657)
添加有关手动修复
MySQL
字符集问题的说明 (#25938)在文档中首选本地快速入门 (#25888)
修复指向
Trigger Rules
的断开链接 (#25840)改进 docker 文档 (#25735)
正确链接到文档中的 Dag 解析上下文 (#25722)
添加有关
task_instance_mutation_hook
用法的注释 (#25607)注意 TaskFlow API 会自动在任务之间传递数据 (#25577)
更新 DAG 运行以阐明 DAG 何时实际运行 (#25290)
更新教程文档以包含运算符的定义 (#25012)
重写 Airflow 文档主页 (#24795)
修复
task-generated mapping
示例 (#23424)添加有关
2.2.0
中细微的逻辑日期更改的注释 (#24413)在最佳实践代码示例中添加缺少的导入 (#25391)
Airflow 2.3.4 (2022-08-23)¶
重大更改¶
添加了新的配置 [logging]log_formatter_class
,以修复 UI 上日志的时区显示 (#24811)¶
如果您在 [logging]logging_config_class
中使用了自定义的 Formatter 子类,请继承 airflow.utils.log.timezone_aware.TimezoneAware
,而不是 logging.Formatter
。例如,在您的 custom_config.py
中
from airflow.utils.log.timezone_aware import TimezoneAware
# before
class YourCustomFormatter(logging.Formatter): ...
# after
class YourCustomFormatter(TimezoneAware): ...
AIRFLOW_FORMATTER = LOGGING_CONFIG["formatters"]["airflow"]
AIRFLOW_FORMATTER["class"] = "somewhere.your.custom_config.YourCustomFormatter"
# or use TimezoneAware class directly. If you don't have custom Formatter.
AIRFLOW_FORMATTER["class"] = "airflow.utils.log.timezone_aware.TimezoneAware"
Bug 修复¶
禁用
MappedOperator
上的attrs
状态管理 (#24772)在 pickle
executor_config
之前,将pod_override
序列化为 JSON (#24356)修复
pid
检查 (#24636)在登录期间轮换会话 ID (#25771)
修复具有 reschedule 模式的 mapped sensor (#25594)
缓存自定义 secrets 后端,以便重用同一个实例 (#25556)
添加右边距 (#25554)
修复在清除后运行时缩减 mapped task 的 mapped length (#25531)
修复存在悬挂表时的
airflow db reset
(#25441)更改
disable_verify_ssl
的行为 (#25023)在 dag.add_task 方法中设置默认 task group (#25000)
移除干扰的索引强制。 (#25404)
移除无用的日志行 (#25347)
添加 mysql 索引提示以在关键部分查询中使用
task_instance.state
上的索引 (#25673)可配置的 umask 用于所有守护进程化的进程。 (#25664)
修复将 None 传递给模板过滤器时引发的错误 (#25593)
允许通配符 CORS 来源 (#25553)
修复 “This Session’s transaction has been rolled back” (#25532)
修复
TaskCallbackRequest
中的序列化错误 (#25471)修复 - 通过绝对路径解析 bash (#25331)
添加
__repr__
到 ParamsDict 类 (#25305)仅加载一次名称的分布 (#25296)
在调用时将
TimeSensorAsync
target_time
转换为 utc (#25221)在
expandGroup
之后调用updateNodeLabels
(#25217)停止 SLA 回调抢占其他回调并 DOS'ing
DagProcessorManager
队列 (#25147)修复
invalidateQueries
调用 (#25097)airflow/www/package.json
: 添加 name、version 字段。 (#25065)没有用于回填 dag runs 的网格自动刷新 (#25042)
修复 dag 详情页面上的标签链接 (#24918)
修复具有多个调度器的僵尸任务处理 (#24906)
将工作节点上的日志服务器绑定到
IPv6
地址 (#24755) (#24846)为
%(asctime)s
添加%z
,以修复 UI 上日志的时区 (#24811)TriggerDagRunOperator.operator_extra_links
是 attr (#24676)在
prohibit_commit
之外将 DAG 超时回调发送到处理器 (#24366)不要依赖当前的 ORM 结构来执行 db clean 命令 (#23574)
清除 TIs 时清除下一个方法 (#23929)
两个类型修复 (#25690)
仅文档更改¶
更新 set-up-database.rst (#24983)
修复 mysql 设置文档中的语法 (#24893 (#24939)
注意 DAG 策略如何与 default_args 一起使用 (#24804)
更新 PythonVirtualenvOperator Howto (#24782)
文档:为 Release Notes 添加指向 Github PR 的超链接 (#24532)
其他/内部¶
使用默认远程任务日志处理程序时,删除折旧警告 (#25764)
scheduler_job.py 中更清晰的方法名称 (#23702)
Bump cattrs 版本 (#25689)
在
sql_engine_collation_for_ids
文档中包含对external_executor_id
的遗漏提及 (#25197)重构
DR.task_instance_scheduling_decisions
(#24774)对 operator extra links 进行排序 (#24992)
扩展
resolve_xcom_backend
函数级别文档 (#24965)将 FAB 升级到 4.1.3 (#24884)
鉴于 2.2 破坏了我们的测试,将 Flask 限制为 <2.3 (#25511)
将 astroid 版本限制为 < 2.12 (#24982)
将 javascript 编译移动到主机 (#25169)
为 ParamSpec 提升 typing-extensions 和 mypy (#25088)
Airflow 2.3.3 (2022-07-09)¶
重大变更¶
我们已将 Flask App Builder 升级到主要版本 4.* (#24399)¶
Flask App Builder 是 Airflow Webserver 的重要组件之一,因为它使用了许多对于运行 Webserver 并将其集成到企业环境(尤其是身份验证)中至关重要的依赖项。
FAB 4.* 将许多依赖项升级到主要版本,从而将它们升级到已修复许多安全问题的版本。 执行了大量测试以向后兼容的方式引入依赖项,但是依赖项本身在其内部实现中引入了重大更改,因此如果用户出于自身目的使用这些库,则某些更改可能会影响用户。
您可能需要应用于 Oauth 配置的一个重要更改是添加 server_metadata_url
或 jwks_uri
,您可以在 此问题 中了解更多信息。
这是与 FAB 4 一起提供的依赖项中的重大更改列表
Bug 修复¶
修复 mini task scheduler 中的异常 (#24865)
修复将标签附加到 task group 的循环错误 (#24847)
修复
sensorinstance
的时间戳默认值 (#24638)将易出错的
ti.task.dag
赋值放回try/except
块中 (#24533) (#24592)将缺少的类型添加到
FSHook
(#24470)在
airflow tasks test
的stdout
中屏蔽 secrets (#24362)DebugExecutor
使用ti.run()
而不是ti._run_raw_task
(#24357)修复
MySQL
连接的URI
构造函数中的错误 (#24320)在
openapi
中添加了缺少的scheduleinterval
nullable true (#24253)统一任务运行器的
return_code
接口 (#24093)处理带重试的触发器中的偶尔死锁 (#24071)
删除 mapped
op_kwargs
的特殊 serde 逻辑 (#23860)如果外部任务进入
failed_state
,则ExternalTaskSensor
尊重soft_fail
(#23647)修复
StatD
定时指标单位 (#21106)将
cache_ok
标志添加到 sqlalchemy TypeDecorators。 (#24499)允许
LOGGING_LEVEL=DEBUG
(#23360)修复网格日期刻度 (#24738)
在 Grid 视图中消除状态突出显示抖动 (#24710)
修复 Grid 垂直滚动 (#24684)
不要尝试为关闭的组渲染子行 (#24637)
不要计算网格根实例 (#24528)
在过滤上游时保持网格视图选择 (#23779)
将
grid_data
端点加速 10 倍 (#24284)将每个运行日志模板应用于日志处理程序 (#24153)
如果执行配置具有旧的 k8s 对象,则不要崩溃调度器 (#24117)
为
map_index
修复TI.log_url
(#24335)修复迁移
0080_2_0_2
- 在设置列为非空之前替换空值 (#24585)如果使用旧的 Postgres 方案,则修补
sql_alchemy_conn
(#24569)种子
log_template
表 (#24511)修复已弃用的
log_id_template
值 (#24506)修复 toast 消息 (#24505)
为
task_instance
的 CASCADE 删除添加索引 (#24488)如果 Pod JSON 编码失败,则返回空字典 (#24478)
通过自定义工具提示提高网格渲染性能 (#24417, #24449)
检查网格组摘要的
run_id
(#24327)优化 cron 调度 DAG 的日历视图 (#24262)
使用
get_hostname
而不是socket.getfqdn
(#24260)检查边缘节点是否实际存在 (#24166)
修复
useTasks
在错误时崩溃 (#24152)不要让重新排队的 TIs 失败 (#23846)
减少网格视图 API 调用 (#24083)
将 Permissions 重命名为 Permission Pairs (#24065)
将
use_task_execution_date
替换为use_task_logical_date
(#23983)修复网格详细信息按钮被截断和小的 UI 调整 (#23934)
将 TaskInstance 状态
REMOVED
添加到已完成状态和成功状态 (#23797)修复清除后映射任务的不可变性 (#23667)
修复 dag 名称中有点的权限问题 (#23510)
修复关闭连接
dbapi.get_pandas_df
(#23452)检查 bag DAG
schedule_interval
是否与 timetable 匹配 (#23113)解析错误:任务添加到多个组 (#23071)
修复返回的 dag runs 的顺序不稳定问题 (#24405)
将影响运行/任务选择的
jsx
文件迁移到tsx
(#24509)修复示例的源代码链接 (#24386)
在
grid_data
端点上设置正确的Content-Type
和chartset
(#24375)
仅文档更改¶
更新模板文档以提及
extras
并格式化 AirflowVars
/Conns
(#24735)记录内置时间表 (#23099)
按字母顺序排列两个表 (#23923)
阐明用户不应使用 Maria DB (#24556)
将导入添加到延迟代码示例 (#24544)
添加有关 2022 年 6 月图像再生的注释 (#24524)
小清理
get_current_context()
章节 (#24482)修复默认 2.2.5
log_id_template
(#24455)更新从核心单独安装提供程序的描述 (#24454)
提及上下文变量和日志记录 (#24304)
杂项/内部¶
删除 internet explorer 支持 (#24495)
从
api_connexion
中删除魔法状态代码数字 (#24050)将 FAB 升级到
4.1.2
(#24619)将 Markdown 引擎切换到
markdown-it-py
(#19702)将
rich
更新到全局最新版本。 (#24186)摆脱
TimedJSONWebSignatureSerializer
(#24519)更新 flask-appbuilder
authlib
/oauth
依赖 (#24516)升级到
webpack
5 (#24485)添加
typescript
(#24337)在检索日志的请求中,JWT 声明已标准化:我们使用
nbf
和aud
声明来表示请求的成熟度和受众。 此外,使用“filename”有效负载字段来保留日志名称。 (#24519)解决所有
yarn
测试警告 (#24722)升级到 react 18 和 chakra 2 (#24430)
重构
DagRun.verify_integrity
(#24114)将 FAB 升级到
4.1.1
(#24399)我们现在至少需要
Flask-WTF 0.15
(#24621)
Airflow 2.3.2 (2022-06-04)¶
没有重大更改。
Bug 修复¶
至少运行一次
check_migration
循环修复映射任务的网格视图 (#24059)
不同 DAG 运行类型的网格视图中的图标 (#23970)
更快的网格视图 (#23951)
不允许调用不带参数的 expand (#23463)
将缺少的
is_mapped
字段添加到 Task 响应。 (#23319)DagFileProcessorManager:仅当当前进程不是会话领导者时才启动新的进程组 (#23872)
屏蔽尚未运行的 TIs 的敏感值 (#23807)
将级联添加到
dag_tag
到dag
外键 (#23444)将
--subdir
参数值用于独立 dag 处理器。 (#23864)通过悬停在图例行上来突出显示任务状态 (#23678)
修复并加速网格视图 (#23947)
防止 UI 在网格任务实例为空时崩溃 (#23939)
删除
dag-processor
命令中冗余的注册退出信号 (#23886)将
__wrapped__
属性添加到_TaskDecorator
(#23830)修复当 DbApiHook 中的
sql
为空列表时的 UnboundLocalError (#23816)允许在自动完成下拉列表中单击 DAG 所有者 (#23804)
简化
_airflow_moved
表的闪存消息 (#23635)从甘特图中排除缺失的任务 (#23627)
仅文档更改¶
添加数据库迁移参考的列名 (#23853)
杂项/内部¶
删除 xmltodict 的固定 (#23992)
Airflow 2.3.1 (2022-05-25)¶
重大更改¶
没有重大更改。
Bug 修复¶
自动重新调度
CeleryExecutor
中停止的排队任务 (#23690)修复展开/折叠所有按钮 (#23590)
网格视图状态过滤器 (#23392)
展开/折叠所有组 (#23487)
修复检索已弃用的非配置值 (#23723)
修复在未执行任务时 UI 中呈现的密钥。 (#22754)
修复提供程序导入错误匹配 (#23825)
修复忽略符号链接中的回归 (#23535)
修复
dag-processor
获取元数据数据库配置 (#23575)修复展开非模板字段时自动上游依赖 (#23771)
修复未捕获任务日志的问题 (#23684)
将
reschedule
添加到BaseSensorOperator
的序列化字段 (#23674)修改 db clean 以捕获 ProgrammingError 异常 (#23699)
从链接按钮中删除标题 (#23736)
修复网格详细信息标题文本重叠 (#23728)
确保
execution_timeout
作为 timedelta (#23655)不要对降级运行预迁移检查 (#23634)
在日志表中添加事件列的索引 (#23625)
为
CeleryKubernetesExecutor
和LocalKubernetesExecutor
实现send_callback
方法 (#23617)修复
PythonVirtualenvOperator
templated_fields (#23559)也将特定的 ID 排序规则应用于
root_dag_id
(#23536)防止
KubernetesJobWatcher
卡在资源太旧的状态 (#23521)修复在使用返回 none 的映射任务进行扩展时调度程序崩溃的问题 (#23486)
修复同时启动多个运行时的损坏的 dagrun 链接 (#23462)
修复:解析日志时的异常 #20966 (#23301)
处理 webserver 视图中的无效日期解析。 (#23161)
具有负开放槽的池不应阻止其他池 (#23143)
移动溢出、位置和填充 (#23044)
更改查找错误行的方法为 LEFT OUTER JOIN。 (#23528)
仅在
moved
表存在时才计算错误的引用 (#23491)在视觉上区分任务组摘要 (#23488)
删除高度嵌套组的颜色更改 (#23482)
优化 2.3.0 预升级检查查询 (#23458)
为
core__sql_alchemy_conn__cmd
添加向后兼容性 (#23441)修复文字交叉积展开 (#23434)
修复 xcom 列表中的损坏的任务实例链接 (#23367)
修复连接测试按钮 (#23345)
修复 cli
airflow dags show
用于映射操作符 (#23339)隐藏一些任务实例属性 (#23338)
如果服务器将拒绝并显示权限被拒绝,则不要显示网格操作 (#23332)
使用 run_id 作为
ti.mark_success_url
(#23330)修复更新用户身份验证统计信息 (#23314)
在映射实例表中使用
<Time />
(#23313)修复重复的 Kubernetes DeprecationWarnings (#23302)
将网格视图选择存储在 url 参数中 (#23290)
删除 Triggerer 中的自定义信号处理 (#23274)
当从 cli 传递池时,覆盖 TaskInstance 的池。 (#23258)
如果 DAG 运行 ID 中使用了“/”,则显示警告 (#23106)
在 kubernetes 混合执行器中使用 kubernetes 队列 (#23048)
在 try 块中添加标签。 (#21784)
仅文档更改¶
将
dag_processing.processor_timeouts
移动到 counters 部分 (#23393)阐明 bundle extras 不应用于 PyPi 安装 (#23697)
在文档中同步对 Postgres 和 K8S 的支持 (#23673)
替换文档中的 DummyOperator 引用 (#23502)
为
expand()
和partial()
添加仅关键字参数的文档注释 (#23373)修复了 2.3.0+ 升级后损坏的 Elasticsearch 日志的文档 (#23821)
其他/内部¶
为 airflow/configuration.py 添加类型提示 (#23716)
默认情况下从 docker-compose 禁用 Flower (#23685)
添加了对 Postgres 14 的支持(包括 breeze)(#23506)
添加 K8S 1.24 支持 (#23637)
将代码引用从树形结构重构为网格结构 (#23254)
Airflow 2.3.0 (2022-04-30)¶
有关生产 Docker 镜像相关的更改,请参见 Docker 镜像变更日志。
重大更改¶
将 execution_date
传递给 XCom.set()
, XCom.clear()
, XCom.get_one()
, 和 XCom.get_many()
已弃用 (#19825)¶
为了持续努力将 TaskInstance 绑定到 DagRun,现在 XCom 条目也与 DagRun 相关联。 使用 run_id
参数来指定 DagRun。
现在任务日志模板从元数据数据库读取,而不是从 airflow.cfg
读取 (#20165)¶
以前,任务的日志是从运行时的 [core] log_filename_template
和 [elasticsearch] log_id_template
配置值动态呈现的。 这导致了一些不幸的特性,例如,在 Airflow 实例运行一段时间后修改配置值是不切实际的,因为所有现有的任务日志都必须保存在之前的格式下,并且无法使用新的配置值找到。
引入了一个新的 log_template
表来解决这个问题。 每次 Airflow 启动时,此表都会与上述配置值同步,并且每个 DAG 运行都会添加一个新的字段 log_template_id
,以指向任务使用的格式(NULL
表示第一个条目,用于兼容性)。
最低 Kubernetes 库版本从 3.0.0
提升到 21.7.0
(#20759)¶
注意
这仅涉及更改 kubernetes
库,而不是 Kubernetes 集群。 Airflow 对 Kubernetes 版本的支持在 安装先决条件中进行了描述。
预计不会有行为上的改变。 这是为了利用关于刷新 Kubernetes API tokens with EKS 的一个 bugfix,它允许移除一些 workaround code。
XCom 现在由 run_id
定义,而不是 execution_date
(#20975)¶
作为 Airflow 2.2 中开始的 TaskInstance-DagRun 关系更改的延续,XCom 上的 execution_date
列已从数据库中删除,并替换为 ORM 级别的 关联代理字段。 如果您直接访问 Airflow 的元数据数据库,则应重写实现以使用 run_id
列。
请注意,Airflow 在数据库和 ORM 级别的元数据库定义被认为是实现细节,没有严格的向后兼容性保证。
已弃用非 JSON 可序列化的参数 (#21135)。¶
以前可以使用非 JSON 可序列化的 dag 或任务参数默认值。
例如,这以前是可以工作的
@dag.task(params={"a": {1, 2, 3}, "b": pendulum.now()})
def datetime_param(value):
print(value)
datetime_param("{{ params.a }} | {{ params.b }}")
请注意 set
和 datetime
类型的使用,它们不是 JSON 可序列化的。 这种行为是有问题的,因为要覆盖 dag 运行配置中的这些值,您必须使用 JSON,这可能使这些参数不可覆盖。 另一个问题是参数验证的支持假定 JSON。 在 Airflow 3.0 中将删除对非 JSON 可序列化参数的使用,在此之前,使用它们将在解析时产生警告。
对于 SQLAlchemy 1.4.0+,您必须在 sql_alchemy_conn
中使用 postgresql://
而不是 postgres://
(#21205)¶
当您使用 SQLAlchemy 1.4.0+ 时,您需要在 sql_alchemy_conn
中使用 postgresql://
作为 scheme。 在以前的 SQLAlchemy 版本中,可以使用 postgres://
,但在 SQLAlchemy 1.4.0+ 中使用它会导致
> raise exc.NoSuchModuleError(
"Can't load plugin: %s:%s" % (self.group, name)
)
E sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:postgres
如果您无法立即更改 URL 的 scheme,Airflow 将继续使用 SQLAlchemy 1.3,您可以降级 SQLAlchemy,但我们建议更新该 scheme。 有关详细信息,请参见 SQLAlchemy 变更日志。
auth_backends
替换了 auth_backend
配置设置 (#21472)¶
以前,只使用一个后端来授权使用 REST API。 在 2.3 中,这已更改为支持多个后端,用逗号分隔。 将依次尝试每个后端,直到返回成功的响应。
airflow.models.base.Operator
已删除 (#21505)¶
以前,有一个空的类 airflow.models.base.Operator
用于“类型提示”。 这个类对于任何事情来说从来都不是真正有用的(它所做的一切都可以通过 airflow.models.baseoperator.BaseOperator
更好地完成),并且已经被删除。 如果您依赖于该类的存在,请使用 BaseOperator
(用于具体的操作符), airflow.models.abstractoperator.AbstractOperator
( BaseOperator
和 AIP-42 MappedOperator
的基类), 或者 airflow.models.operator.Operator
(一个联合类型 BaseOperator | MappedOperator
用于类型注解).
DAG 文件夹中的 Zip 文件不能再具有 .py
扩展名 (#21538)¶
以前可以为 DAG 文件夹中的 zip 文件使用任何扩展名。 现在,.py
文件将被加载为模块,而无需检查它是否是 zip 文件,因为它会导致更少的 IO。 如果 DAG 文件夹中的 .py
文件是 zip 压缩文件,则解析它将失败并出现异常。
auth_backends
包括会话 (#21640)¶
为了允许 Airflow UI 使用 API,以前的默认授权后端 airflow.api.auth.backend.deny_all
被更改为 airflow.api.auth.backend.session
,如果设置了非默认值,则会自动将其添加到 API 授权后端列表中。
更改了日志文件名和 Elasticsearch log_id 的默认模板 (#21734)¶
为了支持动态任务映射,每个任务实例日志记录的默认模板已更改。 如果您的配置包含旧的默认值,它们将被就地升级。
如果您对新的配置值感到满意,则应删除 airflow.cfg
中的设置,并让使用默认值。 旧的默认值是
[core] log_filename_template
:{{ ti.dag_id }}/{{ ti.task_id }}/{{ ts }}/{{ try_number }}.log
[elasticsearch] log_id_template
:{dag_id}-{task_id}-{execution_date}-{try_number}
[core] log_filename_template
现在默认使用 dag_id=<id>/run_id=<id>
的“hive 分区样式”,这可能会在一些较旧的 FAT 文件系统上引起问题。 如果这影响了您,那么您将不得不更改日志模板。
如果您自定义了模板,并且想要使用动态映射任务,请确保模板包含 {{ ti.map_index }}
。
如果升级后发现无法访问任务日志,请尝试在 log_template
表中添加一行,设置 id=0
,其中包含您之前的 log_id_template
和 log_filename_template
。例如,如果您使用的是 2.2.5 中的默认值。
INSERT INTO log_template (id, filename, elasticsearch_id, created_at) VALUES (0, '{{ ti.dag_id }}/{{ ti.task_id }}/{{ ts }}/{{ try_number }}.log', '{dag_id}-{task_id}-{execution_date}-{try_number}', NOW());
BaseOperatorLink 的 get_link
方法已更改为接受 ti_key
关键字参数 (#21798)¶
在 v2.2 中,我们“弃用”了将执行日期传递给 XCom.get 方法,但对于操作符链接,由于只传递了 execution_date,因此没有其他选择。
现在,在 2.3 中,作为动态任务映射 (AIP-42) 的一部分,我们需要将 map_index 添加到 XCom 行,以支持 API 的“reduce”部分。
为了干净地支持这一点,我们更改了 BaseOperatorLink 的接口,使其接受 TaskInstanceKey 作为 ti_key
关键字参数(因为对于映射的操作符,execution_date + task 不再是唯一的)。
将检测到现有的签名(通过缺少 ti_key
参数),并将继续工作。
ReadyToRescheduleDep
现在仅在 reschedule
为 *True* 时运行 (#21815)¶
当运行 ReadyToRescheduleDep
时,它现在检查操作符上的 reschedule
属性,并且始终报告自身为 *passed*,除非它设置为 *True*。 如果你在自定义操作符上使用这个依赖类,你需要将这个属性添加到操作符类。使用此依赖类的内置操作符类(包括传感器和所有子类)已经具有此属性,因此不受影响。
操作符类上的 deps
属性应为类级别属性 (#21815)¶
为了支持操作符映射 (AIP 42),操作符类上的 deps
属性必须在类级别设置。 这意味着,如果自定义操作符将其实现为实例级别变量,则它将无法用于操作符映射。 这不会影响现有代码,但我们强烈建议您重构操作符的依赖逻辑,以支持新功能。
弃用:Connection.extra
必须是 JSON 编码的 dict (#21816)¶
总结:
从 Airflow 3.0 开始,airflow 连接中的 extra
字段必须是 JSON 编码的 Python dict。
原因和时间?
Airflow 的 Connection 用于存储凭据。 对于不适合用户/密码/主机/模式/端口的信息存储,我们有 extra
字符串字段。 其意图始终是提供任意键值对的存储,例如 SSH hook 中的 no_host_key_check
或 GCP 中的 keyfile_dict
。
但由于该字段是字符串,因此从技术上讲,可以存储任何字符串值。 例如,可以存储字符串值 'my-website.com'
并在 hook 中使用它。 但这是一种非常糟糕的做法。 一个原因是可理解性:当您查看 extra
的值时,您不知道其目的是什么。 更好的方法是存储 {"api_host": "my-website.com"}
,至少告诉您一些关于该值的信息。 另一个原因是可扩展性:如果将 API 主机存储为简单的字符串值,那么如果需要添加更多信息(例如 API 端点或凭据)会发生什么? 然后您需要将字符串转换为 dict,这将是一个重大更改。
出于这些原因,从 Airflow 3.0 开始,我们将要求 Connection.extra
字段存储 JSON 编码的 Python dict。
我将受到什么影响?
对于 Airflow 代码库中包含的提供程序的 用户,您不应该进行任何更改,因为在 Airflow 代码库中,我们不应该允许 hook 以这种方式滥用 Connection.extra
字段。
但是,如果您有任何自定义 hook 存储了 JSON dict 以外的内容,则必须对其进行更新。 如果这样做,您应该在检索或实例化此连接时看到警告(例如,它应该显示在任务日志中)。
要查看是否有任何需要更新的连接,您可以运行以下命令
airflow connections export - 2>&1 >/dev/null | grep 'non-JSON'
这将捕获有关在 extra
字段中存储 JSON 编码的 Python dict 以外内容的连接的任何警告。
tree
默认视图设置已重命名为 grid
(#22167)¶
如果将 dag_default_view
配置选项或 default_view
参数设置为 DAG()
到 tree
,则需要更新您的部署。 旧名称将继续工作,但会发出警告。
数据库配置已移至新部分 (#22284)¶
以下配置已从 [core]
移至新的 [database]
部分。 但是,在读取新选项时,将检查旧选项是否存在。 如果存在,将发出 DeprecationWarning,并改用旧选项。
sql_alchemy_conn
sql_engine_encoding
sql_engine_collation_for_ids
sql_alchemy_pool_enabled
sql_alchemy_pool_size
sql_alchemy_max_overflow
sql_alchemy_pool_recycle
sql_alchemy_pool_pre_ping
sql_alchemy_schema
sql_alchemy_connect_args
load_default_connections
max_db_retries
删除自定义连接 UI 字段必须以什么为前缀的要求 (#22607)¶
Hooks 可以通过实现方法 get_connection_form_widgets
为其连接类型定义自定义连接字段。 这些自定义字段在 Web UI 中显示为其他连接属性,但在内部,它们存储在连接 extra
dict 字段中。 由于技术原因,以前,存储在 extra
dict 中时,自定义字段的 dict 键必须采用 extra__<conn type>__<field name>
的形式。 这使得在 UI 之外定义连接更加麻烦,因为前缀 extra__<conn type>__
使其更难以读取和使用。 使用 #22607,我们现在可以定义自定义字段,以便可以在没有前缀的情况下从 extra
中读取和存储它们。
要启用此功能,请更新由 get_connection_form_widgets
方法返回的 dict,以从键中删除前缀。 在内部,提供程序管理器仍将使用前缀来确保每个自定义字段都是全局唯一的,但是返回的 widget dict 中缺少前缀将向 Web UI 发出信号,以读取和存储没有前缀的自定义字段。 请注意,这只是对 Web UI 行为的更改; 以这种方式更新 hook 时,必须确保当您的*hook*读取 extra
字段时,它还将检查前缀值以实现向后兼容性。
webserver.X_FRAME_ENABLED 配置现在按照描述工作了 (#23222)。¶
在 Airflow 2.0.0 - 2.2.4 中,webserver.X_FRAME_ENABLED 参数的工作方式与其描述相反,将该值设置为“true”会导致“X-Frame-Options”标头为“DENY”(不允许在 iframe 中使用 Airflow)。 当您将其设置为“false”时,未添加标头,因此可以将 Airflow 嵌入到 iframe 中。 默认情况下,Airflow 无法嵌入到 iframe 中。
在 Airflow 2.2.5 中,引入了一个错误,导致无法禁用 Airflow 在 iframe 中工作。 无论配置如何设置,都可以将 Airflow 嵌入到 iframe 中。
Airflow 2.3.0 恢复了参数的原始含义。 如果您将其设置为“true”(默认),则可以将 Airflow 嵌入到 iframe 中(未添加标头),但是当您将其设置为“false”时,将添加标头,并且无法将 Airflow 嵌入到 iframe 中。
新功能¶
添加动态任务映射 (AIP-42)
新的网格视图取代树视图 (#18675)
Python 操作符中模板化的
requirements.txt
(#17349)允许重用装饰的任务 (#22941)
将数据库配置移至新部分 (#22284)
添加
SmoothOperator
(#22813)使操作符的
execution_timeout
可配置 (#22389)事件时间表 (#22332)
支持使用自定义
ti_deps
规则进行 DAG 序列化 (#22698)支持在任务日志视图中下载日志 (#22804)
支持在失败时继续回填 (#22697)
添加
dag-processor
cli 命令 (#22305)添加在 LDAP 模式下创建用户的可能性 (#22619)
为计划的作业添加
ignore_first_depends_on_past
(#22491)更新基本传感器操作符以支持 XCOM 返回值 (#20656)
在 UI 触发屏幕中为运行 ID 添加一个选项 (#21851)
为连接启用 JSON 序列化 (#19857)
为批量更新 DAG 添加 REST API 端点 (#19758)
将队列按钮添加到 click-on-DagRun 界面。 (#21555)
添加
list-import-errors
到airflow dags
命令 (#22084)如果
standalone_dag_processor
配置为 True,则将回调存储在数据库中。 (#21731)添加 LocalKubernetesExecutor (#19729)
添加
celery.task_timeout_error
指标 (#21602)Airflow
db downgrade
命令行命令 (#21596)添加
ALL_SKIPPED
触发规则 (#21662)添加
db clean
CLI 命令用于清除旧数据 (#20838)添加
celery_logging_level
(#21506)支持为 dag 文件解析设置不同的超时值 (#21501)
支持生成用于升级的 SQL 脚本 (#20962)
添加压缩序列化 DAG 数据的选项 (#21332)
分支 Python Operator 装饰器 (#20860)
将审计日志视图添加到 DAG 视图 (#20733)
为失败的 SLA 回调通知添加缺失的 StatsD 指标 (#20924)
为尊重下游触发规则,添加
ShortCircuitOperator
可配置性 (#20044)允许在 Webserver 的页面标题中使用 Markup (#20888)
添加跟踪 TaskInstance 状态更改的 Listener Plugin API (#20443)
添加 context var hook 以注入更多环境变量 (#20361)
添加一个将所有任务设置为跳过的按钮 (#20455)
清理挂起的 Pod (#20438)
添加配置以警告 UI 中的公共部署暴露 (#18557)
记录文件名模板 (#20165)
添加了 Windows 扩展 (#16110)
在 Airflow 中显示到下一个 dag_run 的近似时间 (#20273)
扩展 UI 上的配置窗口 (#20052)
添加将 DAG 依赖关系特性显示到 CLI 的功能 (#19985)
为 'airflow dags reserialize' 添加 cli 命令 (#19471)
将缺失的 description 字段添加到 Pool schema(REST API) (#19841)
引入 DagRun 操作以将状态更改为 queued。 (#19353)
添加 DAG 运行详细信息页面 (#19705)
将角色导出/导入添加到 cli 工具 (#18916)
向
/dags
端点添加dag_id_pattern
参数 (#18924)
改进¶
在 UI 中显示 schedule_interval/timetable 描述 (#16931)
将 duration 列添加到 DAG 运行视图 (#19482)
启用对自定义连接额外字段的无前缀使用 (#22607)
将已完成计数器初始化为零 (#23080)
改进可选提供程序特性消息的日志记录 (#23037)
在 resolve_template_files 中提供有意义的错误消息 (#23027)
更新 ImportError 条目而不是删除并重新创建它们 (#22928)
向 db reset 命令添加选项
--skip-init
(#22989)支持从带有 “.yml” 扩展名的文件导入连接 (#22872)
支持在
.airflowignore
文件中使用 glob 语法 (#21392) (#22051)当数据是单页时,隐藏分页 (#22963)
支持在 Web UI 中对 DAG 进行排序 (#22671)
将
has_access
装饰器的速度提高约 200 毫秒 (#22858)将 XComArg 添加到 Airflow 模块的惰性导入列表 (#22862)
向 REST API dags/dag_id/details 端点添加更多字段 (#22756)
不在 UI 中显示不相关/重复/"内部" Task 属性 (#22812)
无需在 current_state 中加载整个 ti (#22764)
修复 Pickle dag 异常字符串 (#22760)
更好地验证 Localexecutor 的 parallelism 选项 (#22711)
将 backfill 异常记录到 sentry (#22704)
在 backfill 期间重试 MySQL 死锁上的提交 (#22696)
向 REST API get DAG(dags/dag_id) 端点添加更多字段 (#22637)
使用时间表生成当前年份的计划日期 (#22055)
禁用 Celery Worker 的连接池 (#22493)
使日期选择器标签在触发 dag 视图中可见 (#22379)
公开 airflow vars 中的
try_number
(#22297)添加通用连接类型 (#22310)
向 taskinstance finished 日志消息添加更多字段 (#22262)
如果调度程序未运行,则暂停自动刷新 (#22151)
显示 DagModel 详细信息。 (#21868)
将 pip_install_options 添加到 PythonVirtualenvOperator (#22158)
显示
airflow dags list
CLI 命令的导入错误 (#21991)当页面隐藏时,暂停自动刷新 (#21904)
默认参数类型检查 (#21809)
增强 XComArg 上 magic 方法的 UX (#21882)
py 文件不必在 refresh_dag 中检查
is_zipfiles
(#21926)修复 TaskDecorator 类型提示 (#21881)
为变量添加“显示记录”选项 (#21342)
尽可能使用 DB 来加速
airflow dag
子命令 (#21793)REST API:在任务实例中添加呈现的字段。 (#21741)
将默认身份验证后端更改为会话 (#21640)
在解析期间,不要检查
py
DAG 文件是否已压缩 (#21538)切换 XCom 实现以使用
run_id
(#20975)浏览视图上的操作日志 (#21569)
实现多个 API 身份验证后端 (#21472)
更改
get_connection()
中连接信息的日志记录级别详细信息 (#21162)在 airflow db shell 中支持 mssql (#21511)
支持 Celery 的配置
worker_enable_remote_control
(#21507)在
CgroupTaskRunner
中记录内存使用情况 (#21481)现代化 DAG 相关的 URL 路由,并将“tree”重命名为“grid” (#20730)
将 Zombie 检测移动到
SchedulerJob
(#21181)将运行
airflow
的速度提高 6 倍 (#21438)添加更多 SQL 模板字段渲染器 (#21237)
简化 fab has access 查找 (#19294)
仅记录默认方法的上下文 (#21244)
仅当至少有一个正在运行时,才记录触发器状态 (#21191)
在 provider 中添加可选功能。 (#21074)
更好地推断 @task.python 的 multiple_outputs (#20800)
改进字符串类型和非属性
template_fields
的处理 (#21054)删除不需要的 deps/version 要求 (#20979)
正确指定 TaskFlow API 的重载以进行类型提示 (#20933)
将 notification_sent 引入 SlaMiss 视图 (#20923)
将任务装饰器重写为组合 (#20868)
在浏览视图中的过滤器中添加“大于/小于或等于” (#20602) (#20798)
重写任务命令中的 DAG 运行检索 (#20737)
将大型 DAG(5k+ 任务)的 DagRun 创建速度提高 25-130% (#20722)
使原生环境具有像沙盒一样的 Airflow 风格 (#20704)
当参数值具有意外类型时,提供更好的错误提示 (#20648)
在 DagRun REST API 中按状态添加筛选器(列出 Dag 运行) (#20485)
防止具有自定义日志记录处理程序的任务中的指数内存增长 (#20541)
在日志记录 Mixin 中设置默认记录器 (#20355)
减少来自 www 的弃用警告 (#20378)
在使用 nvd3.lineChart 的所有图表的 x 轴上,将小时和分钟添加到时间格式 (#20002)
当任务请求的槽数超过定义的池时,添加特定警告 (#20178)
UI:更新 duration 列以提高可读性 (#20112)
使用 Viewer 角色作为示例公共角色 (#19215)
正确实现 DAG 参数字典复制 (#20216)
ShortCircuitOperator
通过返回 python_callable 结果来推送 XCom (#20071)为因 Dagrun 超时而终止的任务添加明确的日志记录 (#19950)
更改 Zombie 检测消息的日志级别 (#20204)
更好的确认提示 (#20183)
仅执行正在运行的 DagRuns 的 TIs (#20182)
必要时检查并在命令中运行迁移 (#18439)
仅在 Zombies 存在时才记录 (#20118)
增加电子邮件和用户名的长度 (#19932)
在 UI 中为 TI 添加更多过滤选项 (#19910)
通过连接类型动态启用“测试连接”按钮 (#19792)
避免使用 HA 调度程序在 postgres 服务器日志中乱用“无法获取锁” (#19842)
重命名
Connection.get_hook
参数,使其与SqlSensor
和SqlOperator
中的参数相同。 (#19849)使用来自 PR #18718 的最新更改在 SqlSensor 中添加 hook_params。 (#18431)
通过延迟 provider 初始化来加快 webserver 启动时间 (#19709)
PythonOperator 中
XCOM
值的可配置日志记录 (#19378)最小化生产 js 文件 (#19658)
在
BaseSqlOperator
中添加hook_params
(#18718)将缺失的“end_date”添加到哈希组件 (#19281)
更友好的 airflow plugins 命令输出 + 添加时间表 (#19298)
添加传感器默认超时配置 (#19119)
更新
taskinstance
REST API 模式以包含 dag_run_id 字段 (#19105)在 bash operator 中添加将用户定义的 env 变量附加到系统 env 变量的功能 (#18944)
重复连接:添加了逻辑以查询连接 id 是否存在,然后再创建一个 (#18161)
Bug 修复¶
使用继承的“trigger_tasks”方法 (#23016)
在 DAG 依赖关系检测器中,使用类类型而不是类名称 (#21706)
修复任务被 schedule_after_task_execution 错误跳过的问题 (#23181)
修复启用的 X-Frame 行为 (#23222)
允许
extra
在连接有效负载中根据 schema(REST API) 可为空。 (#23183)修复 Web UI 中 DAG 级别访问检查的
dag_id
提取 (#23015)修复 UI 上日志的时区显示 (#23075)
在图表中包含错误信息 (#23021)
更改触发器下拉菜单的左侧位置 (#23013)
不要为旧版 DAG 运行添加计划任务 (#23007)
为 TaskInstance 引用添加悬空行检查 (#22924)
验证连接
CLI
命令中的输入参数 (#22688)修复触发器事件有效负载未持久化到数据库的问题 (#22944)
在命令
db reset
中删除 “airflow moved” 表 (#22990)为任务组工具提示添加最大宽度 (#22978)
为
external_task_ids
添加模板支持。 (#22809)允许
DagParam
持有 falsy 值 (#22964)修复池指标中的回归 (#22939)
即使在使用池时也优先排序任务 (#22483)
从延期恢复时不要清除 XCom (#22932)
处理
get_logs_with_metadata endpoint
中的无效 JSON 元数据。 (#22898)修复针对 dag_run 的悬空行的预升级检查 (#22850)
修复了回填与调度程序的干扰 (#22701)
支持回填运行的 conf 参数覆盖 (#22837)
正确插值
PoolSlotsAvailableDep
状态中的池名称 (#22807)修复
email_on_failure
与render_template_as_native_obj
的配合使用 (#22770)修复
DagFileProcessorManager
上的处理器清理问题 (#22685)防止任务实例的元名称冲突 (#22783)
删除甘特图的 JSON 解析 (#22780)
缺失 dagrun 的检查应该知道版本 (#22752)
修复
ScheduleInterval
规范 (#22635)修复非运行和非提交任务的任务状态 (#22410)
即使在 DEBUG 级别也不要记录 hook 连接详细信息 (#22627)
停止在从 kubernetes 客户端收到空日志时崩溃 (#22566)
修复关于时区变更的错误 (#22525)
修复当一个任务具有 end_date 时,整个 DAG 停止的问题 (#20920)
使用 logger 在任务执行期间打印消息。 (#22488)
确保在异常处理期间不跳过 finalizers (#22475)
更新智能传感器文档,并对
is_smart_sensor_compatible()
进行小修复 (#22386)修复
run_id
k8s 和 elasticsearch 与 Airflow 2.1 的兼容性 (#22385)允许在
BranchPythonOperator
上except_skip
None (#20411)修复不正确的日期时间详细信息 (DagRun 视图) (#21357)
删除 secrets 后端中不正确的弃用警告 (#22326)
删除用于 K8s 令牌刷新的
RefreshConfiguration
解决方法 (#20759)屏蔽 GET
/connections/<connection>
端点中的 extras (#22227)在将任务直接提交给执行器时设置
queued_dttm
(#22259)解决了讨论 #22233 中提到的一些教程问题 (#22236)
将 docker 装饰器的默认 python 可执行文件更改为 python3 (#21973)
当 NOTSET 时,不要验证 Params 是否为 JSON (#22000)
添加每个 DAG 的删除权限 (#21938)
修复 kubernetes 23 库中处理一些 None 参数的问题。 (#21905)
修复在
bulk_write_to_db
中处理空 (None) 标签的问题 (#21757)修复 DAG 日期范围错误 (#20507)
从 views.py 中删除
request.referrer
(#21751)使
DbApiHook
使用 Connection 中的get_uri
(#21764)修复一些迁移 (#21670)
正确地在任务上[反]序列化资源 (#21445)
将参数
dag_id
、task_id
等添加到XCom.serialize_value
(#19505)更新测试连接功能以使用自定义表单字段 (#21330)
修复所有 “high” npm 漏洞 (#21526)
修复了错误地从角色中删除 action 而不是权限的错误。 (#21483)
使用 SQLA 1.4 修复 FAB/SecurityManager 中的关系连接错误 (#21296)
在 SQLAlchemy 1.4 中为 MSSQL 使用 Identity 而不是 Sequence (#21238)
确保
on_task_instance_running
监听器可以访问任务 (#21157)在触发 DAG 时返回到同一位置 (#20955)
修复
@task_group
中的任务 ID 去重 (#20870)为一些 FAB 迁移添加降级 (#20874)
仅在触发 DAG 时验证 Params (#20802)
修复
airflow trigger
cli (#20781)修复池中任务实例的迭代以防止阻塞 (#20816)
允许依赖于作为整体的
@task_group
(#20671)如果任务在延期后继续,则使用原始任务的
start_date
(#20062)禁用任务实例列表视图页面中的编辑按钮 (#20659)
修复包名称导入错误 (#20519) (#20519)
在获取清理 pod 列表时删除
execution_date
标签 (#20417)删除不需要的 FAB REST API 端点 (#20487)
修复包含斜杠的 Cloudwatch 日志组 arn 的解析 (#14667) (#19700)
MySQL 的 TIMESTAMP 列的健全性检查 (#19821)
允许将默认 celery 命令组与从基于 Celery 的执行器继承的执行器一起使用。 (#18189)
将
class_permission_name
移动到 mixin,以便它应用于所有类 (#18749)调整 trimmed_pod_id 并将 ‘.’ 替换为 ‘-’ (#19036)
将 custom_headers 传递给 send_email 和 send_email_smtp (#19009)
确保在示例 dags 中使用
catchup=False
(#19396)编辑 OpenApi 描述文件中的永久链接 (#19244)
从搜索 typeahead 列表中选择时直接导航到 DAG (#18991)
[次要] 修复主页上的填充 (#19025)
仅文档更改¶
更新 DAG 文件处理的文档 (#23209)
现在用发行说明和
towncrier
替换 changelog/updating (#22003)修复 tracking-user-activity.rst 中的错误引用 (#22745)
从文档中删除对
rbac = True
的引用 (#22725)文档:更新执行器绑定依赖项的描述 (#22601)
更新 check-health.rst (#22372)
关于 Docker Compose 可定制性的更强烈的语言 (#22304)
更新 logging-tasks.rst (#22116)
添加
sql_alchemy_connect_args
的示例配置 (#22045)更新 best-practices.rst (#22053)
添加有关 DAG 暂停/停用/删除的信息 (#22025)
添加您可能需要的集成测试 dags 的简短示例 (#22009)
在 CHANGELOG 上运行包容性语言检查 (#21980)
为 Sendgrid 添加详细的电子邮件文档 (#21958)
为
db upgrade
/db downgrade
添加文档 (#21879)更新 modules_management.rst (#21889)
修复 SqlAlchemy 1.4 方案更改的 UPDATING 部分 (#21887)
更新 TaskFlow 教程文档以显示如何传递 “operator-level” args。 (#21446)
修复文档 - 将 decreasing 替换为 increasing (#21805)
向文档添加另一种动态生成 DAG 的方法 (#21297)
添加有关所需时间同步的额外信息 (#21685)
更新 debug.rst 文档 (#21246)
将
postgres://
的用法替换为postgresql://
(#21205)修复
CeleryExecutor
文档中的任务执行过程 (#20783)
杂项/内部¶
恢复已弃用的安全管理器功能 (#23243)
将
DummyOperator
的用法替换为EmptyOperator
(#22974)弃用
DummyOperator
,建议使用EmptyOperator
(#22832)删除不必要的 python 3.6 条件语句 (#20549)
将 /airflow/www 中的
moment
从 2.29.1 升级到 2.29.2 (#22873)将 /airflow/www 中的
prismjs
从 1.26.0 升级到 1.27.0 (#22823)将 /airflow/www 中的
nanoid
从 3.1.23 升级到 3.3.2 (#22803)将 /airflow/www 中的
minimist
从 1.2.5 升级到 1.2.6 (#22798)从 db init 命令中删除 dag 解析 (#22531)
更新我们用于执行器绑定依赖项的方法 (#22573)
在 FAB 模型中使用
Airflow.Base.metadata
(#22353)限制 docutils 以使我们的文档再次漂亮 (#22420)
添加 Python 3.10 支持 (#22050)
[功能] 添加 1.22 1.23 K8S 支持 (#21902)
SQLA 现在是 1.4+,删除 pandas 上限 (#22162)
如果使用旧的 postgres 方案,则修补
sql_alchemy_conn
(#22333)防止意外滥用 XCom.get_value() (#22244)
排序迁移的文件名 (#22168)
不要尝试为 Celery 表自动生成迁移 (#22120)
需要 SQLAlchemy 1.4 (#22114)
bump sphinx-jinja (#22101)
为 SQLAlchemy 添加兼容性填充以避免警告 (#21959)
将
xcom.dagrun_id
重命名为xcom.dag_run_id
(#21806)弃用非 JSON
conn.extra
(#21816)将
jsonschema
的上限版本提升到 5.0 (#21712)弃用辅助实用程序
days_ago
(#21653)删除
:type`
行,现在sphinx-autoapi
支持类型提示 (#20951)消除测试中的弃用警告 (#20900)
在更新 TI 的状态(UI & REST API)时,使用
DagRun.run_id
而不是execution_date
(#18724)将 Context stub 添加到 Airflow 包 (#20817)
更新 Kubernetes 库版本 (#18797)
将
PodLauncher
重命名为PodManager
(#20576)删除 Python 3.6 支持 (#20467)
为不可 JSON 序列化的参数添加弃用警告 (#20174)
将 TaskMixin 重命名为 DependencyMixin (#20297)
弃用将 execution_date 传递给 XCom 方法 (#19825)
删除
get_readable_dags
和get_editable_dags
,以及get_accessible_dags
。 (#19961)删除 postgres 9.6 支持 (#19987)
删除了硬编码的连接类型。 检查 hook 是否为 DbApiHook 的实例。 (#19639)
添加 kubernetes 1.21 支持 (#19557)
添加 FAB 基类并显式设置 import_name。 (#19667)
删除用于处理自动更改视图权限的未使用状态转换。 (#19153)
Chore: 使用 enum 作为
__var
和__type
成员 (#19303)使用 fab 模型 (#19121)
整合 Airflow Security Manager 和 FAB 默认值之间的方法名称 (#18726)
移除 Python 3.10 的 distutils 用法 (#19064)
移除 SchedulerJob 中冗余的
max_tis_per_query
初始化 (#19020)移除 API 中已弃用的
init_role()
用法 (#18820)移除 dbapi hook 上的重复代码 (#18821)
Airflow 2.2.5, (2022-04-04)¶
重大更改¶
没有重大更改。
Bug 修复¶
检查并禁止 sqlite 的相对路径 (#22530)
修复了 dask executor 和测试 (#22027)
修复了指向 celery 文档的损坏链接 (#22364)
修复了提供给尝试次数和落地时间图表的不正确数据 (#21928)
修复了未分配触发器的分配问题 (#21770)
修复了 triggerer
--capacity
参数 (#21753)修复了页面加载时图表自动刷新 (#21736)
修复了目录的文件系统传感器 (#21729)
修复了多余的
order_by(TaskInstance.execution_date)
(#21705)正确处理 LocalFileSystem secrets 中的多个“=” (#21694)
记录 local executor 中的异常 (#21667)
在 web ui 上禁用
default_pool
删除 (#21658)扩展
typing-extensions
以使用 python 3.8+ 安装 #21566 (#21567)释放未使用的连接池 (#21565)
修复任务失败时记录 JDBC SQL 错误的问题 (#21540)
在存在覆盖时过滤掉默认配置 (#21539)
修复 Resources
__eq__
检查 (#21442)修复
max_active_runs=1
在min_file_process_interval
较高时无法调度运行的问题 (#21413)减少 Stale DAG 停用导致的 DB 负载 (#21399)
修复 triggerer 和 scheduler 之间的竞争条件 (#21316)
修复从任务实例日志视图重定向触发 DAG (#21239)
记录触发器异常中的 traceback (#21213)
触发器可能使用连接;确保我们屏蔽密码 (#21207)
更新
ExternalTaskSensorLink
以处理模板化的external_dag_id
(#21192)确保
clear_task_instances
设置有效的运行状态 (#21116)修复:更新自定义连接字段处理 (#20883)
截断 DAG 用户代码的堆栈跟踪,用于执行期间引发的异常 (#20731)
修复重复触发器创建竞争条件 (#20699)
修复任务卡在计划状态的问题 (#19747)
修复:不渲染未定义的图形边缘 (#19684)
仅当
X_FRAME_ENABLED
设置为 true 时,才将X-Frame-Options
标头设置为 DENY (#19491)
仅文档更改¶
将
on_execute_callback
添加到回调文档 (#22362)添加有关指定 DB schema 的文档 (#22347)
修复教程中 pipeline 示例的 postgres 部分 (#21586)
扩展 DAG 和任务状态的文档,并更新触发器规则文档 (#21382)
更新 Airflow 时需要 DB 升级 (#22061)
从文档中删除具有误导性的 MSSQL 信息 (#21998)
其他¶
将新的 Airflow Trove Classifier 添加到 setup.cfg (#22241)
在 TriggerRunner 中将
to_delete
重命名为to_cancel
(#20658)将 Flask-AppBuilder 更新到
3.4.5
(#22596)
Airflow 2.2.4, (2022-02-22)¶
重大更改¶
智能传感器已弃用¶
智能传感器是 Airflow 2 中添加的“提前访问”功能,现已弃用,并将在 Airflow 2.4.0 中删除。它们已被 Airflow 2.2.0 中添加的可延迟操作符取代。
有关如何迁移的详细信息,请参阅 迁移到可延迟操作符。
Bug 修复¶
从 Flask-Appbuilder 添加缺少的登录提供程序相关方法 (#21294)
修复由于作业表缺少
dag_id
索引而导致的 DAG 删除缓慢的问题 (#20282)添加一个会话后端,用于将会话数据存储在数据库中 (#21478)
仅显示正在运行的 dags 的任务状态或仅显示最后一个完成的 dag 的任务状态 (#21352)
在日志处理程序中使用兼容的数据间隔 shim (#21289)
修复 DAG 运行生成的 run_id 与逻辑日期不匹配的问题 (#18707)
修复 TriggerDagRunOperator 额外链接 (#19410)
添加在远程用户模式下创建用户的可能性 (#19963)
避免重新调度任务时出现死锁 (#21362)
修复 dag 首次运行的错误调度时间 (#21011)
修复执行丢失 DAG 的任务实例时 Scheduler 崩溃的问题 (#20349)
当 DAG 标记为失败时,延迟的任务不会取消 (#20649)
删除
Dag.get_task_instances()
中重复的 dag_run join (#20591)避免删除 DAG 时意外丢失数据 (#20758)
修复
/rendered-k8s
视图中的会话使用 (#21006)修复当运行两次时
airflow dags backfill --reset-dagruns
错误 (#21062)不要在
refresh_from_task
中设置TaskInstance.max_tries
(#21018)不要在 dagrun REST API 端点的 body 中要求 dag_id (#21024)
在内部安全管理器中从 Azure OAUTH 响应添加角色 (#20707)
如果用户具有 DAG “读取”权限,则允许查看 DagRuns 和 TIs (#20663)
修复运行两次时
airflow dags test <dag_id> <execution_dt>
导致错误的问题 (#21031)切换到非 vendored 的最新 connexion 库 (#20910)
将 flask-appbuilder 提升到
>=3.3.4
(#20628)将 celery 升级到
5.2.3
(#19703)将 croniter 从
<1.1
提升到<1.2
(#20489)避免为
TaskInstance.get_template_context()
调用DAG.following_schedule()
(#20486)修复(独立):删除硬编码的 Webserver 端口 (#20429)
删除实验性 API 中不必要的日志记录 (#20356)
取消忽略 DeprecationWarning (#20322)
Deepcopying Kubernetes Secrets 属性导致问题 (#20318)
修复(dag-dependencies):修复箭头样式 (#20303)
添加任务实例检索锁的重试 (#20030)
使用 dogstatsd 时正确发送定时指标(修复 schedule_delay 指标) (#19973)
增强 dict 类型化的
multiple_outputs
推断 (#19608)修复 Amazon SES 电子邮件后端 (#18042)
Pin MarkupSafe,直到我们能够升级 Flask/Jinja (#21664)
仅文档更改¶
在 DAG 运行文档中添加了解释逻辑日期的概念 (#21433)
添加关于带有 env vars 的变量优先级的说明 (#21568)
更新错误文档以包含 before_send 选项 (#21275)
扩充 xcom 文档 (#20755)
添加关于 “最新” 约束的文档和发布策略 (#21093)
在 Python API 参考中添加指向 DAG 模型的链接 (#21060)
添加了一个 enum 参数示例 (#20841)
比较 taskgroup 和 subdag (#20700)
添加关于保留的
params
关键字的说明 (#20640)改进
Params
的文档 (#20567)修复 MySQL 数据库创建代码中的错字(设置 DB 文档) (#20102)
添加 requirements.txt 描述 (#20048)
清理文档中的
default_args
用法 (#19803)将 docker-compose 解释添加到 conn localhost (#19076)
更新教程的 CSV 提取代码 (#18960)
添加 Pendulum 1.x -> 2.x 升级文档 (#18955)
从文档中清除动态
start_date
值 (#19607)多个池插槽的文档 (#20257)
使用如何解决升级后警告的详细代码示例更新 upgrading.rst (#19993)
其他¶
弃用实验性 API 中的一些函数 (#19931)
弃用智能传感器 (#20151)
Airflow 2.2.3, (2021-12-21)¶
重大更改¶
没有重大更改。
Bug 修复¶
延迟 Jinja2 上下文 (#20217)
排除
snowflake-sqlalchemy
v1.2.5 (#20245)从旧版
importlib.resources
API 迁移 (#19091)将
setgid
作为 forked 任务 runner 中执行的第一个命令移动 (#20040)修复启动
DagProcessorAgent
时的竞争条件 (#19935)将
httpx
限制为 <0.20.0 (#20218)将 provider 导入错误记录为调试警告 (#20172)
提升所需的最低
alembic
版本 (#20153)修复 gantt 视图中的日志链接 (#20121)
通过将 chown 移动到使用 sudo 来修复 #19028 (#20114)
取消
MarkupSafe
的上限 (#20113)修复编辑日志时的无限递归 (#20039)
修复 db 降级 (#19994)
Context 类处理弃用 (#19886)
修复可能引用未声明变量的问题 (#19933)
验证在分配时
DagRun
状态是否有效 (#19898)解决 MSSQL 的偶尔死锁 (#19856)
使任务运行设置能够重新初始化 (#19845)
修复同一任务的日志端点 (#19672)
显式强制转换宏 datetime 字符串输入 (#19592)
当任务实例丢失时,不要崩溃并显示堆栈跟踪 (#19478)
修复任务日志视图中的日志时区 (#19342) (#19401)
修复:将 taskgroup 工具提示添加到图形视图 (#19083)
在表单和表格中重命名执行日期 (#19063)
简化“无效的 TI 状态”消息 (#19029)
处理准备文件路径队列时不存在文件的情况 (#18998)
不要为导入错误的 DAG 创建 dagrun (#19367)
修复在连接类型之间切换时字段重命名的问题 (#19411)
KubernetesExecutor
应该默认使用模板镜像 (如果已使用) (#19484)修复任务实例 API 无法列出状态为
None
的任务实例 (#19487)修复
DagFileProcessor.manage_slas
中的 IntegrityError (#19553)将数据间隔字段声明为可序列化的 (#19616)
放宽时间表类验证 (#19878)
修复用于查找排队的
KubernetesExecutor
Pod 的标签 (#19904)修复使用复制时 MySQL 的移动数据迁移检查 (#19999)
仅文档更改¶
当 example_dags 缺少依赖项时发出警告,而不是显示回溯 (#20295)
可延迟运算符文档澄清 (#20150)
确保所有示例 DAG 都能正常工作 (#19355)
更新核心示例 DAG 以在适用的情况下使用 TaskFlow API (#18562)
在任务重试时添加 xcom 清除行为 (#19968)
添加一个简短的章节,重点介绍如何调整连接的密钥格式 (#19859)
添加有关 Apache Airflow 支持的操作系统的信息 (#19855)
更新文档以反映更改
base_log_folder
需要更新其他配置 (#19793)KubernetesExecutor
Pod 模板文档中的免责声明 (#19686)添加有关
execution_date
->run_id
的升级说明 (#19593)在 TaskFlow 教程文档中扩展
.output
运算符属性信息 (#19214)添加示例 SLA DAG (#19563)
添加一个正确的示例来修补 DAG (#19465)
将 DAG 文件处理描述添加到 Scheduler Concepts (#18954)
更新 TaskFlow API 教程文档中的显式参数示例 (#18907)
添加回关于在 Python/@task 中使用上下文的文档 (#18868)
添加端点/字段添加到 REST API 中的发布日期 (#19203)
更好的
pod_template_file
示例 (#19691)添加有关如何自定义镜像入口点的描述 (#18915)
Dags-in-image Pod 模板示例不应具有 DAG 挂载 (#19337)
Airflow 2.2.2 (2021-11-15)¶
重大更改¶
没有重大更改。
Bug 修复¶
修复检查 Variable 是否存在时的错误 (#19395)
修复将
relativedelta
作为schedule_interval
传递时的序列化 (#19418)修复 SQL Server 中悬挂 TaskInstance 行的移动 (#19425)
修复甘特图视图中的任务实例模态框 (#19258)
修复具有集合数据类型的
Params
的序列化 (#19267)在调用
.is_alive()
之前检查 job 对象是否为None
(#19380)当 Pod 无法处理时,任务应立即失败 (#19359)
修复数据库迁移的降级 (#19390)
仅将 SchedulerJobs 标记为失败,而不是任何作业 (#19375)
修复“标记为”确认页面上的消息 (#19363)
Bugfix: 在读取数据间隔之前检查下一个运行是否存在 (#19307)
修复带有默认编码/排序规则的 MySQL 数据库迁移 (#19268)
修复隐藏的工具提示位置 (#19261)
sqlite_default
连接已硬编码为/tmp
,请改用gettempdir
(#19255)修复 DAG 代码页面上的切换换行 (#19211)
在 CLI 中阐明“未找到 DAG”错误消息 (#19338)
向 SLA 添加关于
schedule_interval
的注释 (#19173)使用
execution_date
检查TriggerDagRunOperator
是否存在DagRun
(#18968)在
PoolSlotsAvailableDep
中添加显式会话参数 (#18875)FAB 仍然需要
WTForms<3.0
(#19466)修复
catchup=True
时缺少 dagruns 的问题 (#19528)
仅文档更改¶
为“timetable”添加缺少的参数文档 (#19282)
改进 Kubernetes Executor 文档 (#19339)
更新 Docker 文档中使用的镜像标签
Airflow 2.2.1 (2021-10-29)¶
重大更改¶
Param
的 default
默认值已删除¶
在 Airflow 2.2.0 中引入的 Param
意外地将默认值设置为 None
。此默认值已删除。 如果你想要 None
作为默认值,请显式地将其设置为默认值。 例如
Param(None, type=["null", "string"])
现在,如果你解析一个没有默认值的 Param
并且没有传递值,你将收到一个 TypeError
。 例如
Param().resolve() # raises TypeError
max_queued_runs_per_dag
配置已被删除¶
[core]
部分中的 max_queued_runs_per_dag
配置选项已被删除。 以前,这控制了调度程序可以在 DAG 中创建的排队 dagrun 的数量。 现在,最大数量由 DAG 的 max_active_runs
在内部控制
Bug 修复¶
修复 SchedulerJob 中的意外提交错误 (#19213)
添加 DagRun.logical_date 作为属性 (#19198)
在任务完成时清除
ti.next_method
和ti.next_kwargs
(#19183)更快地将 PostgreSQL 数据库迁移到 Airflow 2.2 (#19166)
删除
Swagger2Specification._set_defaults
类方法中的不正确的类型注释 (#19065)将 TriggererJob 添加到作业检查命令 (#19179, #19185)
当下一个运行为
None
时隐藏工具提示 (#19112)使用数据间隔兼容层创建 TI 上下文 (#19148)
修复排队的 DAG 运行更改
catchup=False
的行为 (#19130, #19145)在 DAG 或任务完成时,将详细信息添加到日志记录中。 (#19097)
警告不支持 Python 3.10 (#19060)
通过使用
max_active_runs
限制排队的 dagrun 创建来修复 catchup (#18897)防止序列化 DAG 丢失时调度程序崩溃 (#19113)
不要为其他数据库安装 SQLAlchemy/Pendulum 适配器 (#18745)
解决
libstdcpp
TLS 错误 (#19010)将
ds
,ts
等改回使用逻辑日期 (#19088)确保在标记为失败/成功/跳过时任务状态不会更改 (#19095)
放宽打包要求 (#19087)
将触发器页面标签重命名为逻辑日期 (#19061)
允许 Param 支持默认值
None
(#19034)从数据库反序列化时,升级旧的 DAG/任务参数格式 (#18986)
不要将 ENV 和 _cmd 烘焙到非 sudo 的 tmp 配置中 (#18772)
CLI:如果在缺少参数的情况下加载 DAG 之前,
backfill
命令失败 (#18994)BugFix:插入到
task_fail
时执行日期为空,违反了 NOT NULL (#18979)尝试在数据库升级中移动“悬挂”行 (#18953)
在
SchedulerJob._process_executor_events
中行锁定 TI 查询 (#18975)Sentry 发送前的回退 (#18980)
修复 Airflow 2.2.0 中的
XCom.delete
错误 (#18956)在启动触发器之前检查 Python 版本 (#18926)
仅文档更改¶
更新 TaskInstances 和 DagRuns 的访问控制文档 (#18644)
添加有关托管 Postgres 的 keepalive 的信息 (#18850)
Doc:向日志记录和监控添加回调部分 (#18842)
将 PATCH DAGrun 与其他 DAGRun 端点组合在一起 (#18885)
Airflow 2.2.0 (2021-10-11)¶
重大更改¶
注意:将数据库升级到 2.2.0
或更高版本可能需要一段时间才能完成,特别是如果你有一个大型 task_instance
表。
worker_log_server_port
配置已移动到 logging
部分。¶
worker_log_server_port
配置选项已从 [celery]
部分移动到 [logging]
部分,以便允许在不同的执行器之间重用。
pandas
现在是一个可选依赖项¶
以前,pandas
是一个核心要求,因此当你运行 pip install apache-airflow
时,它会查找 pandas
库,如果它不存在,则会安装它。
如果要安装与 Airflow 兼容的 pandas
,可以在安装 Airflow 时使用 [pandas]
extra,例如 Python 3.8 和 Airflow 2.1.2
pip install -U "apache-airflow[pandas]==2.1.2" \
--constraint https://raw.githubusercontent.com/apache/airflow/constraints-2.1.2/constraints-3.8.txt"
none_failed_or_skipped
触发规则已被弃用¶
TriggerRule.NONE_FAILED_OR_SKIPPED
被 TriggerRule.NONE_FAILED_MIN_ONE_SUCCESS
替代。这只是名称更改,没有进行功能更改。此更改是向后兼容的,但是 TriggerRule.NONE_FAILED_OR_SKIPPED
将在下一个主要版本中删除。
虚拟触发规则已被弃用¶
TriggerRule.DUMMY
被 TriggerRule.ALWAYS
替代。这只是名称更改,没有进行功能更改。此更改是向后兼容的,但是 TriggerRule.DUMMY
将在下一个主要版本中删除。
DAG 并发设置已重命名¶
[core] dag_concurrency
在 airflow.cfg
中的设置已重命名为 [core] max_active_tasks_per_dag
,以便更好地理解。
它是每个 DAG 允许并发运行的任务实例的最大数量。要计算 DAG 并发运行的任务数量,请将 DAG 的所有 DAG 运行的运行任务数量相加。
这可以在 DAG 级别使用 max_active_tasks
进行配置,并且可以在 airflow.cfg
中设置为默认值 [core] max_active_tasks_per_dag
。
之前:
[core]
dag_concurrency = 16
现在:
[core]
max_active_tasks_per_dag = 16
类似地,DAG.concurrency
已重命名为 DAG.max_active_tasks
。
之前:
dag = DAG(
dag_id="example_dag",
start_date=datetime(2021, 1, 1),
catchup=False,
concurrency=3,
)
现在:
dag = DAG(
dag_id="example_dag",
start_date=datetime(2021, 1, 1),
catchup=False,
max_active_tasks=3,
)
如果您正在使用 DAGs Details API endpoint,请使用 max_active_tasks
代替 concurrency
。
任务并发参数已重命名¶
BaseOperator.task_concurrency
已被弃用并重命名为 max_active_tis_per_dag
,以便更好地理解。
此参数控制每个任务跨 dag_runs
并发运行的任务实例的数量。
之前:
with DAG(dag_id="task_concurrency_example"):
BashOperator(task_id="t1", task_concurrency=2, bash_command="echo Hi")
之后:
with DAG(dag_id="task_concurrency_example"):
BashOperator(task_id="t1", max_active_tis_per_dag=2, bash_command="echo Hi")
processor_poll_interval
配置已重命名为 scheduler_idle_sleep_time
¶
[scheduler] processor_poll_interval
在 airflow.cfg
中的设置已重命名为 [scheduler] scheduler_idle_sleep_time
,以便更好地理解。
它控制 SchedulerJob
中没有安排任何内容时,调度器循环结束时的“睡眠时间”。
之前:
[scheduler]
processor_poll_interval = 16
现在:
[scheduler]
scheduler_idle_sleep_time = 16
标记成功/失败会自动清除失败的下游任务¶
在图形视图中标记任务成功/失败时,处于 failed/upstream_failed 状态的下游任务将自动清除。
[core] store_dag_code
已被删除¶
虽然 DAG 序列化自 Airflow 2 以来是一个严格的要求,但我们允许用户控制 Webserver 在显示 **代码视图** 时查找的位置。
如果 [core] store_dag_code
设置为 True
,则调度器将 DAG 文件中的代码作为纯字符串存储在 DB 中(在 dag_code
表中),Webserver 只是从同一个表中读取它。如果该值设置为 False
,则 Webserver 从 DAG 文件中读取它。
虽然此设置对于 Airflow < 2 来说是有意义的,但它给一些用户造成了一些困惑,他们认为此设置控制 DAG 序列化。
从 Airflow 2.2 开始,当用户单击 DAG 的 **代码视图** 时,Airflow 只会查找 DB。
清除正在运行的任务将其状态设置为 RESTARTING
¶
以前,清除正在运行的任务会将其状态设置为 SHUTDOWN
。该任务被终止并进入 FAILED
状态。在 #16681 之后,清除正在运行的任务会将其状态设置为 RESTARTING
。该任务有资格重试,而不会进入 FAILED
状态。
删除 TaskInstance.log_filepath
属性¶
此方法长期以来返回不正确的值,因为它没有考虑到不同的记录器配置和任务重试。我们还开始支持更多不使用文件的高级工具,因此不可能在每种情况下都确定正确的文件路径,例如 Stackdriver 不使用文件,而是基于标签识别日志。因此,我们决定删除此属性。
如果您需要读取日志,可以使用 airflow.utils.log.log_reader.TaskLogReader
类,该类没有上述限制。
如果传感器超时,它将不会重试¶
以前,当传感器超时时,会重试它直到 retries
的数量耗尽。因此,传感器的有效超时时间是 timeout * (retries + 1)
。此行为现已更改。如果达到 timeout
,传感器将立即失败,而无需重试。如果希望传感器继续运行更长时间,请设置更大的 timeout
。
可以使用 [core] default_pool_task_slot_count
设置默认任务池槽位¶
默认情况下,任务在 default_pool
中运行。default_pool
使用 128
个槽位初始化,用户可以通过 UI/CLI/API 更改现有部署的槽位数量。
对于新的部署,您可以使用 default_pool_task_slot_count
在 [core]
部分进行设置。此设置对 default_pool
已经存在的现有部署没有任何影响。
以前,这是由 non_pooled_task_slot_count
在 [core]
部分控制的,但没有记录。
TaskInstances 现在*需要* DagRun¶
在正常操作下,数据库中的每个 TaskInstance 行都有 DagRun 行,但可以手动删除 DagRun,Airflow 仍将调度 TaskInstances。
在 Airflow 2.2 中,我们已经更改了这一点,现在有一个数据库级别的外键约束,确保每个 TaskInstance 都有一个 DagRun 行。
在更新到此 2.2 版本之前,如果您有任何“悬空”TaskInstance”行,您必须手动解决任何不一致之处(添加回 DagRun 行,或删除 TaskInstances)。
作为此更改的一部分,clean_tis_without_dagrun_interval
配置选项已在 [scheduler]
部分下删除,并且不起作用。
TaskInstance 和 TaskReschedule 现在定义 run_id
而不是 execution_date
¶
作为 TaskInstance-DagRun 关系更改的一部分,TaskInstance 和 TaskReschedule 上的 execution_date
列已从数据库中删除,并替换为 ORM 级别的 关联代理 字段。如果您直接访问 Airflow 的元数据数据库,您应该重写实现以使用 run_id
列。
请注意,Airflow 在数据库和 ORM 级别的元数据库定义被认为是实现细节,没有严格的向后兼容性保证。
DaskExecutor - Dask Worker 资源和队列¶
如果 Dask worker 没有使用与指定队列相匹配的补充资源启动,现在将导致 AirflowException
,而之前它只会忽略 queue
参数。
从 Web UI 触发的 DAG 运行的逻辑日期现在将其亚秒部分设置为零¶
由于手动 DAG 运行的逻辑日期(execution_date
)的生成方式发生了变化,手动 DAG 运行的逻辑日期可能与其触发时间不匹配,而是将其亚秒部分归零。例如,在 2021-10-11T12:34:56.78901
触发的 DAG 运行的逻辑日期将被设置为 2021-10-11T12:34:56.00000
。
这可能会影响一些依赖此特性的逻辑,用于检测运行是否是手动触发的。请注意,dag_run.run_type
是用于此目的的更权威的值。此外,如果您需要区分自动化触发的运行和手动触发的运行,以便计算“下一次执行日期”,请考虑使用新的数据间隔变量,它们在这两种运行类型之间提供更一致的行为。
新功能¶
AIP-39:向 Airflow 添加(可自定义的)时间表类,以实现更丰富的调度行为 (#15397, #16030, #16352, #17030, #17122, #17414, #17552, #17755, #17989, #18084, #18088, #18244, #18266, #18420, #18434, #18421, #18475, #18499, #18573, #18522, #18729, #18706, #18742, #18786, #18804)
AIP-40:添加可延期的“异步”任务 (#15389, #17564, #17565, #17601, #17745, #17747, #17748, #17875, #17876, #18129, #18210, #18214, #18552, #18728, #18414)
添加 Docker Taskflow 装饰器 (#15330, #18739)
添加 Airflow Standalone 命令 (#15826)
从本地设置在仪表板上显示警报消息 (#18284)
使用 json-schema 的高级参数 (#17100)
能够从 UI 或 API 测试连接 (#15795, #18750)
向 UI 添加下次运行 (#17732)
添加默认权重规则配置选项 (#18627)
添加日历字段以在触发 DAG 时选择 DAG 的执行日期 (#16141)
允许为 BashOperator 设置特定的
cwd
(#17751)在 DAG 视图中显示导入错误 (#17818)
添加执行前/后钩子 [实验性] (#17576)
添加表格以在 Airflow UI 的管理选项卡下查看提供程序 (#15385)
将 secrets 后端/日志记录/身份验证信息添加到 provider yaml (#17625)
将日期格式过滤器添加到 Jinja 环境 (#17451)
引入
RESTARTING
状态 (#16681)Webserver:手动触发时取消暂停 DAG (#16569)
用于创建新用户的 API 端点 (#16609)
添加
insert_args
以支持传输替换 (#15825)向文件系统传感器中的 glob 添加递归标志 (#16894)
将 conn 添加到 jinja 模板上下文 (#16686)
为
TaskGroup
添加default_args
(#16557)允许从 UI 添加重复连接 (#15574)
允许通过 CORS 配置选项指定多个 URL (#17941)
实现用于 DAG 删除的 API 端点 (#17980)
添加 DAG 运行端点以标记 dagrun 成功或失败 (#17839)
为
kinit
选项[-f|-F]
和[-a|-A]
添加支持 (#17816)使用 Dask Worker Resources 为
DaskExecutor
提供队列支持 (#16829, #18720)使自动刷新间隔可配置 (#18107)
改进¶
Airflow UI 的小改进 (#18715, #18795)
将
processor_poll_interval
重命名为scheduler_idle_sleep_time
(#18704)检查日志记录级别的允许值 (#18651)
修复使用
dagrun_conf
触发不存在的 dag 时发生的错误 (#18655)将 muldelete 操作添加到
TaskInstanceModelView
(#18438)避免在清理数据库安装期间导入 DAG (#18450)
需要 DAG 权限才能修改 TaskInstance 和 DagRun (#16634)
使 Kubernetes 作业描述适合一行日志 (#18377)
如果任务实例状态为 null 或未定义,则始终绘制边框 (#18033)
包容性语言 (#18349)
改进了对僵尸任务的日志处理 (#18277)
添加
Variable.update
方法并改进了对变量键冲突的检测 (#18159)在触发 DAG 页面上添加有关参数的说明 (#18166)
将
TaskInstance
和TaskReschedule
PK 从execution_date
更改为run_id
(#17719)在
BaseOperator.chain()
中添加TaskGroup
支持 (#17456)允许在 REST API 中按标签过滤 DAG (#18090)
优化 Provider Manager 的导入 (#18052)
为不兼容的社区提供程序添加警告功能 (#18020)
序列化
template_ext
属性以在 UI 中显示它 (#17985)添加
robots.txt
和X-Robots-Tag
标头 (#17946)重构
BranchDayOfWeekOperator
,DayOfWeekSensor
(#17940)更新错误消息以指导用户进行自助 (#17929)
更新到 Celery 5 (#17397)
添加指向提供程序文档的链接 (#17736)
删除 Marshmallow schema 警告 (#17753)
将
none_failed_or_skipped
重命名为none_failed_min_one_success
触发规则 (#17683)删除
[core] store_dag_code
并使用 DB 获取 Dag 代码 (#16342)将
task_concurrency
重命名为max_active_tis_per_dag
(#17708)在 providers manager 中延迟单独导入 Hooks (#17682)
在外部任务传感器中添加对多个 task-id 的支持 (#17339)
在 airflow tasks run 命令中将
execution_date
替换为run_id
(#16666)使用户 cli 命令的输出更加一致 (#17642)
就地打开相对额外链接 (#17477)
将
worker_log_server_port
选项移动到日志记录部分 (#17621)使用 gunicorn 来提供 worker 生成的日志 (#17591)
改进 Group id 的验证 (#17578)
简化 404 页面 (#17501)
添加 XCom.clear 以便在自定义 XCom 后端中可以挂钩 (#17405)
为
SubDagOperator
添加弃用通知 (#17488)支持 DAGS 文件夹位于调度程序和运行程序上的不同位置 (#16860)
删除 /dagrun/create 并禁用 F.A.B 生成的编辑表单 (#17376)
允许在
template_fields_renderers
中指定字典路径 (#17321)如果 virtualenv 丢失,则提前出错 (#15788)
处理添加到 Extra 和自定义字段的连接参数 (#17269)
修复
airflow celery stop
以接受 pid 文件。 (#17278)删除 DAG 刷新按钮 (#17263)
弃用 dummy 触发规则,支持 always (#17144)
详细说明导入
airflow_local_settings
失败的原因 (#17195)当
BashOperator
失败时,在AirflowException
str 中包含退出代码。 (#17151)为 chain() 添加 EdgeModifier 支持 (#17099)
仅允许在自定义连接中使用支持的字段类型 (#17194)
Secrets 后端故障转移 (#16404)
使用
SQLite
或SequentialExecutor
时,在 Webserver 上发出警告 (#17133)扩展在
pod_override
中定义的init_containers
(#17537)客户端过滤 dag 依赖项 (#16253)
改进 CLI 中的执行程序验证 (#17071)
防止并行运行
airflow db init/upgrade
迁移和设置。 (#17078)更新
chain()
和cross_downstream()
以支持XComArgs
(#16732)改进图形视图刷新 (#16696)
当任务实例因异常而失败时,记录它 (#16805)
为
serve-logs
和LocalExecutor
设置进程标题 (#16644)将
test_cycle
重命名为check_cycle
(#16617)添加 schema 作为
DbApiHook
实例属性 (#16521, #17423)提高与 MSSQL 的兼容性 (#9973)
为不受支持的连接类型添加透明度 (#16220)
调用基于资源 fab 的方法 (#16190)
使用时区格式化更多日期 (#16129)
将已弃用的
dag.sub_dag
替换为dag.partial_subset
(#16179)将
AirflowSensorTimeout
视为立即失败,不进行重试 (#12058)自动标记成功/失败会清除失败的下游任务 (#13037)
为导入 DAG 错误添加关闭/打开指示器 (#16073)
添加可折叠的导入错误 (#16072)
始终在 TI 的
action_clear
视图中返回响应 (#15980)添加通过电子邮件删除用户的 CLI 命令 (#15873)
为 FAB 权限使用资源和操作名称 (#16410)
重命名 DAG 并发 (
[core] dag_concurrency
) 设置,以便更容易理解 (#16267, #18730)日历 UI 改进 (#16226)
重构:
SKIPPED
不应再次记录为SUCCESS
(#14822)移除
dnspython
的版本限制 (#18046, #18162)在 TriggerDagRunOperator 中接受自定义运行 ID (#18788)
错误修复¶
使 REST API patch user 端点的行为与 UI 相同 (#18757)
正确设置已清除任务的
start_date
(#18708)确保在更新其状态 (REST API) 之前存在 task_instance (#18642)
使
AirflowDateTimePickerWidget
成为必填字段 (#18602)重试删除旧渲染任务字段时的死锁事务 (#18616)
修复重试延迟为零时
retry_exponential_backoff
除以零的错误 (#17003)改进 UI 处理日期时间的方式 (#18611, #18700)
Bugfix: dag_bag.get_dag 应该返回 None,而不是引发异常 (#18554)
仅在任务模态是一个有效实例时显示它 (#18570)
修复从模板中访问渲染的
{{ task.x }}
属性 (#18516)添加缺少的电子邮件类型的连接 (#18502)
不要为“同一页面”UI 消息使用闪现消息 (flash). (#18462)
修复任务组工具提示 (#18406)
正确修复 dagrun 更新状态端点 (#18370)
正确处理执行器和调度器之间的 ti 状态差异 (#17819)
修复 KubernetesExecutor 中卡住的“queued”任务 (#18152)
不要永久将 zip DAG 添加到
sys.path
(#18384)修复 MSSQL 数据库中的随机死锁 (#18362)
停用已从文件中删除的 DAG (#17121)
当将 DAG 同步到数据库时,删除现在未使用的
dag_tag
行 (#8231)错误时正常关闭调度程序 (#18092)
修复 mini 调度程序不遵循
wait_for_downstream
依赖关系 (#18338)将异常传递给 Debug Executor 的
run_finished_callback
(#17983)使
XCom.get_one
返回完整值,而不是缩写值 (#18274)在 task_runner 中关闭临时文件时使用 try/except (#18269)
如果 next run 不是 None,则显示它 (#18273)
修复
XCom.set
中的数据库会话处理 (#18240)修复手动运行作业未设置 external_executor_id 的问题 (#17207)
修复序列化 DAG 表中压缩 DAG 的删除 (#18243)
在用户添加时,如果电子邮件重复,则返回明确的错误 (#18224)
即使上次运行数据为空也移除加载点 (#18230)
交换 DAG 导入错误下拉菜单图标 (#18207)
迁移配置时自动创建 section (#16814)
默认情况下,在读取任务日志时将编码设置为 utf-8 (#17965)
将父 DAG 权限应用于子 DAG (#18160)
将 MySQL 的 id 排序规则更改为区分大小写 (#18072)
在
StandardTaskRunner
中记录任务启动异常 (#17967)将权限应用于
self._error_file
(#15947)修复空白 DAG 依赖关系视图 (#17990)
为 DAG 依赖关系和配置页面添加缺失的菜单访问权限 (#17450)
修复在
DateTimeSensor
中传递 Jinja 模板的问题 (#17959)修复了限制 ImportError 可见性的错误 (#17924)
修复
traceback.html
中的语法 (#17942)修复
MySQLdb
驱动程序的DagRunState
枚举查询 (#17886)修复了“操作”组中的按钮大小。 (#17902)
仅显示用户可以访问的 DAG 的导入错误 (#17835)
显示来自 zip 文件的所有 import_errors (#17759)
修复 EXTRA_LOGGER_NAMES 参数和相关文档 (#17808)
为 Airflow 和 gunicorn 使用一个解释器 (#17805)
修复: Mysql 5.7 id utf8mb3 (#14535)
修复 dag_processing.last_duration 指标随机漏洞 (#17769)
自动为 MySQL 使用
utf8mb3_general_ci
排序规则 (#17729)修复:
TaskInstance
的过滤条件不起作用 #17535 (#17548)不要在 CeleryExecutor.trigger_tasks 中使用 TaskInstance (#16248)
移除 MSSQL 中升级的锁 (#17213)
通过 python 调用创建 virtualenv (#17156)
确保运行
DAG.cli()
时 DAG 是非循环的 (#17105)翻译非 ASCII 字符 (#17057)
更改
model_list
模板中None
比较的逻辑 (#16893)使 UI 和 POST /task_instances_state API 端点具有相同的行为 (#16539)
确保如果缺少 SLA 则跳过任务 (#16719)
修复直接使用
cached_property
模块的问题 (#16710)修复 TI 成功确认页面 (#16650)
修改 python virtualenv jinja 模板中的返回值检查 (#16049)
修复 DAG 依赖关系搜索 (#15924)
使自定义 JSON 编码器支持
Decimal
(#16383)Bugfix: 允许仅使用
dag_id
和空的subdir
清除任务 (#16513)在调用测试连接之前将端口值转换为数字 (#16497)
处理缺失/空的序列化 DAG 依赖关系 (#16393)
在使用
@dag
装饰器时正确设置dag.fileloc
(#16384)修复 TI 成功/失败链接 (#16233)
正确实现
airflow/www/views.py
中的自动完成提前返回 (#15940)反向移植修复以允许将 Logger 序列化到 Python 3.6 (#18798)
修复了当有任务运行到
reschedule
状态时,Backfill 作业无法运行的错误 (#17305, #18806)
仅限文档更改¶
更新
dagbag_size
文档 (#18824)更新关于 bundle extras 的文档 (#18828)
修复错误的 Postgres
search_path
设置说明 (#17600)从 Docker 镜像中移除
AIRFLOW_GID
(#18747)改进 BranchPythonOperator 在没有要跟随的 task_id 时的错误消息 (#18471)
改进对用户的指导,告诉他们在导入超时时该怎么做 (#18478)
更好地解释调度程序的微调 (#18356)
为 airflow pools 导入添加了示例 JSON (#18376)
向文档添加
sla_miss_callback
部分 (#18305)解释子进程钩子的 Sentry 默认环境变量 (#18346)
重构安装页面 (#18282)
改进了快速入门 docker-compose 警告和文档 (#18164)
对 MSSQL 的生产级别支持 (#18382)
更新文档中无法正常工作的示例 (#18067)
删除 default_args 模式 + 为核心 Airflow 示例 DAG 添加了 get_current_context() 用法 (#16866)
更新 max_tis_per_query 以便在网页上更好地呈现 (#17971)
添加了带有基于团队的授权的 Github Oauth 示例 (#17896)
更新 docker.rst (#17882)
示例 xcom 更新 (#17749)
添加关于通过环境变量添加连接的文档警告 (#17915)
修复了 upgrade-check.rst 附近的错误文档 (#17903)
将 Brent 添加到提交者列表 (#17873)
改进了关于模块管理的文档 (#17757)
从 metrics.rst 中删除已弃用的指标 (#17772)
确保很好地解释 docker-compose 的“生产就绪性” (#17731)
文档: 使用 Airflow 1.10.x EOL 日期更新升级到 v2 的文档 (#17710)
文档: 从文档字符串中替换已弃用的参数 (#17709)
更仔细地描述 DAG 所有者 (#17699)
更新说明以避免误解 (#17701)
文档: 使
DAG.is_active
在 API 中为只读 (#17667)更新关于 Python 3.9 支持的文档 (#17611)
修复 MySQL 数据库字符集指令 (#17603)
记录覆盖
XCom.clear
以进行数据生命周期管理 (#17589)文档中 airflow core 的路径更正 (#17567)
文档(celery): 重新措辞,添加实际的多个队列示例 (#17541)
文档: 添加 FAQ 以加速解析大量 DAG 文件 (#17519)
改进新用户的镜像构建文档 (#17409)
文档: 从 MariaDB JIRA URL 中删除不必要的参数 (#17296)
更新关于 MariaDB 和多个调度程序的警告 (#17287)
文档: 建议在所有 Airflow 组件上使用相同的配置 (#17146)
将关于 masking 的文档移动到新页面 (#17007)
建议在最佳实践文档中使用环境变量而不是 Airflow 变量 (#16926)
文档: 更好地描述
pod_template_file
(#16861)添加 Aneesh Joseph 作为 Airflow 提交者 (#16835)
文档: 为教程文档添加了新的管道示例 (#16548)
从文档中删除 upstart (#16672)
添加新的提交者:
Jed
和TP
(#16671)文档: 在升级文档中修复
flask-ouathlib
为flask-oauthlib
(#16320)文档: 修复创建连接文档 (#16312)
文档:修复
Elasticsearch
的 URL (#16275)对 README.md 文件的小改进 (#16244)
修复
dag_concurrency
的文档 (#16177)检查代码片段的语法正确性 (#16005)
在文档中添加 wheel 包的正确链接 (#15999)
为
default_pool
插槽添加文档 (#15997)在快速入门文档中添加内存使用警告 (#15967)
更新示例
KubernetesExecutor
git-sync
pod 模板文件 (#15904)文档:修复 Taskflow API 文档 (#16574)
为教程文档添加新的 pipeline 示例 (#16084)
更新 DAG 文档字符串以包含
render_template_as_native_obj
(#16534)更新关于设置 SMTP 的文档 (#16523)
文档:修复 API 动词,从
POST
改为PATCH
(#16511)
其他/内部¶
重命名变量以与代码逻辑保持一致 (#18685)
简化之前跨行分割的字符串 (#18679)
修复
BranchPythonOperator
的异常字符串 (#18623)创建用户时添加多个角色 (#18617)
将 FABs 基本安全管理器移动到 Airflow 中 (#16647)
删除不必要的 CSS 状态颜色 (#18461)
将
boto3
更新到<1.19
(#18389)提高
airflow.security.kerberos module
的覆盖率 (#18258)修复 Amazon Kinesis 测试 (#18337)
修复 provider 测试访问
importlib-resources
的问题 (#18228)在使用 SubDagOperator 时,在测试中消除警告 (#18275)
修复
range(len())
到enumerate
的使用 (#18174)自动完成视图的测试覆盖率 (#15943)
将 “packaging” 添加到核心需求 (#18122)
将 LoggingMixins 添加到 BaseTrigger (#18106)
修复在
main
构建中构建文档的问题 (#18035)删除
tenacity
的上限 (#17593)删除冗余的
numpy
依赖 (#17594)将
mysql-connector-python
升级到最新版本 (#17596)使
pandas
成为可选的核心依赖 (#17575)为 airflow.utils.helpers 添加更多类型提示 (#15582)
改进:清理
airflow/utils/db.py
中的一些代码 (#17090)重构:从 DAG 处理中删除 processor_factory (#16659)
从 DAG 处理中删除 AbstractDagFileProcessorProcess (#16816)
更新 TaskGroup 类型提示 (#16811)
将
click
更新到 8.x (#16779)删除剩余的 Pylint 禁用项 (#16760)
删除重复的 try,create_session 中已经存在 try (#16701)
从我们的工具链中移除 pylint (#16682)
重构不必要的函数调用 (#16653)
向 setup.py 添加类型注解 (#16658)
删除 SQLAlchemy <1.4 约束 (#16630) (注意:我们的依赖项仍然要求 <1.4)
重构
dag.clear
方法 (#16086)使用
DAG_ACTIONS
常量 (#16232)使用更新后的
_get_all_non_dag_permissions
方法 (#16317)为内置 FAB 方法添加更新名称的包装器 (#16077)
删除
TaskInstance.log_filepath
属性 (#15217)删除
airflow/www/app.py
中不必要的函数调用 (#15956)将
plyvel
移动到 google provider extra (#15812)更新权限迁移以使用新的命名方案 (#16400)
对 FAB 使用资源和操作名称 (#16380)
将对
find_permission_view_menu
的调用替换为get_permission
包装器 (#16377)修复
fab_logging_level
的弃用默认值,设为WARNING
(#18783)在使用
CeleryKubernetesExecutor
时,允许从 UI 运行任务 (#18441)
Airflow 2.1.4 (2021-09-18)¶
重大变更¶
没有重大更改。
Bug 修复¶
修复弃用错误消息,而不是使其静默 (#18126)
限制 Scheduler 创建的排队 dagrun 的数量 (#18065)
修复从排队到运行的
DagRun
执行顺序未正确遵循的问题 (#18061)修复
max_active_runs
不允许将排队的 dagrun 移动到运行的问题 (#17945)避免没有权限的用户的重定向循环 (#17838)
避免用户没有角色时的无限重定向循环 (#17613)
修复 graph TI 模态框上的日志链接 (#17862)
如果用户缺少权限,则隐藏变量导入表单 (#18000)
改进 dag/task 并发检查 (#17786)
修复 Clear task instances 端点重置所有 DAG 运行的 bug (#17961)
修复传递给视图的不正确参数 (#18083) (#18085)
修复来自
LocalTaskJob
的 Sentry 处理程序导致错误的问题 (#18119)限制
colorlog
版本 (6.x 不兼容) (#18099)仅在悬停时显示暂停/取消暂停工具提示 (#17957)
改进打开组的 DAG 的图形视图加载时间 (#17821)
增加 Run 列的宽度 (#17817)
修复运行 tis 上的错误查询 (#17631)
将根添加到树刷新 URL (#17633)
不要从 UI 中删除正在运行的 DAG (#17630)
提高 Provider 包功能的发现性
不要让
create_dagrun
覆盖显式run_id
(#17728)pid 重置的回归,允许在心跳信号后启动任务 (#17333)
当 pod 在运行时被删除时,将任务状态设置为失败 (#18095)
建议内核不要缓存 Airflow 生成的日志文件 (#18054)
在
_check_for_stalled_adopted_tasks
方法中对采用的任务进行排序 (#18208)
仅文档更改¶
更新 airflow/config_templates/config.yml 中的 version added 字段 (#18128)
改进关于如何处理动态任务生成的描述 (#17963)
改进到运算符和钩子引用的交叉链接 (#17622)
文档:修复 Docker 堆栈替换 Airflow 版本的问题 (#17711)
使 providers 运算符/钩子引用更易于使用 (#17768)
更新关于新的
connection-types
provider 元数据的描述建议在变量包含敏感数据时使用 secrets 后端 (#17319)
分离从源代码安装部分并添加更多详细信息 (#18171)
文档:使用
closer.lua
脚本下载源代码 (#18179)文档:改进从源代码安装 (#18194)
改进了所有组件的从源代码安装页面 (#18251)
Airflow 2.1.3 (2021-08-23)¶
重大变更¶
没有重大更改。
Bug 修复¶
修复任务重试,当它们收到
sigkill
并有重试时,并正确处理sigterm
(#16301)修复在上下文异常中编辑秘密 (#17618)
修复 dagrun 回调的竞争条件 (#16741)
将 ‘queued’ 添加到 DagRunState (#16854)
将 ‘queued’ 状态添加到 DagRun (#16401)
修复外部 Elasticsearch 日志链接 (#16357)
当记录的 PID 与当前 PID 不同时,添加正确的警告消息 (#17411)
修复使用
default_impersonation
配置运行任务的问题 (#17229)如果 DagRun 的 DAG 已从数据库中删除,则进行救援 (#17544)
修复损坏的 json_client (#17529)
处理并记录任务回调期间引发的异常 (#17347)
修复 CLI
kubernetes cleanup-pods
,它在无效的标签键上失败 (#17298)在 DAG 解析日志中显示序列化异常 (#17277)
修复:
TaskInstance
不显示queued_by_job_id
&external_executor_id
(#17179)当未配置
SecretsMasker
时,添加更多解释性消息 (#17101)允许在
BaseOperator
的子类中使用__init_subclass__
(#17027)修复 XCom 视图中的任务实例检索 (#16923)
在解析期间验证
priority_weight
的类型 (#16765)在 DAG 序列化期间正确处理自定义
deps
和task_group
(#16734)修复 Celery worker 采用的缓慢(已清除)任务 (#16718)
修复树视图中计算持续时间的问题 (#16695)
修复
AttributeError
:datetime.timezone
对象没有属性name
(#16599)在 Webserver 日志中编辑连接密钥 (#16579)
将图表焦点更改为视图顶部而不是中心 (#16484)
当执行器报告任务失败时,调度器中标记任务为失败 (#15929)
修复(smart_sensor): 未绑定的变量错误 (#14774)
将缺少的权限添加回
UserModelView
控件 (#17431)更好的 docker-compose 诊断和自我修复 (#17484)
改进当用户错误配置
secret_key
时的诊断信息 (#17410)停止在
task_instance.refresh_from_db
中检查execution_date
(#16809)
改进¶
在任务退出期间,在
LocalTaskJob
中运行迷你调度器 (#16289)删除
SQLAlchemy<1.4
约束 (#16630)将 Jinja2 上限从 2.12.0 提升到 4.0.0 (#16595)
提升
dnspython
(#16698)更新到
FlaskAppBuilder
3.3.2+ (#17208)为任务和 DAG 添加状态类型 (#15285)
当使用
LocalExecutor
时,设置 Worker 的进程标题 (#16623)将
DagFileProcessor
和DagFileProcessorProcess
移出scheduler_job.py
(#16581)
仅文档更改¶
修复配置文档中的不一致性 (#17317)
修复使用 SQLite 作为元数据 DB 的文档链接 (#17308)
其他¶
在 requests 移除 LGPL 依赖项后,切换回 http 提供程序 (#16974)
Airflow 2.1.2 (2021-07-14)¶
重大变更¶
没有重大更改。
Bug 修复¶
仅允许 Webserver 从 Worker 日志服务器请求 (#16754)
修复 “无效的 JSON 配置,必须是字典” 错误 (#16648)
修复
CeleryKubernetesExecutor
(#16700)如果键是
token
则掩码值 (#16474)修复
LocalTaskJob
的模拟问题 (#16852)解决所有 npm 漏洞,包括将
jQuery
提升到3.5
(#16440)
其他¶
添加 Python 3.9 支持 (#15515)
Airflow 2.1.1 (2021-07-02)¶
重大变更¶
函数 clear_task_instances
的参数 activate_dag_runs
被替换为 dag_run_state
¶
要实现 clear_task_instances
的先前默认行为 (使用 activate_dag_runs=True
),无需进行任何更改。要实现先前的 activate_dag_runs=False
行为,请传递 dag_run_state=False
代替。(之前的参数仍然被接受,但已被弃用)
dag.set_dag_runs_state
已弃用¶
在 PR: #15382 中的 bug 修复之后,不再需要 set_dag_runs_state
方法。此方法现已弃用,将在未来的版本中删除。
Bug 修复¶
不要尝试掩码具有非字符串键的字典中的机密信息时崩溃 (#16601)
始终从
PyPI
安装 sphinx_airflow_theme (#16594)删除 elasticsearch 库的限制 (#16553)
为 PROD 镜像的构建和运行时添加额外的要求 (#16170)
2021 年 5 月底发布的 Cattrs 1.7.0 打破了 lineage 的使用 (#16173)
从 setup_requires 中删除不必要的软件包 (#16139)
将 docutils 固定到 <0.17,直到修复破坏性行为 (#16133)
Docker 镜像文档的改进 (#14843)
确保
dag_run.conf
是一个字典 (#15057)修复 CLI 连接导入并将逻辑从 secrets 迁移到 Connection 模型 (#15425)
修复 Dag 详情的开始日期错误 (#16206)
修复 DAG 暂停时 DAG 运行状态未更新的问题 (#16343)
允许 task_instance 模式 (REST API) 中 operator 字段的空值 (#16516)
避免在编辑日志时递归过深 (#16491)
回填:如果没有任务与任务正则表达式匹配,则不创建 DagRun (#16461)
用于较大 DAG 的树状视图 UI 和树状视图中更一致的间距 (#16522)
正确处理 Query.scalar() 的 None 返回值 (#16345)
将
only_active
参数添加到 /dags 端点 (#14306)如果序列化的 DAG 在 DB 中被删除,则不显示过期的序列化 DAG (#16368)
使 REST API List DAGs 端点与 UI/CLI 行为一致 (#16318)
支持在 elasticsearch 中使用
filebeat 7
进行远程日志记录 (#14625)首先对具有更高优先级和更早 execution_date 的任务进行排队 (#15210)
使图例上的任务 ID 具有足够的宽度,并使折线图的宽度为 100%。(#15915)
修复 normalize-url 漏洞 (#16375)
验证初始化时的 retries 值以获得更好的错误 (#16415)
为树刷新添加 num_runs 查询参数 (#16437)
修复配置参考文档中的模板化默认/示例值 (#16442)
将
passphrase
和private_key
添加到默认敏感字段名称 (#16392)修复了无限插槽池中的任务永远不会被调度的问题 (#15247)
修复在 CeleryExecutor 中卡住为运行状态的孤立任务 (#16550)
如果无法编辑某些内容,请不要记录失败日志 (#16118)
将最大树宽度设置为 1200 像素 (#16067)
在没有
--local
/--raw
的情况下,为 KubeExecutor 填充airflow task run
的 “job_id” 字段 (#16108)修复了在初始化之前使用 conf 变量的问题 (#16088)
修复任务装饰器的应用默认值 (#16085)
即使刚刚解析,也要解析最近修改的文件 (#16075)
确保我们不会尝试在日志中屏蔽空字符串 (#16057)
当没有异常时,不要在屏蔽
log.exception
时崩溃 (#16047)恢复 base_sensor_operator 中的 apply_defaults 导入 (#16040)
修复当 webserver UI 不在
/
时,树状视图中的自动刷新 (#16018)修复 dag.clear() 以在必要时将多个 dags 设置为运行状态 (#15382)
修复由于 multiprocessing 中的 reset_signals 导致 Celery 执行器随机卡住的问题 (#15989)
Airflow 2.1.0 (2021-05-21)¶
重大变更¶
新的 “deprecated_api” extra¶
我们有一个新的 '[deprecated_api]' extra,当安装 airflow 且将要使用已弃用的 API 时,应该使用它。现在它是 Airflow 的一个可选功能,因为它引入了 requests
,后者 (截至 2021 年 5 月 14 日) 引入了 LGPL chardet
依赖项。
http
提供程序默认不安装¶
在 chardet
成为 requests
的可选依赖项之前,http
提供程序现在是可选的,并且默认不安装。请参阅 用 charset-normalizer 替换 chardet 的 PR
@apply_default
装饰器不再必要¶
现在,此装饰器通过 BaseOperator 上的元类自动添加到所有运算符
更改字段屏蔽的配置选项¶
我们改进了 Web UI 和日志中敏感数据的屏蔽。作为其中的一部分,以下配置已更改
admin
部分中的hide_sensitive_variable_fields
选项已被core
部分中的hide_sensitive_var_conn_fields
部分替换,在
admin
部分的sensitive_variable_fields
选项已被core
部分的sensitive_var_conn_names
部分替代。
已弃用 airflow.kubernetes.pod_generator 中的 PodDefaults 和 add_xcom_sidecar¶
我们已将 PodDefaults 从 airflow.kubernetes.pod_generator.PodDefaults
移动到 airflow.providers.cncf.kubernetes.utils.xcom_sidecar.PodDefaults
,并将 add_xcom_sidecar 从 airflow.kubernetes.pod_generator.PodGenerator.add_xcom_sidecar
移动到 airflow.providers.cncf.kubernetes.utils.xcom_sidecar.add_xcom_sidecar
。此更改将允许我们修改 KubernetesPodOperator 的 XCom 功能,而无需升级 Airflow。
从核心 Airflow 中移除 pod_launcher¶
已将 pod launcher 从 airflow.kubernetes.pod_launcher
移动到 airflow.providers.cncf.kubernetes.utils.pod_launcher
这将允许用户更新 KubernetesPodOperator 的 pod_launcher,而无需升级 Airflow
默认的 [webserver] worker_refresh_interval
已更改为 6000
秒¶
对于 Airflow <=2.0.1,[webserver] worker_refresh_interval
的默认值为 30
秒。但是,由于 Airflow 2.0 DAG 序列化是一项硬性要求,并且 Webserver 使用了序列化的 DAG,因此无需像 30
秒那样频繁地终止现有 worker 并创建一个新的 worker。
此设置可以提高到更高的值,目前设置为 6000
秒(100 分钟)以用作 DagBag 缓存突发时间。
default_queue
配置已移动到 operators
部分。¶
default_queue
配置选项已从 [celery]
部分移动到 [operators]
部分,以便在不同的 executor 之间重复使用。
新特性¶
将
PythonVirtualenvDecorator
添加到 Taskflow API (#14761)添加
Taskgroup
装饰器 (#15034)创建一个 DAG 日历视图 (#15423)
创建跨 DAG 依赖关系视图 (#13199)
添加 REST API 以查询 providers (#13394)
在任务日志和 UI 中屏蔽密码和敏感信息 (#15599)
添加
SubprocessHook
以从 operators 运行命令 (#13423)在 UI 页面“DAG Details”中添加 DAG 超时 (#14165)
添加
WeekDayBranchOperator
(#13997)将 JSON linter 添加到 DAG Trigger UI (#13551)
将 DAG 描述文档添加到 Trigger UI 页面 (#13365)
将 Airflow Webserver URL 添加到 SLA miss 电子邮件。(#13249)
为用户添加只读 REST API 端点 (#14735)
添加生成 Airflow 的 Python SDK 的文件 (#14739)
将动态字段添加到 snowflake 连接 (#14724)
为角色和权限添加只读 REST API 端点 (#14664)
添加新的 datetime branch operator (#11964)
添加 Google leveldb hook 和 operator (#13109) (#14105)
将 plugins 端点添加到 REST API (#14280)
添加
worker_pod_pending_timeout
支持 (#15263)添加标记 DAG edges 的支持 (#15142)
为 Roles 添加 CUD REST API 端点 (#14840)
从文件导入连接 (#15177)
一堆
template_fields_renderers
添加 (#15130)将 REST API 查询排序和顺序添加到某些端点 (#14895)
在新 UI 中添加时区上下文 (#15096)
将查询 mutations 添加到新 UI (#15068)
添加不同的模式来排序 dag 文件以进行解析 (#15046)
在 Tree View 上自动刷新 (#15474)
BashOperator 在退出代码 99 时引发
AirflowSkipException
(默认情况下,可配置)(#13421) (#14963)通过 REST API 中的任务 ID 清除任务 (#14500)
支持 jinja2 原生 Python 类型 (#14603)
允许没有 gossip 或 mingle 模式的 celery workers (#13880)
添加
airflow jobs check
CLI 命令以检查 jobs 的健康状况(Scheduler 等)(#14519)将
DateTimeBranchOperator
重命名为BranchDateTimeOperator
(#14720)
改进¶
将可选的结果处理程序回调添加到
DbApiHook
(#15581)将 Flask App Builder 限制更新到最近发布的 3.3 (#15792)
防止在 REST API 请求上创建 flask 会话 (#15295)
在解析时同步 DAG 特定权限 (#15311)
将任务上 pool 名称的最大长度增加到 256 个字符 (#15203)
在使用 mysql 时强制执行 READ COMMITTED 隔离 (#15714)
自动将
apply_default
应用于BaseOperator
的子类 (#15667)在重复的 DAG ID 上发出错误 (#15302)
更新
KubernetesExecutor
pod 模板以允许访问 IAM 权限 (#15669)运行
airflow db check-migrations
时更详细的日志 (#15662)当 one_success 没有成功时将任务标记为失败 (#15467)
添加一个选项来触发 dag 而不更改 conf (#15591)
添加 Airflow UI instance_name 配置选项 (#10162)
添加一个装饰器以使用 DB 事务重试函数 (#14109)
将返回添加到 PythonVirtualenvOperator 的 execute 方法 (#14061)
为 kubernetes 添加 verify_ssl 配置 (#13516)
添加有关 Webserver > 1 时
secret_key
的描述 (#15546)在
JSONFormatter
中添加 LogRecord 中的 Traceback (#15414)添加对 conn uri 格式中任意 json 的支持 (#15100)
在 variable 中添加 description 字段 (#12413) (#15194)
添加日志以显示 SFTP、FTP 和 Filesystem sensor 中最后修改的时间 (#15134)
当收到 SIGTERM 时执行
on_failure_callback
(#15172)允许在突出显示状态时隐藏所有 edges (#15281)
如果 UID 没有实际用户名,则显示显式错误 (#15212)
在使用 Local 或 Sequential Executor 时,使用 Scheduler 提供日志 (#15557)
停用 dag 详细信息视图上的触发、刷新和删除控件。(#14144)
关闭连接表单的自动完成功能 (#15073)
将默认
worker_refresh_interval
增加到6000
秒 (#14970)仅在 User 的本地时区不是 UTC 时显示 (#13904)
抑制一些任务 CLI 的 LOG/WARNING 以获得更好的 CLI 体验 (#14567)
可配置的 API 响应 (CORS) 标头 (#13620)
允许查看者查看所有 docs 链接 (#14197)
更新 Tree View 日期刻度 (#14141)
使暂停/取消暂停 DAG 的工具提示更清晰 (#13642)
在获取变量时警告有关 env var 的优先级 (#13501)
将
[celery] default_queue
配置移动到[operators] default_queue
以在 executors 之间重用 (#14699)
Bug 修复¶
修复当未传递
dry_run
时来自updateTaskInstancesState
API 端点的 500 错误 (#15889)确保 PythonVirtualenvOperator 之前的任务不会失败 (#15822)
防止混合大小写的 env vars 导致 worker 等进程崩溃 (#14380)
修复了 DAG 装饰器中的类型注释 (#15778)
修复任务收到 SIGKILL 时的 on_failure_callback (#15537)
修复 dags 表格溢出 (#15660)
修复在 subdag 清除时更改父 dag 状态 (#15562)
修复从 zip 包读取以默认为文本 (#13962)
修复 dags.html 中
drawDagStatsForDag
的错误参数 (#13884)修复 QueuedLocalWorker 因 EOFError 崩溃 (#13215)
修复
NotPreviouslySkippedDep
中的拼写错误 (#13933)修复 KubeExecutor pod 采用后的并行性 (#15555)
修复启用 keepalive 的 mac 上的 kube 客户端 (#15551)
修复 python>3.7 的 dask 的错误限制(应为 <3.7)(#15545)
修复
KubernetesExecutor
中的任务采用 (#14795)修复将 XCom 与
KubernetesPodOperator
一起使用时的超时 (#15388)修复 “extras” 中已弃用的 provider 别名无法工作的问题 (#15465)
修复了默认的 XCom 反序列化。(#14827)
进一步修复修剪后的
pod_id
用于KubernetesPodOperator
(#15445)修复
dag.partial_subset
中的 used_group_ids (#13700) (#15308)Bugfix:当修剪后的
pod_id
在KubernetesPodOperator
中以连字符结尾时,名称无效 (#15443)修复 TI
pool_slots > 1
时不正确的插槽统计信息 (#15426)修复 DAG 上次运行链接 (#15327)
修复当 update_fab_perms = False 时
sync-perm
无法正确工作的问题 (#14847)修复了 Plexus 测试对 Arrow 的限制 (#14781)
修复树视图中的 UI bug (#14566)
修复 AzureDataFactoryHook 无法实例化其连接的问题 (#14565)
修复非 POSIX 文件系统上的权限错误 (#13121)
修复 “ignorable” 中的拼写 (#14348)
修复 get_context_data doctest 导入 (#14288)
更正
GCSObjectsWtihPrefixExistenceSensor
中的拼写错误 (#14179)修复失败依赖项的顺序 (#14036)
修复关键的
CeleryKubernetesExecutor
bug (#13247)修复
StackdriverTaskHandler
中的四个 bug (#13784)func.sum
可能会返回Decimal
,从而破坏 REST API (#15585)在分页中保留标签参数 (#15411)
API:当
execution_date
相同时,引发AlreadyExists
异常 (#15174)删除
DagFileProcessorManager
中对sync_metadata
的重复调用 (#15121)额外的
docker-py
更新以解决 docker op 问题 (#15731)确保调用 executors end 方法 (#14085)
从 API schema 中删除
user_id
(#15117)防止禁用分页时可点击的错误链接 (#15074)
在迁移期间获取数据库上的锁 (#10151)
仅在 SLA 为 None 时跳过 SLA 检查 (#14064)
在 airflow info 命令中打印正确的版本 (#14560)
使
airflow info
可以与管道一起使用 (#14528)重做连接表单的客户端脚本 (#14052)
API: 在所有具有
total_entries
的集合中添加CollectionInfo
(#14366)修复导入 airflow.models.dagrun 时的
task_instance_mutation_hook
(#15851)
仅文档更改¶
修复 SqlSensor 的文档字符串 (#15466)
“DAG 和任务文档”上的小改动 (#14853)
添加关于配置选项更改的说明 (#15696)
将文档添加到
markdownlint
和yamllint
配置文件 (#15682)在文档中将旧的“Experimental” API 重命名为 deprecated。 (#15653)
修复
git_sync_template.yaml
中的文档错误 (#13197)修复文档链接权限名称 (#14972)
修复 Helm chart 文档的链接 (#14652)
修复 Kubernetes 代码的文档字符串 (#14605)
文档:大写和小的修复 (#14283) (#14534)
修复了从 zip 包读取内容时默认为文本的问题 (#13984)
对“Concepts”文档的初步修改 (#15444)
改进各种模块的文档字符串 (#15047)
添加关于数据库连接 URI 的文档 (#14124)
将 Helm Chart 徽标添加到文档索引 (#14762)
为 Helm Chart 创建新的文档包 (#14643)
添加关于支持的日志记录级别的文档 (#14507)
更新关于 tableau 和 salesforce 提供程序的文档 (#14495)
将已弃用的文档链接替换为正确的链接 (#14429)
重构冗余文档 url 逻辑以使用实用程序 (#14080)
文档:注意:将 2016-2019 更新为 2016-now (#14248)
如果可能,在解析期间跳过 DAG perm 同步 (#15464)
为 Edge Labels 添加图片和示例 (#15310)
为 sqlite 添加示例 DAG 和操作指南 (#13196)
为已弃用的模块添加指向新模块的链接 (#15316)
在 Updating.md 中添加关于 FAB 数据模型更改的说明 (#14478)
杂项/内部¶
修复
logging.exception
冗余 (#14823)升级
stylelint
以删除易受攻击的子依赖项 (#15784)添加解决方法以强制依赖项使用 lodash 的修补版本 (#15777)
将 croniter 更新到 1.0.x 系列 (#15769)
在 Breeze 中移除 Airflow 1.10 (#15712)
并行运行 helm chart 测试 (#15706)
将
ssri
从 6.0.1 升级到 /airflow/www 中的 6.0.2 (#15437)移除 Gunicorn 依赖项的限制 (#15611)
为任务提供更好的“依赖已注册”警告消息 #14613 (#14860)
将 pandas-gbq 固定到 <0.15.0 (#15114)
使用 Pip 21.* 正式安装 airflow (#15513)
升级 mysqlclient 以支持 1.4.x 和 2.x 系列 (#14978)
完成 DAG 资源名称助手的重构 (#15511)
重构/清理图表任务和路径高亮的呈现 (#15257)
标准化默认 fab 权限 (#14946)
从任务实例详细信息视图中删除
datepicker
(#15284)将提供程序的导入警告转换为调试日志 (#14903)
从 provider_info 模式中删除 required 中的剩余字段。 (#14119)
弃用
tableau
extra (#13595)在 Python 3.8 上尽可能使用内置的
cached_property
(#14606)清理 UI 模板中的 JS 代码 (#14019)
将 /airflow/www 中的 elliptic 从 6.5.3 升级到 6.5.4 (#14668)
使用
flynt
切换到 f-strings。 (#13732)使用
jquery
ready 而不是 vanilla js (#15258)迁移任务实例日志 (ti_log) js (#15309)
迁移 graph js (#15307)
迁移 dags.html javascript (#14692)
删除不必要的 AzureContainerInstance 连接类型 (#15514)
将 Kubernetes pod_launcher 从核心 airflow 中分离出来 (#15165)
更新运算符的剩余旧导入路径 (#15127)
删除损坏且未记录的“演示模式”功能 (#14601)
简化
Webpack
条目的配置/易读性 (#14551)移除内联树 js (#14552)
Js linting 和简单脚本的内联迁移 (#14215)
删除 AirflowConfigParser 中重复使用的常量 (#14023)
弃用来自环境变量的电子邮件凭据。 (#13601)
删除 task_instance.py 中未使用的“context”变量 (#14049)
在调试时禁用 cli 中的 suppress_logs_and_warning (#13180)
Airflow 2.0.2 (2021-04-19)¶
重大变化¶
默认的 [kubernetes] enable_tcp_keepalive
已更改为 True
¶
这允许 Airflow 默认情况下在某些环境(如 Azure)中更可靠地工作。
sync-perm
CLI 默认不再同步 DAG 特定权限¶
默认情况下,sync-perm
CLI 命令将不再同步 DAG 特定权限,因为它们现在在 DAG 解析期间处理。 如果您需要或想要旧的行为,您可以传递 --include-dags
以使 sync-perm
也同步 DAG 特定权限。
Bug 修复¶
Bugfix: 序列化和排序 DAG 的可迭代属性时出现
TypeError
(#15395)修复基于文件夹的插件缺少
on_load
触发器 (#15208)kubernetes cleanup-pods
子命令只会清理 Airflow 创建的 Pod (#15204)修复 CLI action_logging 中的密码屏蔽 (#15143)
修复 TriggerDagRunOperatorLink 的 url 生成 (#14990)
恢复基本 lineage 后端 (#14146)
无法使用 Kubernetes executor 触发回填或手动作业 (#14160)
Bugfix: 任务文档未显示在任务实例详细信息视图中 (#15191)
Bugfix: 修复 KubernetesExecutor 中覆盖
pod_template_file
(#15197)Bugfix:
executor_config
中的资源破坏了 UI 中的图表视图 (#15199)修复 celery executor 尝试在 map 上调用 len 的 bug (#14883)
修复 airflow.stats timing 中破坏 dogstatsd 模式的 bug (#15132)
通过使用非阻塞 IO 来避免调度程序/解析器管理器死锁 (#15112)
重新引入
dagrun.schedule_delay
指标 (#15105)比较字符串值,而不是字符串在 Kube executor 中是否是同一对象 (#14942)
像 airflow 1.10 中一样,将 queue 传递给 BaseExecutor.execute_async (#14861)
调度程序:从关键路径中删除饥饿池中的 TI。 (#14476)
从 airflow.contrib 模块中删除额外的/不必要的弃用警告 (#15065)
修复 KubernetesExecutor 中对长 dag_id 和 task_id 的支持 (#14703)
在序列化 DAG 中对列表、集合和元组进行排序 (#14909)
简化传递给 origin param 的字符串的清理 (#14738) (#14905)
修复启用 Sentry 集成时运行任务时出错的问题 (#13929)
Webserver:清理传递给 origin param 的字符串 (#14738)
修复树中丢失的持续时间 < 1 秒的问题 (#13537)
由于 sqlalchemy-utils 损坏,将 SQLAlchemy 固定到 <1.4 (#14812)
修复 KubernetesExecutor 中已删除的挂起 pod 的问题 (#14810)
当后端模型不存在时,默认为 Celery Task 模型 (#14612)
Bugfix: Plugins 端点未经过身份验证 (#14570)
BugFix: 修复 DAG 文档显示(特别是对于 TaskFlow DAG)(#14564)
BugFix: airflow.kubernetes.pod_launcher 的 monitor_pod 中出现 TypeError (#14513)
Bugfix: 修复 dag 详细信息 API 端点中标签和所有者的错误输出 (#14490)
修复启用 JSON 日志记录时任务错误导致的日志记录错误 (#14456)
修复使用守护程序模式时 StatsD 指标未发送的问题 (#14454)
优雅地处理 DagRun 缺少 start_date 和 end_date 的情况 (#14452)
BugFix: 将 max_retry_delay 序列化为 timedelta (#14436)
修复用户单击“任务实例详细信息”时由 start_date 为 None 引起的崩溃 (#14416)
BugFix: 如果任务从正在运行的 DAG 中删除,则修复 TaskInstance API 调用失败的问题 (#14381)
当传递无效的
executor_config
时,调度程序不应失败 (#14323)修复当超过 dagrun_timeout 时允许任务实例生存的 bug (#14321)
修复 DAG 时区未始终在 UI 工具提示中正确显示的 bug (#14204)
当传递空字符串时,为
cookie_samesite
使用Lax
(#14183)[AIRFLOW-6076] 修复
dag.cli()
KeyError (#13647)修复在清除成功的子 DAG 后在子 DAG 中运行子任务的问题 (#14776)
改进¶
删除导致错误安全警报的未使用 JS 包 (#15383)
将新安装的
[kubernetes] enable_tcp_keepalive
的默认值更改为True
(#15338)修复 #14270:在 OOM 情况下添加错误消息 (#15207)
在 docker 镜像中对任意 UID 具有更好的兼容性/诊断 (#15162)
更新了几个库的最新版本的 3.6 限制 (#15209)
添加了最近更改后缺失的 Blinker 依赖项 (#15182)
从 DagRun View 的 search_columns 中删除 'conf' (#15099)
K8S cleanup-pods CLI 中命名空间更合适的默认值 (#15060)
Webserver 启动期间更快的默认角色同步 (#15017)
当有许多 DAG 时,加快 webserver 启动速度 (#14993)
更容易使用且文档更完善的 Docker 镜像 (#14911)
在可用时使用
libyaml
C 库。 (#14577)不在单元测试模式下运行时不创建 unittest.cfg (#14420)
Webserver:允许按 queued_dttm 过滤 TaskInstances (#14708)
更新 Flask-AppBuilder 依赖项以允许 3.2(和所有 3.x 系列)(#14665)
记住浏览器本地存储中展开的任务组 (#14661)
向 cli 表添加纯格式输出 (#14546)
使
airflow dags show
命令显示 TaskGroups (#14269)增加
extra
连接字段的最大大小。 (#12944)通过对 TaskReschedule 执行单个 SQL 删除操作来加速 clear_task_instances。 (#14048)
为 FAB 菜单链接添加更多灵活性。 (#13903)
在 SQLite 版本不匹配的情况下添加更好的描述和指导。 (#14209)
仅文档更改¶
添加文档创建/更新社区提供程序。 (#15061)
修复 airflow.utils.timezone 文档字符串中的错误和拼写错误。 (#15180)
替换为 Stable Airflow 文档的新 URL。 (#15169)
文档:阐明 delete_worker_pods_on_failure 的行为。 (#14958)
为 Docker 镜像创建一个文档包。 (#14846)
多个小的文档 (OpenAPI) 修复。 (#14917)
替换图视图截图以显示自动刷新。 (#14571)
杂项/内部¶
在 hooks 中懒加载导入 Connection 以避免循环依赖。 (#15361)
将 last_scheduler_run 重命名为 last_parsed_time,并确保它在数据库中更新。 (#14581)
使 TaskInstance.pool_slots 不可为空,默认值为 1。 (#14406)
以一致的方式记录迁移信息。 (#14158)
Airflow 2.0.1 (2021-02-08)¶
重大更改¶
查看 Airflow 配置的权限已从 User
和 Viewer
角色中删除¶
以前,具有 User
或 Viewer
角色的用户可以使用 REST API 或 Webserver 获取/查看配置。 从 Airflow 2.0.1 开始,只有具有 Admin
或 Op
角色的用户才能获取/查看配置。
要允许具有其他角色的用户查看配置,请将 can read on Configurations
权限添加到该角色。
请注意,如果 [webserver] expose_config
设置为 False
,即使用户具有带有 can read on Configurations
权限的角色,API 也会抛出 403
响应。
默认的 [celery] worker_concurrency
已更改为 16
¶
Airflow <2.0.0 的 [celery] worker_concurrency
的默认值为 16
。 但是,在 2.0.0 中,它被意外地更改为 8
。
从 Airflow 2.0.1 开始,我们恢复到旧的默认值 16
。
默认的 [scheduler] min_file_process_interval
已更改为 30
¶
由于 [scheduler] min_file_process_interval
的默认值为 0
,因此 CPU 使用率通常保持在 100% 左右,因为 DAG 文件会不断解析。
从 Airflow 2.0.0 开始,调度决策已从 DagFileProcessor 移至 Scheduler,因此我们可以将默认值设置得更高一些:30
。
Bug 修复¶
Bugfix: 在 XCom Endpoint API 中返回 XCom 值 (#13684)
Bugfix: 使用自定义后端和
sql_alchemy_conn_secret
时的导入错误 (#13260)在守护进程化进程(调度程序、Kerberos 等)时允许 PID 文件路径为相对路径 (#13232)
Bugfix: 在
airflow db upgrade
期间,MySQL 中没有通用的DROP CONSTRAINT
(#13239)Bugfix: 运行
sync-perm
时同步在 DAG 中定义的访问控制 (#13377)如果没有在 DAG 上定义回调,则停止发送回调请求 (#13163)
BugFix: 未运行 DAG 级别的回调请求 (#13651)
停止创建重复的 Dag File Processors (#13662)
在调度时过滤已删除状态的任务实例的 DagRuns (#13165)
将 /airflow/www 中的
datatables.net
从 1.10.21 升级到 1.10.22 (#13143)将
datatables.net
JS 升级到 1.10.23 (#13253)将 /airflow/www 中的
dompurify
从 2.0.12 升级到 2.2.6 (#13164)更新最小的
cattrs
版本 (#13223)删除 CLI 池导入/导出中不适用的参数 ‘output’ (#13071)
Webserver:修复停用身份验证选项的行为并添加文档 (#13191)
修复:添加对 no-menu 插件视图的支持 (#11742)
为 Python 3.8+ 添加
python-daemon
限制以修复守护程序崩溃 (#13540)将默认的 celery
worker_concurrency
更改为 16 (#13612)如果
dag_id
为 None,则审计日志记录视图不应包含链接 (#13619)修复用于清理列表 pod 的无效
continue_token
(#13563)切换到最新版本的 Snowflake 连接器 (#13654)
修复任务重试或重新调度时的回填崩溃 (#13712)
将
max_tis_per_query
设置为0
现在可以正确删除限制 (#13512)修复任务回调调用中的竞争条件 (#10917)
修复 gunicorn master 崩溃时 Webserver 退出 (#13518)(#13780)
修复用于检查重复连接的 SQL 语法 (#13783)
BaseBranchOperator
默认将推送到 xcom (#13704) (#13763)修复
configuration.getsection
的弃用警告 (#13804)修复日志端点中的 TaskNotFound (#13872)
修复使用动态 DAG 时的竞争条件 (#13893)
修复:Linux/Chrome Webserver 中的窗口跳动
修复 sqlite 的 db shell (#13907)
仅在存在序列化 DAG 时比较更新时间 (#13899)
修复 mysqldb 驱动程序的 dag run type 枚举查询 (#13278)
为实验性 API 添加对 lineage 端点的身份验证 (#13870)
不要将 User 角色的权限添加到自定义角色。 (#13856)
不要将
Website.can_read
访问权限添加到默认角色。 (#13923)修复由长的 Kubernetes pod 名称引起的无效值错误 (#13299)
修复 SQLite 的 DB 迁移以升级到 2.0 (#13921)
Bugfix: 手动 DagRun 触发器不应跳过计划运行 (#13963)
停止在 Scheduler 中加载额外的 Operator 链接 (#13932)
在
FileTaskHandler
的 read 函数中添加了缺失的返回参数 (#14001)Bugfix: 不要尝试在 Scheduler 中创建重复的 Dag Run (#13920)
使
v1/config
端点尊重 webserverexpose_config
设置 (#14020)禁用 Mariadb 和 MySQL <8 的行级别锁定 (#14031)
Bugfix: 修复仅触发特定 DAG 的权限 (#13922)
修复损坏的 SLA 机制 (#14056)
Bugfix: 如果任务在运行时被删除,Scheduler 会失败 (#14057)
删除 User 和 Viewer 角色读取配置的权限 (#14067)
修复从 2.0.1rc1 的 DB 迁移
改进¶
增加默认的
min_file_process_interval
以降低 CPU 使用率 (#13664)在使用
os.fork
&CeleryExecutor
运行任务时释放连接 (#13265)使
example_kubernetes_executor
示例 dag 中的函数目的更清晰 (#13216)删除未使用的库 -
flask-swagger
,funcsigs
(#13178)当任务尚未运行时(没有 TI),显示替代工具提示 (#13162)
使用 werkzeug 自己的类型转换来进行请求参数处理 (#13184)
UI: 将
queued_by_job_id
&external_executor_id
列添加到 TI 视图 (#13266)使
json-merge-patch
成为一个可选库并取消固定 (#13175)为 LDAP 提供程序添加缺失的 LDAP “extra” 依赖项。 (#13308)
重构
setup.py
以更好地反映提供程序中的更改 (#13314)固定
pyjwt
并为 Apache Pinot 添加集成测试 (#13195)从
setup.cfg
中删除提供程序强制的要求 (#13409)替换已弃用的装饰器 (#13443)
简化 & 简化模型 Dag 和 BaseOperator 中的
__eq__
方法 (#13449)应允许在提供程序模式中添加其他属性 (#13440)
删除未使用的依赖项 -
contextdecorator
(#13455)删除 ‘typing’ 依赖项 (#13472)
以一致的方式记录迁移信息 (#13458)
取消固定
mysql-connector-python
以允许8.0.22
(#13370)删除 thrift 作为核心依赖 (#13471)
在 OpenAPI YAML 中为 DELETE 方法添加
NotFound
响应 (#13550)当
[core] lazy_load_plugins
为False
时,停止日志垃圾信息 (#13578)当没有加载插件时,显示消息和文档链接 (#13599)
取消对
colorlog
依赖项的限制 (#13176)为示例 DAG 添加缺失的 DAG 标签 (#13665)
支持 DAG 文档中的表格 (#13533)
添加
python3-openid
依赖项 (#13714)为 Executors 添加
__repr__
(#13753)添加描述以提示是否缺少
conn_type
(#13778)将 Azure blob 升级到 v12 (#12188)
向
get_connnection
REST 端点添加额外字段 (#13885)使 Smart Sensors DB 迁移幂等 (#13892)
改进运行 dag pause 命令时 DAG 不存在的错误提示 (#13900)
更新
airflow_local_settings.py
以修复错误消息 (#13927)仅允许将 JSON 可序列化的 conf 传递给
TriggerDagRunOperator
(#13964)Bugfix: 允许获取具有空
start_date
的 DAG 的详细信息 (REST API) (#13959)向 DAG 详细信息端点添加参数 (#13790)
使分配给匿名用户的角色可自定义 (#14042)
在
OperationalError
的情况下,重试调度程序循环中的关键方法 (#14032)
仅文档更改¶
在文档中添加缺失的 StatsD 指标 (#13708)
在配置文档中添加缺失的电子邮件配置 (#13709)
添加 Docker 上 Airflow 的快速入门指南 (#13660)
描述支持的 Python 版本 (#13259)
向 2.x 迁移文档添加注释块 (#13094)
添加关于 webserver_config.py 的文档 (#13155)
向最近添加的配置添加缺失的版本信息 (#13161)
API: 在 UpdateMask 组件中使用通用信息 (#13146)
将 Airflow 2.0.0 添加到 requirements 表 (#13140)
避免 CeleryKubernetesExecutor 文档中的混淆 (#13116)
更新 REST API 规范中的文档链接 (#13107)
将 PyPI 存储库的链接添加到 provider 文档 (#13064)
修复指向 Airflow master 分支文档的链接 (#13179)
对 Sensors 文档的细微增强 (#13381)
在 Airflow 文档和 Breeze 中使用 2.0.0 (#13379)
改进有关 providers 和自定义连接的文档 (#13375)(#13410)
修复 production-deployment.rst 中格式错误的表 (#13395)
更新 celery.rst 以修复断开的链接 (#13400)
删除文档中对 scheduler run_duration 参数的引用 (#13346)
设置支持的最低 SQLite 版本 (#13412)
修复安装文档 (#13462)
添加有关模拟变量和连接的文档 (#13502)
添加关于 Flask CLI 的文档 (#13500)
修复升级到 2 指南以使用
rbac
UI (#13569)使文档明确 Stable API 无法禁用 Auth (#13568)
从文档中删除存档的链接并添加 AIP 的链接 (#13580)
升级到 2.rst 中的小修复 (#13583)
修复升级到 2.0 指南中的链接 (#13584)
修复 best-practices.rst 中 Mocking 部分的标题 (#13658)
添加有关如何在 plugins 文件夹中使用自定义运算符的文档 (#13186)
更新文档以注册 Operator Extra Links (#13683)
改进数据库设置文档 (#13696)
将模块路径替换为仅类名的类 (#13719)
更新 DAG 序列化文档 (#13722)
修复 Web 服务器中指向 Apache Airflow 文档的链接 (#13250)
阐明 extras 和 provider 包之间的差异 (#13810)
添加有关所有访问环境的方法的信息 (#13940)
文档:修复关于调度程序延迟的常见问题 (#13969)
更新了 taskflow api 文档以显示与传感器的依赖关系 (#13968)
将已弃用的配置选项添加到文档 (#13883)
在升级到 2 的文档中添加了常见问题解答部分 (#13979)
Airflow 2.0.0 (2020-12-18)¶
完整的更改日志大约有 3,000 行长(已经排除了所有向后移植到 1.10 的内容),所以请查看Airflow 2.0.0 Highlights Blog Post。
重大变更¶
Airflow 的 2.0 版本是一次重大升级,包含大量的重大更改,其中一些可能是破坏性的。为该项目早期版本编写的现有代码可能需要更新才能使用此版本。有时也需要必要的配置更改。本文档介绍了已进行的更改,以及更新您的使用方法所需执行的操作。
如果您遇到问题或有疑问,请提交 一个 issue。
主要变更¶
本节介绍此版本中已进行的主要更改。
默认情况下禁用实验性 REST API¶
默认情况下禁用实验性 REST API。要在迁移到稳定的 REST API 时恢复这些 API,请将 [api]
部分中的 enable_experimental_api
选项设置为 True
。
请注意,实验性 REST API 没有访问控制。经过身份验证的用户拥有完全访问权限。
SparkJDBCHook 默认连接¶
对于 SparkJDBCHook,默认连接是 spark-default
,对于 SparkSubmitHook,默认连接是 spark_default
。现在这两个 hooks 都使用 spark_default
,这是所有提供程序使用的连接名称的通用模式。
命令中输出参数的更改¶
从 Airflow 2.0 开始,我们将使用 rich 替换 tabulate 来渲染命令输出。由于此更改,--output
参数将不再接受 tabulate 表的格式。相反,它现在接受:
table
- 将以预定义的表格渲染输出json
- 将输出渲染为 jsonyaml
- 将输出渲染为 yaml
通过这样做,我们提高了代码一致性,并让用户可以以编程方式操作输出(当使用 json 或 yaml 时)。
受影响的命令
airflow dags list
airflow dags report
airflow dags list-runs
airflow dags list-jobs
airflow connections list
airflow connections get
airflow pools list
airflow pools get
airflow pools set
airflow pools delete
airflow pools import
airflow pools export
airflow role list
airflow providers list
airflow providers get
airflow providers hooks
airflow tasks states-for-dag-run
airflow users list
airflow variables list
Azure Wasb Hook 无法与 Snowflake hook 一起使用¶
Apache Airflow 中的 WasbHook 使用 Azure 库的旧版本。虽然对于大多数 Azure hooks 来说,冲突并不重要,但对于 Wasb Hook 来说,这是一个问题,因为两个库的 blob
文件夹重叠。安装 Snowflake 和 Azure extra 将导致 WasbHook 无法导入。
将 all
重命名为 devel_all
extra¶
all
extras 已减少到仅包含面向用户的依赖项。这意味着此 extra 不包含开发依赖项。如果您依赖 all
extra,那么您现在应该使用 devel_all
或者弄清楚是否需要开发 extras。
上下文变量 prev_execution_date_success
和 prev_execution_date_success
现在是 pendulum.DateTime
¶
将 policy 重命名为 task_policy¶
因为 Airflow 引入了 DAG 级别的策略 (dag_policy
),我们决定将现有的 policy
函数重命名为 task_policy
,以使区别更加深刻并避免任何混淆。
使用集群策略的用户需要在 airflow_local_settings.py
中将其 policy
函数重命名为 task_policy
。
[celery] operation_timeout
的默认值已更改为 1.0
¶
从 Airflow 2 开始,默认情况下,Airflow 将重试 3 次以将任务发布到 Celery 代理。这由 [celery] task_publish_max_retries
控制。因此,我们现在可以拥有更低的操作超时,从而引发 AirflowTaskTimeout
。这通常发生在网络故障或间歇性 DNS 问题期间。
不再支持通过插件添加 Operators 和 Sensors¶
操作符和传感器不应再通过 Airflow 的插件机制注册或导入——这些类型的类仅被 Airflow 视为普通的 Python 类,因此无需向 Airflow 注册它们。
如果您之前有一个 plugins/my_plugin.py
文件,并在 DAG 中像这样使用它
from airflow.operators.my_plugin import MyOperator
您应该改为像这样导入它
from my_plugin import MyOperator
airflow.operators.
下的名称是插件名称,而在第二个示例中,它是定义操作符的 Python 模块名称。
更多信息请参见 https://airflow.org.cn/docs/apache-airflow/stable/howto/custom-operator.html。
不再支持通过插件导入 Hooks¶
不再支持通过 airflow.hooks.<plugin_name>
导入插件中添加的 hooks,hooks 应该像常规 Python 模块一样导入。
from airflow.hooks.my_plugin import MyHook
您应该改为像这样导入它
from my_plugin import MyHook
仍然可以(但不是必须)在插件中“注册” hooks。 这是为了将来支持在 UI 中动态填充 Connections 表单。
更多信息请参见 https://airflow.org.cn/docs/apache-airflow/stable/howto/custom-operator.html。
[core] enable_xcom_pickling
的默认值已更改为 False
¶
XCom 消息的 pickle 类型已默认替换为 JSON,以防止 RCE 攻击。 请注意,JSON 序列化比 pickling 更严格,因此,例如,如果您想通过 XCom 传递原始字节,则必须使用像 base64
这样的编码对其进行编码。 如果您了解风险并且仍然想使用 pickling,请在 Airflow 配置的 core
部分中设置 enable_xcom_pickling = True
。
Airflowignore 的基础路径¶
https://github.com/apache/airflow/pull/11993 中修复了一个错误,即 "airflowignore" 检查了 DAG 文件夹的基础路径是否包含禁止的 DAG,而不仅仅是相对路径。 这导致如果基础路径包含排除的单词,则可能排除整个 DAG 文件夹。 例如,如果 airflowignore 文件包含 x,并且 DAG 文件夹是 '/var/x/dags',则文件夹中的所有 DAG 都会被排除。 此修复现在仅匹配相对路径,这意味着如果您之前使用完整路径作为忽略路径,则应将其更改为相对路径。 例如,如果您的 DAG 文件夹是 '/var/dags/' 并且您的 airflowignore 包含 '/var/dag/excluded/',则应将其更改为 'excluded/'。
ExternalTaskSensor
将所有任务上下文变量作为关键字参数提供给 execution_date_fn
¶
将 context
作为字典传递的旧语法将继续有效,但要注意参数必须命名为 context
。 以下代码将中断。 要修复它,请将 ctx
更改为 context
。
def execution_date_fn(execution_date, ctx): ...
execution_date_fn
可以接受任务上下文字典中提供的任意数量的关键字参数。 支持以下形式的 execution_date_fn
def execution_date_fn(dt): ...
def execution_date_fn(execution_date): ...
def execution_date_fn(execution_date, ds_nodash): ...
def execution_date_fn(execution_date, ds_nodash, dag): ...
数据库模式更改¶
为了迁移数据库,您应该使用命令 airflow db upgrade
,但在某些情况下需要手动步骤。
连接表中的唯一 conn_id¶
以前,Airflow 允许用户添加多个具有相同 conn_id
的连接,并且在访问时它会随机选择一个连接。 当与重试结合使用时,这是一种基本的负载平衡和容错技术。
这种行为给用户带来了一些困惑,并且没有明确的证据表明它是否真的有效。
现在 conn_id
将是唯一的。 如果您的元数据数据库中已经有重复项,您必须在升级数据库之前管理这些重复连接。
连接表中不可为空的 conn_type 列¶
connection
表中的 conn_type
列必须包含内容。 以前,此规则由应用程序逻辑强制执行,但数据库模式不强制执行。
如果您直接对表进行了任何修改,请确保 conn_type
列中没有 null。
配置更改¶
此版本包含许多需要更改此应用程序或与其集成的其他应用程序的配置的更改。
本节介绍已进行的更改以及您需要执行的操作。
airflow.contrib.utils.log 已移动¶
以前,核心代码由最初的创建者 Airbnb 维护。 contrib 包中的代码由社区支持。 该项目已传递给 Apache 社区,目前整个代码由社区维护,因此现在这种划分没有任何理由,仅仅是历史原因。 在 Airflow 2.0 中,我们希望组织包并将与第三方服务的集成移动到 airflow.providers
包。
为了清理,移动了以下包
旧包 |
新包 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果您使用 logging_config_class
选项设置日志配置,则应更新导入路径。 旧的导入路径仍然有效,但可能会被废弃。
SendGrid 发送邮件程序已移动¶
以前,核心代码由最初的创建者 Airbnb 维护。 contrib 包中的代码由社区支持。 该项目已传递给 Apache 社区,目前整个代码由社区维护,因此现在这种划分没有任何理由,仅仅是历史原因。
为了清理,已移动了 airflow.contrib.utils.sendgrid
模块中的 send_mail
函数。
如果您的配置文件如下所示
[email]
email_backend = airflow.contrib.utils.sendgrid.send_email
现在应该如下所示
[email]
email_backend = airflow.providers.sendgrid.utils.emailer.send_email
旧的配置仍然有效,但可能会被废弃。
统一 core
部分中的 hostname_callable
选项¶
之前的选项使用冒号 (:
) 将模块与函数分开。 现在使用点 (.
)。
此更改旨在统一 airflow.cfg
文件中引用对象的所有选项的格式。
自定义执行程序使用完整导入路径加载¶
在之前的 Airflow 版本中,可以使用插件来加载自定义的执行器。现在仍然可以,但配置方式已更改。现在您无需创建插件来配置自定义执行器,而是需要在 core
部分的 executor
选项中提供模块的完整路径。此更改旨在简化插件机制并使其更易于配置执行器。
如果您的模块路径为 my_acme_company.executors.MyCustomExecutor
且插件名为 my_plugin
,那么您的配置看起来像这样:
[core]
executor = my_plugin.MyCustomExecutor
现在应该看起来像这样:
[core]
executor = my_acme_company.executors.MyCustomExecutor
旧的配置仍然有效,但随时可能被弃用。
对于自定义数据模型,请使用 CustomSQLAInterface
代替 SQLAInterface
。¶
从 Airflow 2.0 开始,如果您想定义自己的 Flask App Builder 数据模型,您需要使用 CustomSQLAInterface 代替 SQLAInterface。
对于非 RBAC,替换为:
from flask_appbuilder.models.sqla.interface import SQLAInterface
datamodel = SQLAInterface(your_data_model)
使用 RBAC(在 1.10 中):
from airflow.www_rbac.utils import CustomSQLAInterface
datamodel = CustomSQLAInterface(your_data_model)
在 2.0 中:
from airflow.www.utils import CustomSQLAInterface
datamodel = CustomSQLAInterface(your_data_model)
删除插件对 stat_name_handler 的支持。¶
在以前的版本中,您可以使用插件机制来配置 stat_name_handler
。现在,您应该使用 [scheduler]
部分中的 stat_name_handler
选项来实现相同的效果。
如果您的插件看起来像这样,并且可以通过 test_plugin
路径访问:
def my_stat_name_handler(stat):
return stat
class AirflowTestPlugin(AirflowPlugin):
name = "test_plugin"
stat_name_handler = my_stat_name_handler
那么您的 airflow.cfg
文件应该看起来像这样:
[scheduler]
stat_name_handler=test_plugin.my_stat_name_handler
此更改旨在简化 statsd 配置。
日志配置已移至新部分。¶
以下配置已从 [core]
移动到新的 [logging]
部分。
base_log_folder
remote_logging
remote_log_conn_id
remote_base_log_folder
encrypt_s3_logs
logging_level
fab_logging_level
logging_config_class
colored_console_log
colored_log_format
colored_formatter_class
log_format
simple_log_format
task_log_prefix_template
log_filename_template
log_processor_filename_template
dag_processor_manager_log_location
task_log_reader
指标配置已移至新部分。¶
以下配置已从 [scheduler]
移动到新的 [metrics]
部分。
statsd_on
statsd_host
statsd_port
statsd_prefix
statsd_allow_list
stat_name_handler
statsd_datadog_enabled
statsd_datadog_tags
statsd_custom_client_path
Elasticsearch 日志记录提供程序的更改。¶
启用 JSON 输出到 stdout 时,日志行现在将包含 log_id
和 offset
字段,这应使直接从 Web 服务器上的 elasticsearch 读取任务日志成为可能。示例配置:
[logging]
remote_logging = True
[elasticsearch]
host = http://es-host:9200
write_stdout = True
json_format = True
请注意,Web 服务器期望日志行数据本身存在于文档的 message
字段中。
删除 airflow.cfg 文件中的 gcp_service_account_keys 选项。¶
此选项已被删除,因为它不再受 Google Kubernetes Engine 支持。 Google Cloud 管理方法的新推荐服务帐户密钥是 Workload Identity。
默认启用 Fernet。¶
默认情况下启用 Fernet 机制,以提高默认安装的安全性。为了恢复以前的行为,用户必须在 airflow.cfg
文件中 [core]
部分的 fernet_key
选项中有意识地设置一个空密钥。
同时,这意味着始终安装 apache-airflow[crypto]
额外包。但是,这要求您的操作系统安装 libffi-dev
。
传播 Kubernetes 工作节点注解的更改。¶
已删除 kubernetes_annotations
配置部分。已将新键 worker_annotations
添加到现有的 kubernetes
部分。这是为了取消对 k8s 注解键的字符集限制。来自 kubernetes_annotations
的所有键/值对现在应作为 json 转到 worker_annotations
。例如,代替:
[kubernetes_annotations]
annotation_key = annotation_value
annotation_key2 = annotation_value2
应该重写为:
[kubernetes]
worker_annotations = { "annotation_key" : "annotation_value", "annotation_key2" : "annotation_value2" }
删除 run_duration。¶
我们不应该再使用 run_duration
选项。过去,这用于不时重启调度器,但现在调度器变得更加稳定,因此使用此设置被认为是不好的,并且可能导致不一致的状态。
重命名 Pool statsd 指标。¶
已将使用的槽重命名为正在运行的槽,以使名称具有自解释性并使代码更易于维护。
这意味着 pool.used_slots.<pool_name>
指标已重命名为 pool.running_slots.<pool_name>
。 Pools Web UI 视图中的“Used Slots
”列也已更改为“Running Slots
”。
删除 Mesos Executor。¶
Mesos Executor 已从代码库中删除,因为它没有被广泛使用且没有得到维护。 邮件列表讨论有关删除它。
更改 DAG 加载持续时间指标名称。¶
将 DAG 文件加载持续时间指标从 dag.loading-duration.<dag_id>
更改为 dag.loading-duration.<dag_file>
。这是为了更好地处理一个 DAG 文件具有多个 DAG 的情况。
默认禁用 Sentry。¶
默认情况下禁用 Sentry。要启用这些集成,您需要在 [sentry]
部分将 sentry_on
选项设置为 "True"
。
简化 GCSTaskHandler 配置。¶
在以前的版本中,为了配置服务帐户密钥文件,您必须创建一个连接条目。在当前版本中,您可以在 [logging]
部分配置 google_key_path
选项来设置密钥文件路径。
使用应用程序默认凭据 (ADC) 的用户无需采取任何操作。
此更改旨在简化日志记录的配置,以防止通过更改用户控制的值(连接条目)来破坏实例配置。 如果您配置了后端密钥,这也意味着 Web 服务器不需要连接到它。 这简化了具有多个 GCP 项目的设置,因为只有一个项目需要启用 Secret Manager API。
核心运算符/钩子的更改。¶
我们努力确保没有可能影响最终用户和您的文件的更改,但此版本可能包含需要更改您的 DAG 文件的更改。
本节介绍已进行的更改,以及如果您使用核心运算符或任何其他运算符,需要执行的操作来更新您的 DAG 文件。
BaseSensorOperator 现在遵循下游任务的 trigger_rule。¶
以前,当 BaseSensorOperator 设置 soft_fail=True
时,它会跳过自身并无条件地跳过其所有下游任务,即不遵循下游任务的 trigger_rule。
在新行为中,遵循下游任务的 trigger_rule。用户可以通过将每个下游任务的 trigger_rule 设置为 all_success
来保留/实现原始行为。
BaseOperator 使用元类。¶
BaseOperator
类使用 BaseOperatorMeta
作为元类。 此元类基于 abc.ABCMeta
。 如果您的自定义运算符使用不同的元类,那么您必须对其进行调整。
删除 BaseHook 中的 SQL 支持。¶
从 BaseHook 中删除 get_records
和 get_pandas_df
和 run
,它们仅适用于 SQL 类似的钩子。如果要使用它们,或者您的自定义钩子继承它们,请使用 airflow.hooks.dbapi.DbApiHook
。
不再支持使用按位移位(bit-shift)运算符将任务分配给 DAG。¶
以前,您可以按如下方式将任务分配给 DAG:
dag = DAG("my_dag")
dummy = DummyOperator(task_id="dummy")
dag >> dummy
不再支持此操作。相反,我们建议使用 DAG 作为上下文管理器:
with DAG("my_dag") as dag:
dummy = DummyOperator(task_id="dummy")
移除已弃用的导入机制¶
已移除已弃用的导入机制,因此模块的导入变得更加一致和明确。
例如: from airflow.operators import BashOperator
变为 from airflow.operators.bash_operator import BashOperator
传感器导入的更改¶
传感器现在可以通过 airflow.sensors
访问,而不再通过 airflow.operators.sensors
访问。
例如: from airflow.operators.sensors import BaseSensorOperator
变为 from airflow.sensors.base import BaseSensorOperator
跳过的任务可以满足 wait_for_downstream¶
以前,只有当先前任务实例的下游任务成功时,具有 wait_for_downstream=True
的任务实例才会运行。 同时,如果先前的任务实例成功或被跳过,则具有 depends_on_past=True
的任务实例将运行。 这两个标志是 close siblings,但它们的行为不同。 这种行为的不一致使得 API 对用户来说不那么直观。 为了保持一致的行为,成功或跳过的下游任务现在都可以满足 wait_for_downstream=True
标志。
airflow.utils.helpers.cross_downstream
¶
airflow.utils.helpers.chain
¶
chain
和 cross_downstream
方法现在已从 airflow.utils.helpers
模块移动到 airflow.models.baseoperator 模块。
baseoperator
模块似乎是将紧密耦合的方法放在一起的更好选择。 Helpers 模块应该包含可以被所有类导入的独立帮助方法。
chain
方法和 cross_downstream
方法都使用 BaseOperator。 如果任何其他包从 helpers 模块导入任何类或函数,那么它会自动具有对 BaseOperator 的隐式依赖。 这通常会导致循环依赖。
更多信息请参见 AIRFLOW-6392
在 Airflow < 2.0 中,你像这样导入这两个方法
from airflow.utils.helpers import chain
from airflow.utils.helpers import cross_downstream
在 Airflow 2.0 中,应该更改为
from airflow.models.baseoperator import chain
from airflow.models.baseoperator import cross_downstream
airflow.operators.python.BranchPythonOperator
¶
BranchPythonOperator
现在将返回一个等于所选分支的 task_id
的值,而之前它返回 None。 由于它继承自 BaseOperator,如果 do_xcom_push=True
,它将对该值进行 xcom_push
。 这对于下游决策很有用。
airflow.sensors.sql_sensor.SqlSensor
¶
SQLSensor 现在与 python bool()
函数一致,并且 allow_null
参数已被删除。
它将在收到使用 python bool(value)
转换为 True
的任何值后解析。 这改变了之前接收 NULL
或 '0'
的响应。 早期 '0'
已被视为成功标准。 NULL
已根据 allow_null
参数的值进行处理。 但是,所有先前的行为仍然可以通过将参数 success
设置为 lambda x: x is None or str(x) not in ('0', '')
来实现。
airflow.operators.trigger_dagrun.TriggerDagRunOperator
¶
TriggerDagRunOperator 现在接受一个 conf
参数,可以为 DagRun 提供一个 dict 作为 conf。 因此,python_callable
参数已被删除。 PR: https://github.com/apache/airflow/pull/6317.
airflow.operators.python.PythonOperator
¶
PythonOperator 上的 provide_context
参数已被删除。 现在可以推断传递给 PythonOperator 的可调用对象的签名,并且始终自动提供参数值。 无需再显式提供或不提供上下文。 例如
def myfunc(execution_date):
print(execution_date)
python_operator = PythonOperator(task_id="mytask", python_callable=myfunc, dag=dag)
请注意,您不必设置 provide_context=True,现在会自动检测并提供任务上下文中的变量。
所有上下文变量仍然可以使用双星号参数提供
def myfunc(**context):
print(context) # all variables will be provided to context
python_operator = PythonOperator(task_id="mytask", python_callable=myfunc)
任务上下文变量名称是可调用函数中的保留名称,因此与 op_args
和 op_kwargs
的冲突会导致异常
def myfunc(dag):
# raises a ValueError because "dag" is a reserved name
# valid signature example: myfunc(mydag)
print("output")
python_operator = PythonOperator(
task_id="mytask",
op_args=[1],
python_callable=myfunc,
)
此更改向后兼容,设置 provide_context
将向 kwargs
添加 provide_context
变量(但不会执行任何操作)。
PR: #5990
airflow.providers.standard.sensors.filesystem.FileSensor
¶
FileSensor 现在接受 glob 模式,而不仅仅是文件名。 如果您要查找的文件名中包含 *
、?
或 [
,则应将这些替换为 [*]
、[?]
和 [[]
。
airflow.operators.subdag_operator.SubDagOperator
¶
SubDagOperator
已更改为使用 Airflow 调度程序而不是回填来调度 subdag 中的任务。 用户不再需要在 SubDagOperator
中指定执行程序。
airflow.providers.google.cloud.operators.datastore.CloudDatastoreExportEntitiesOperator
¶
airflow.providers.google.cloud.operators.datastore.CloudDatastoreImportEntitiesOperator
¶
airflow.providers.cncf.kubernetes.operators.kubernetes_pod.KubernetesPodOperator
¶
airflow.providers.ssh.operators.ssh.SSHOperator
¶
airflow.providers.microsoft.winrm.operators.winrm.WinRMOperator
¶
airflow.operators.bash.BashOperator
¶
airflow.providers.docker.operators.docker.DockerOperator
¶
airflow.providers.http.operators.http.SimpleHttpOperator
¶
do_xcom_push
标志(用于将运算符的结果推送到 xcom 的开关)在不同的运算符中以不同的形式出现。 它的功能已在 BaseOperator
上以一个通用名称 (do_xcom_push
) 统一。 这样,也很容易全局禁用将结果推送到 xcom。
以下运算符受到影响
DatastoreExportOperator(向后兼容)
DatastoreImportOperator(向后兼容)
KubernetesPodOperator(不向后兼容)
SSHOperator(不向后兼容)
WinRMOperator(不向后兼容)
BashOperator(不向后兼容)
DockerOperator(不向后兼容)
SimpleHttpOperator(不向后兼容)
有关详细信息,请参见 AIRFLOW-3249
airflow.operators.latest_only_operator.LatestOnlyOperator
¶
在以前的版本中,LatestOnlyOperator
强制跳过所有(直接和间接)下游任务。 从此版本开始,该运算符将**仅跳过直接下游**任务,并且调度程序将处理跳过任何进一步的下游依赖项。
如果仅使用默认触发规则 all_success
,则无需进行任何更改。
如果 DAG 依赖于具有其他触发规则(例如 all_done
)的任务,这些任务被 LatestOnlyOperator
跳过,则需要对 DAG 进行调整以适应行为的变化,例如,从 LatestOnlyOperator
添加额外的边。
此更改的目标是基于 BaseBranchOperator
实现更一致和可配置的级联行为(请参阅 AIRFLOW-2923 和 AIRFLOW-1784)。
核心 Python API 的更改¶
我们努力确保不会发生可能影响最终用户及其 Python 文件的更改,但此版本可能包含需要更改插件、DAG 文件或其他集成的更改。
此处仅描述此提供程序独有的更改。您仍然应该注意对核心(包括核心运算符)所做的更改,因为它们会影响此提供程序的集成行为。
本节介绍已进行的更改,以及更新 Python 文件所需的操作。
从 airflow/__init__.py
中删除子包导入¶
导入 LoggingMixin
、conf
和 AirflowException
已从 airflow/__init__.py
中删除。对这些对象的所有隐式引用将不再有效。 要迁移,必须将其对应的所有旧路径的用法替换为新的路径。
旧路径(隐式导入) |
新路径(显式导入) |
---|---|
|
|
|
|
|
|
从任务实例上下文中删除的变量¶
以下变量已从任务实例上下文中删除
end_date
latest_date
tables
airflow.contrib.utils.Weekday
¶
以前,核心代码由最初的创建者 Airbnb 维护。 contrib 包中的代码由社区支持。 该项目已传递给 Apache 社区,目前整个代码由社区维护,因此现在这种划分没有任何理由,仅仅是历史原因。
为了清理,Weekday
枚举已从 airflow.contrib.utils
移动到 airflow.utils
模块。
airflow.models.connection.Connection
¶
连接模块具有新的已弃用方法
Connection.parse_from_uri
Connection.log_info
Connection.debug_info
以及一个已弃用的函数
parse_netloc_to_hostname
以前,用户可以通过两种方式创建连接对象
conn_1 = Connection(conn_id="conn_a", uri="mysql://AAA/")
# or
conn_2 = Connection(conn_id="conn_a")
conn_2.parse_uri(uri="mysql://AAA/")
现在不支持第二种方法。
Connection.log_info
和 Connection.debug_info
方法已被弃用。 请单独读取每个 Connection 字段或使用默认表示形式 (__repr__
)。
旧方法仍然有效,但随时可能被放弃。 这些更改旨在删除很少使用的方法。
airflow.models.dag.DAG.create_dagrun
¶
DAG.create_dagrun 接受 run_type,不需要 run_id。 此更改是由将 run_type
列添加到 DagRun
引起的。
先前的签名
def create_dagrun(
self,
run_id,
state,
execution_date=None,
start_date=None,
external_trigger=False,
conf=None,
session=None,
): ...
当前
def create_dagrun(
self,
state,
execution_date=None,
run_id=None,
start_date=None,
external_trigger=False,
conf=None,
run_type=None,
session=None,
): ...
如果用户提供 run_id
,则 run_type
将通过检查前缀从它派生,允许的类型:manual
、scheduled
、backfill
(由 airflow.utils.types.DagRunType
定义)。
如果用户提供 run_type
和 execution_date
,则 run_id
构造为 {run_type}__{execution_data.isoformat()}
。
Airflow 应该使用 run_type
和 execution_date
构造 dagruns,使用 run_id
的创建被保留用于用户操作。
airflow.models.dagrun.DagRun
¶
使用 DagRunType.SCHEDULED.value 代替 DagRun.ID_PREFIX
各种 DagRun 的所有 run_id 前缀已分组到 airflow.utils.types.DagRunType
中的单个枚举中。
以前,它们在不同的地方定义,例如 DagRun
、BackfillJob
的 ID_PREFIX
类变量和 _trigger_dag
函数中。
过去
>> from airflow.models.dagrun import DagRun
>> DagRun.ID_PREFIX
scheduled__
替换为
>> from airflow.utils.types import DagRunType
>> DagRunType.SCHEDULED.value
scheduled
airflow.utils.file.TemporaryDirectory
¶
我们移除了 airflow.utils.file.TemporaryDirectory
,因为 Airflow 放弃了对 Python < 3.5 的支持,因此无需拥有此自定义的 TemporaryDirectory
实现,因为 tempfile.TemporaryDirectory
提供了相同的功能。
现在,用户应该执行 from tempfile import TemporaryDirectory
而不是 import from airflow.utils.files import TemporaryDirectory
。 两个上下文管理器提供相同的接口,因此不需要额外的更改。
airflow.AirflowMacroPlugin
¶
我们移除了 airflow.AirflowMacroPlugin
类。 该类存在于 airflow 包中,但尚未使用(显然自 2015 年以来)。 它已被删除。
airflow.settings.CONTEXT_MANAGER_DAG
¶
CONTEXT_MANAGER_DAG 已从设置中删除。 它的作用已被 'airflow.models.dag' 中的 DagContext
取代。 其中一个原因是设置应该保持静态,而不是存储来自 DAG 的动态上下文,但主要原因是将上下文移出设置允许解除 DAG、BaseOperator、SerializedDAG、SerializedBaseOperator 之间的循环导入,这是 AIRFLOW-6010 的一部分。
airflow.utils.log.logging_mixin.redirect_stderr
¶
airflow.utils.log.logging_mixin.redirect_stdout
¶
模块 airflow.utils.log.logging_mixin
中的函数 redirect_stderr
和 redirect_stdout
已被删除,因为它可以很容易地被标准库替换。 标准库的功能更加灵活,可以在更大的情况下使用。
下面的代码
import logging
from airflow.utils.log.logging_mixin import redirect_stderr, redirect_stdout
logger = logging.getLogger("custom-logger")
with redirect_stdout(logger, logging.INFO), redirect_stderr(logger, logging.WARN):
print("I love Airflow")
可以被以下代码替换
from contextlib import redirect_stdout, redirect_stderr
import logging
from airflow.utils.log.logging_mixin import StreamLogWriter
logger = logging.getLogger("custom-logger")
with (
redirect_stdout(StreamLogWriter(logger, logging.INFO)),
redirect_stderr(StreamLogWriter(logger, logging.WARN)),
):
print("I Love Airflow")
airflow.models.baseoperator.BaseOperator
¶
现在,传递给 BaseOperator 的其他参数会导致异常。 以前版本的 Airflow 接受其他参数并在控制台上显示一条消息。 当用户没有注意到该消息时,会导致很难检测到的错误。
为了恢复以前的行为,您必须在 airflow.cfg
文件中 [operators]
部分的 allow_illegal_arguments
选项中设置为 True
。 将来可能会完全删除此选项。
airflow.models.dagbag.DagBag
¶
将 store_serialized_dags
参数传递给 DagBag.__init__ 并访问 DagBag.store_serialized_dags
属性已被弃用,并在未来的版本中将被删除。
先前的签名:
def __init__(
dag_folder=None,
include_examples=conf.getboolean("core", "LOAD_EXAMPLES"),
safe_mode=conf.getboolean("core", "DAG_DISCOVERY_SAFE_MODE"),
store_serialized_dags=False,
): ...
当前:
def __init__(
dag_folder=None,
include_examples=conf.getboolean("core", "LOAD_EXAMPLES"),
safe_mode=conf.getboolean("core", "DAG_DISCOVERY_SAFE_MODE"),
read_dags_from_db=False,
): ...
如果您使用的是位置参数,则不需要更改,但如果您使用的是关键字参数,请将 store_serialized_dags
更改为 read_dags_from_db
。
同样,如果您使用的是 DagBag().store_serialized_dags
属性,请将其更改为 DagBag().read_dags_from_db
。
google
提供程序包中的更改¶
我们努力确保不会发生可能影响最终用户及其 Python 文件的更改,但此版本可能包含需要更改配置、DAG 文件或其他集成(例如自定义运算符)的更改。
此处仅描述此提供程序独有的更改。您仍然应该注意对核心(包括核心运算符)所做的更改,因为它们会影响此提供程序的集成行为。
本节介绍已进行的更改,以及如果您使用与 Google 服务(包括 Google Cloud - GCP)集成的运算符或挂钩,则需要进行的更新。
直接模拟已添加到与 Google 服务通信的运算符¶
通过名为 impersonation_chain
的新参数(在也与其它云提供商的服务通信的运算符的情况下为 google_impersonation_chain
),可以直接模拟服务账号以用于通过 Google 服务通信的运算符。 因此,GCSToS3Operator 不再从 GCSListObjectsOperator 派生。
为 Google Cloud 规范化 gcp_conn_id¶
此前,并非所有与 Google Cloud 相关的 Hook 和 Operator 都使用 gcp_conn_id
作为 GCP 连接的参数。目前有一个参数适用于大多数服务。类似 datastore_conn_id
、bigquery_conn_id
、google_cloud_storage_conn_id
等参数已被弃用。需要两个连接的 Operator 未更改。
以下组件受到规范化的影响
airflow.providers.google.cloud.hooks.datastore.DatastoreHook
airflow.providers.google.cloud.hooks.bigquery.BigQueryHook
airflow.providers.google.cloud.hooks.gcs.GoogleCloudStorageHook
airflow.providers.google.cloud.operators.bigquery.BigQueryCheckOperator
airflow.providers.google.cloud.operators.bigquery.BigQueryValueCheckOperator
airflow.providers.google.cloud.operators.bigquery.BigQueryIntervalCheckOperator
airflow.providers.google.cloud.operators.bigquery.BigQueryGetDataOperator
airflow.providers.google.cloud.operators.bigquery.BigQueryOperator
airflow.providers.google.cloud.operators.bigquery.BigQueryDeleteDatasetOperator
airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyDatasetOperator
airflow.providers.google.cloud.operators.bigquery.BigQueryTableDeleteOperator
airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageCreateBucketOperator
airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageListOperator
airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageDownloadOperator
airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageDeleteOperator
airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageBucketCreateAclEntryOperator
airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageObjectCreateAclEntryOperator
airflow.operators.sql_to_gcs.BaseSQLToGoogleCloudStorageOperator
airflow.operators.adls_to_gcs.AdlsToGoogleCloudStorageOperator
airflow.operators.gcs_to_s3.GoogleCloudStorageToS3Operator
airflow.operators.gcs_to_gcs.GoogleCloudStorageToGoogleCloudStorageOperator
airflow.operators.bigquery_to_gcs.BigQueryToCloudStorageOperator
airflow.operators.local_to_gcs.FileToGoogleCloudStorageOperator
airflow.operators.cassandra_to_gcs.CassandraToGoogleCloudStorageOperator
airflow.operators.bigquery_to_bigquery.BigQueryToBigQueryOperator
GCP Operator 和 Hook 的导入路径和名称的更改¶
根据 AIP-21,与 Google Cloud 相关的 Operator 已从 contrib 移至 core。下表显示了导入路径的更改。
旧路径 |
新路径 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
统一 Google Cloud 的默认连接 ID¶
之前,并非所有与 Google Cloud 相关的 Hook 和 Operator 都使用 google_cloud_default
作为默认连接 ID。 目前只有一个默认变体。 诸如 google_cloud_storage_default
、bigquery_default
、google_cloud_datastore_default
等值已被弃用。 数据库中现有相关连接的配置已保留。 要使用那些已弃用的 GCP 连接 ID,您需要将它们的连接 ID 显式传递到 Operator/Hook 中。 否则,默认情况下,google_cloud_default
将用作 GCP 的连接 ID。
airflow.providers.google.cloud.hooks.dataflow.DataflowHook
¶
airflow.providers.google.cloud.operators.dataflow.DataflowCreateJavaJobOperator
¶
airflow.providers.google.cloud.operators.dataflow.DataflowTemplatedJobStartOperator
¶
airflow.providers.google.cloud.operators.dataflow.DataflowCreatePythonJobOperator
¶
为了在 GCP 的 Hook 和 Operator 中一致地使用 project_id 参数,我们做了以下更改
- 更改了 DataflowHook.start_python_dataflow 中的参数顺序。 使用
带有位置参数可能会中断。
- 更改了 DataflowHook.is_job_dataflow_running 中的参数顺序。 使用
带有位置参数可能会中断。
- 更改了 DataflowHook.cancel_job 中的参数顺序。 使用
带有位置参数可能会中断。
- 向 DataflowCreateJavaJobOperator 构造函数添加了可选的 project_id 参数。
构造函数。
- 向 DataflowTemplatedJobStartOperator 添加了可选的 project_id 参数
构造函数。
- 向 DataflowCreatePythonJobOperator 添加了可选的 project_id 参数
构造函数。
airflow.providers.google.cloud.sensors.gcs.GCSUploadSessionCompleteSensor
¶
为了在处理底层 GCS Bucket 中对象的更改时提供更精确的控制,此传感器现在已更改构造函数。
旧的行为:此构造函数曾经可选地接受
previous_num_objects: int
。新的替换构造函数 kwarg:
previous_objects: Optional[Set[str]]
。
大多数用户不会指定此参数,因为存储桶最初是空的,并且用户希望将所有文件都视为新的。
更新此传感器用法的示例:之前调用以下函数的用户:
GCSUploadSessionCompleteSensor(bucket='my_bucket', prefix='my_prefix', previous_num_objects=1)
现在应该调用:
GCSUploadSessionCompleteSensor(bucket='my_bucket', prefix='my_prefix', previous_num_objects={'.keep'})
其中 '.keep' 是前缀下的单个文件,传感器不应将其视为新的。
airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor
¶
airflow.providers.google.cloud.hooks.bigquery.BigQueryHook
¶
为了简化 BigQuery 操作符(无需使用 Cursor
)并标准化所有 GCP 集成方法中 hook 的用法,来自 BiqQueryBaseCursor
的方法已移至 BigQueryHook
。由于保留了向后兼容性,仍然可以通过 Cursor
对象使用它们,但会引发 DeprecationWarning
。以下方法已移动:
旧路径 |
新路径 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor
¶
由于 BigQuery 是 GCP 的一部分,因此可以通过使用 airflow.providers.google.common.hooks.base.GoogleBaseHook.catch_http_exception
装饰器处理异常来简化代码。但是,它会更改以下方法引发的异常:
airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_table_delete
抛出AirflowException
而不是Exception
。airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.create_empty_dataset
抛出AirflowException
而不是ValueError
。airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_dataset
抛出AirflowException
而不是ValueError
。
airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyTableOperator
¶
airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyDatasetOperator
¶
已将幂等性添加到 BigQueryCreateEmptyTableOperator
和 BigQueryCreateEmptyDatasetOperator
。但为此,从 BigQueryHook
的 create_empty_dataset
和 create_empty_table
方法中删除了 try / except 子句。
airflow.providers.google.cloud.hooks.dataflow.DataflowHook
¶
airflow.providers.google.cloud.hooks.mlengine.MLEngineHook
¶
airflow.providers.google.cloud.hooks.pubsub.PubSubHook
¶
GCP 操作符中的更改意味着这些操作符的 GCP Hook 现在在所有使用 project_id
的方法中都需要关键字参数,而不是位置参数。如果使用位置参数调用这些方法,将会抛出一个解释性的异常。
其他 GCP hook 不受影响。
airflow.providers.google.cloud.hooks.pubsub.PubSubHook
¶
airflow.providers.google.cloud.operators.pubsub.PubSubTopicCreateOperator
¶
airflow.providers.google.cloud.operators.pubsub.PubSubSubscriptionCreateOperator
¶
airflow.providers.google.cloud.operators.pubsub.PubSubTopicDeleteOperator
¶
airflow.providers.google.cloud.operators.pubsub.PubSubSubscriptionDeleteOperator
¶
airflow.providers.google.cloud.operators.pubsub.PubSubPublishOperator
¶
airflow.providers.google.cloud.sensors.pubsub.PubSubPullSensor
¶
在 PubSubPublishOperator
和 PubSubHook.publish
方法中,消息中的 data 字段应为字节串(UTF-8 编码),而不是 base64 编码的字符串。
由于 GCP 操作符和 hook 中的参数标准化,诸如 project
或 topic_project
之类的参数已被弃用,并将被参数 project_id
替代。 在 PubSubHook.create_subscription
hook 方法中,参数 subscription_project
被 subscription_project_id
替换。 模板字段已相应更新,旧的可能无法正常工作。
现在需要将仅关键字的参数传递给 PubSub
hook。
这些更改不向后兼容。
airflow.providers.google.cloud.operators.kubernetes_engine.GKEStartPodOperator
¶
GKEPodOperator 中的 gcp_conn_id 参数是必需的。 在以前的版本中,可以将 None
值传递给 GKEStartPodOperator 操作符中的 gcp_conn_id
,这会导致根据 应用程序默认凭据策略确定凭据。
现在,此参数需要一个值。 要恢复以前的行为,请配置连接而不指定服务帐户。
有关连接管理的详细信息,请访问:Google Cloud 连接。
airflow.providers.google.cloud.hooks.gcs.GCSHook
¶
以下参数已在 GCSHook 的所有方法中替换:
bucket
更改为bucket_name
object
更改为object_name
为了保持一致性,
GoogleCloudStorageHook.list
中的maxResults
参数已重命名为max_results
。
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPigJobOperator
¶
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHiveJobOperator
¶
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkSqlJobOperator
¶
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkJobOperator
¶
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHadoopJobOperator
¶
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPySparkJobOperator
¶
Dataproc 相关 Operator (DataprocXXXOperator
) 的 'properties' 和 'jars' 属性已从 dataproc_xxxx_properties
和 dataproc_xxx_jars
重命名为 dataproc_properties
和 dataproc_jars
。 dataproc_properties 和 dataproc_jars 的参数。
airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceCreateJobOperator
¶
为了获得 pylint 兼容性,CloudDataTransferServiceCreateJobOperator
中的 filter
参数已重命名为 request_filter
。
airflow.providers.google.cloud.hooks.cloud_storage_transfer_service.CloudDataTransferServiceHook
¶
为了获得 pylint 兼容性,
CloudDataTransferServiceHook.list_transfer_job
和CloudDataTransferServiceHook.list_transfer_operations
中的filter
参数已重命名为request_filter
。
airflow.providers.google.cloud.hooks.bigquery.BigQueryHook
¶
通常,所有 hook 方法都使用 @GoogleBaseHook.fallback_to_default_project_id
进行装饰,因此 hook 的参数只能通过关键字参数传递。
create_empty_table
方法现在接受table_resource
参数。 如果提供了此参数,则忽略所有其他参数。如果参数在
dataset_reference
中传递,并且作为方法参数传递,则create_empty_dataset
现在将使用dataset_reference
中的值,而不是引发错误。 此外,dataset_reference
的验证是使用Dataset.from_api_repr
完成的。 异常和日志消息已更改。update_dataset
现在需要新的fields
参数(重大更改)delete_dataset
具有新的签名(dataset_id, project_id, …),之前的签名是 (project_id, dataset_id, …)(重大更改)get_tabledata
返回行列表,而不是 dict 格式的 API 响应。 此方法已被弃用,推荐使用list_rows
。(重大更改)
airflow.providers.google.cloud.hooks.cloud_build.CloudBuildHook
¶
airflow.providers.google.cloud.operators.cloud_build.CloudBuildCreateBuildOperator
¶
- 已删除
api_version
,因为我们将CloudBuildHook
从使用 Discovery API 迁移到原生 google-cloud-build python 库,所以不再使用该参数。
CloudBuildCreateBuildOperator
中的body
参数已被弃用。相反,您应该使用
build
参数传递 body。
airflow.providers.google.cloud.hooks.dataflow.DataflowHook.start_python_dataflow
¶
airflow.providers.google.cloud.hooks.dataflow.DataflowHook.start_python_dataflow
¶
airflow.providers.google.cloud.operators.dataflow.DataflowCreatePythonJobOperator
¶
将 python3 作为 Dataflow Hooks/Operators 的默认解释器更改
现在,DataFlow Hooks/Operators 的 py_interpreter
参数已从 python2 更改为 python3。
airflow.providers.google.common.hooks.base_google.GoogleBaseHook
¶
为了简化代码,decorator provide_gcp_credential_file 已从内部类移出。
您应该编写 @GoogleBaseHook.provide_gcp_credential_file
,而不是 @GoogleBaseHook._Decorators.provide_gcp_credential_file
airflow.providers.google.cloud.operators.dataproc.DataprocCreateClusterOperator
¶
强烈建议 Dataproc 的磁盘大小为 1TB+,以获得足够的吞吐量:https://cloud.google.com/compute/docs/disks/performance
因此,DataprocCreateClusterOperator
中 master_disk_size
的默认值已从 500GB 更改为 1TB。
生成集群配置¶
如果您是从 Airflow 1.10.x 升级并且未使用 CLUSTER_CONFIG,则可以使用 airflow.providers.google.cloud.operators.dataproc.ClusterGenerator
的 make() 轻松生成配置
如果您使用的是旧 API 中的 metadata 参数,这将特别有用,有关详细信息,请参阅 AIRFLOW-16911。
例如。 您的集群创建在 v1.10.x 中可能如下所示
path = f"gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh"
create_cluster = DataprocClusterCreateOperator(
task_id="create_dataproc_cluster",
cluster_name="test",
project_id="test",
zone="us-central1-a",
region="us-central1",
master_machine_type="n1-standard-4",
worker_machine_type="n1-standard-4",
num_workers=2,
storage_bucket="test_bucket",
init_actions_uris=[path],
metadata={"PIP_PACKAGES": "pyyaml requests pandas openpyxl"},
)
升级到 v2.x.x 并使用 CLUSTER_CONFIG 后,它将如下所示
path = f"gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh"
CLUSTER_CONFIG = ClusterGenerator(
project_id="test",
zone="us-central1-a",
master_machine_type="n1-standard-4",
worker_machine_type="n1-standard-4",
num_workers=2,
storage_bucket="test",
init_actions_uris=[path],
metadata={"PIP_PACKAGES": "pyyaml requests pandas openpyxl"},
).make()
create_cluster_operator = DataprocClusterCreateOperator(
task_id="create_dataproc_cluster",
cluster_name="test",
project_id="test",
region="us-central1",
cluster_config=CLUSTER_CONFIG,
)
airflow.providers.google.cloud.operators.bigquery.BigQueryGetDatasetTablesOperator
¶
我们更改了 BigQueryGetDatasetTablesOperator
的签名。
之前
def __init__(
dataset_id: str,
dataset_resource: dict,
# ...
): ...
之后
def __init__(
dataset_resource: dict,
dataset_id: Optional[str] = None,
# ...
): ...
amazon
提供程序包中的更改¶
我们努力确保不会有影响最终用户的更改,以及您的 Python 文件,但此版本可能包含需要更改您的配置、DAG 文件或其他集成(例如自定义运算符)的更改。
此处仅描述此提供程序独有的更改。您仍然应该注意对核心(包括核心运算符)所做的更改,因为它们会影响此提供程序的集成行为。
本节描述了已进行的更改,以及如果您使用与 Amazon 服务(包括 Amazon Web Service - AWS)集成的运算符或 hooks,则需要进行的更新。
AWS 组件的迁移¶
如 AIP-21 中所决定,所有 AWS 组件(hooks、运算符、传感器、示例 DAG)将分组在一起。 迁移后的组件保持向后兼容,但从旧模块导入时会引发 DeprecationWarning
。 迁移的组件有:
旧路径 |
新路径 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
n/a |
|
|
|
|
|
|
|
|
|
airflow.providers.amazon.aws.hooks.emr.EmrHook
¶
airflow.providers.amazon.aws.operators.emr_add_steps.EmrAddStepsOperator
¶
airflow.providers.amazon.aws.operators.emr_create_job_flow.EmrCreateJobFlowOperator
¶
airflow.providers.amazon.aws.operators.emr_terminate_job_flow.EmrTerminateJobFlowOperator
¶
在以前的版本中,某些 emr 运算符中的 aws_conn_id 的默认值错误地设置为 's3_default' 而不是 'aws_default'。 这导致 EmrStepSensor 无法找到其相应的 emr 集群。 随着 EmrAddStepsOperator、EmrTerminateJobFlowOperator 和 EmrCreateJobFlowOperator 的新更改,此问题已解决。
airflow.providers.amazon.aws.operators.batch.AwsBatchOperator
¶
AwsBatchOperator
已被重构,提取出一个 AwsBatchClient
(并继承它)。这些更改大多是向后兼容的,并阐明了这些类的公共 API;AwsBatchOperator
上的一些用于轮询作业状态的私有方法已被重新定位和重命名,以便在 AwsBatchClient
上公开新的公共方法 (并通过继承在 AwsBatchOperator
上公开)。AwsBatchOperator
实例上的几个作业属性已重命名;这些属性主要用作私有属性,但它们已在公共 API 中公开,因此任何对它们的使用都需要按如下方式更新
AwsBatchOperator().jobId
->AwsBatchOperator().job_id
AwsBatchOperator().jobName
->AwsBatchOperator().job_name
AwsBatchOperator
获取了一个新选项,用于定义等待作业状态更改的自定义模型。AwsBatchOperator
可以使用新的 waiters
参数(AwsBatchWaiters
的实例),来指定将使用自定义作业 waiters 监视批处理作业。有关详细信息,请参阅最新的 API 文档。
airflow.providers.amazon.aws.sensors.athena.AthenaSensor
¶
将参数 max_retires
替换为 max_retries
以修复拼写错误。
airflow.providers.amazon.aws.hooks.s3.S3Hook
¶
注意:check_for_prefix
的参数顺序已更改。bucket_name
现在是可选的。它会回退到 connection schema
属性。 由于该方法现在在键列表长度 > 1000 时发出多个 API 请求,因此 delete_objects
现在返回 None
而不是响应。
其他 provider 包中的更改¶
我们努力确保不会发生可能影响最终用户及其 Python 文件的更改,但此版本可能包含需要更改配置、DAG 文件或其他集成(例如自定义运算符)的更改。
此处仅描述 provider 特有的更改。您仍应注意对核心(包括核心运算符)所做的更改,因为它们可能会影响此 provider 的集成行为。
本节描述了所做的更改,以及如果您使用 airflow.providers
包中的任何代码,您需要如何进行更新。
更改了 S3Hook
中 list_prefixes
和 list_keys
方法的返回类型¶
以前,当没有结果时,list_prefixes
和 list_keys
方法返回 None
。此行为已更改为在这种情况下返回空列表而不是 None
。
已移除 HipChat 集成¶
HipChat 已达到生命周期终止,不再可用。
airflow.providers.salesforce.hooks.salesforce.SalesforceHook
¶
将参数 sandbox
替换为 domain
。根据 simple-salesforce 包中的更改。
将 sign_in
函数重命名为 get_conn
。
airflow.providers.apache.pinot.hooks.pinot.PinotAdminHook.create_segment
¶
为了与 pylint 兼容,在 PinotAdminHook 函数 create_segment 中,将参数名称从 format
重命名为 segment_format
。
airflow.providers.apache.hive.hooks.hive.HiveMetastoreHook.get_partitions
¶
为了与 pylint 兼容,在 HiveMetastoreHook 函数 get_partitions 中,将参数名称从 filter
重命名为 partition_filter
。
airflow.providers.ftp.hooks.ftp.FTPHook.list_directory
¶
为了与 pylint 兼容,移除 FTPHook 函数 list_directory
中不必要的参数 nlst
。
airflow.providers.postgres.hooks.postgres.PostgresHook.copy_expert
¶
为了与 pylint 兼容,移除 PostgresHook 函数 copy_expert
中不必要的参数 open
。
airflow.providers.opsgenie.operators.opsgenie_alert.OpsgenieAlertOperator
¶
为了与 pylint 兼容,在 OpsgenieAlertOperator 中,将参数名称从 visibleTo
更改为 visible_to
。
airflow.providers.imap.hooks.imap.ImapHook
¶
airflow.providers.imap.sensors.imap_attachment.ImapAttachmentSensor
¶
ImapHook
has_mail_attachment
、retrieve_mail_attachments
和download_mail_attachments
的参数顺序已更改。已为每一个添加了一个新的
mail_filter
参数。
airflow.providers.http.hooks.http.HttpHook
¶
HTTPHook 现在默认是安全的:verify=True
(之前: verify=False
)。这可以通过使用 extra_options 参数作为 {'verify': False}
来覆盖。
airflow.providers.cloudant.hooks.cloudant.CloudantHook
¶
将 cloudant 版本从
>=0.5.9,<2.0
升级到>=2.0
移除了 connection 中
schema
属性的使用移除了
db
函数,因为数据库对象也可以通过调用cloudant_session['database_name']
来检索
例如
from airflow.providers.cloudant.hooks.cloudant import CloudantHook
with CloudantHook().get_conn() as cloudant_session:
database = cloudant_session["database_name"]
有关如何使用新 cloudant 版本的更多信息,请参阅 docs。
airflow.providers.snowflake
¶
初始化 Snowflake hook 或 operator 时,无论您是否指定了 snowflake_conn_id
的值,所使用的值始终为 snowflake_conn_id
。 现在,为了保持一致性,默认的 snowflake_conn_id
值已切换为 snowflake_default
,并且将在指定时被正确覆盖。
其他更改¶
此版本还包括不属于上述任何部分的更改。
标准化 “extra” requirements¶
我们标准化了 Extras 名称,并将 provider 包名称与主 airflow extras 同步。
我们在 2.0 中弃用了一些 extras。
已弃用的 extras |
新的 extras |
---|---|
atlas |
apache.atlas |
aws |
amazon |
azure |
microsoft.azure |
azure_blob_storage |
microsoft.azure |
azure_data_lake |
microsoft.azure |
azure_cosmos |
microsoft.azure |
azure_container_instances |
microsoft.azure |
cassandra |
apache.cassandra |
druid |
apache.druid |
gcp |
|
gcp_api |
|
hdfs |
apache.hdfs |
hive |
apache.hive |
kubernetes |
cncf.kubernetes |
mssql |
microsoft.mssql |
pinot |
apache.pinot |
webhdfs |
apache.webhdfs |
winrm |
apache.winrm |
例如
如果您想安装 Apache Atlas 的集成,请使用 pip install apache-airflow[apache.atlas]
,而不是 pip install apache-airflow[atlas]
。
注意!
如果您想安装 Microsoft Azure 的集成,那么不要使用
pip install 'apache-airflow[azure_blob_storage,azure_data_lake,azure_cosmos,azure_container_instances]'
而应该运行 pip install 'apache-airflow[microsoft.azure]'
如果您想安装 Amazon Web Services 的集成,请执行 pip install 'apache-airflow[aws]'
,而不是 pip install 'apache-airflow[s3,emr]'
已弃用的 extras 将在 3.0 版本中删除。
简化端点 /dag_stats 和 /task_stats 的响应负载¶
端点 /dag_stats
和 /task_stats
的响应有助于 UI 获取关于 DAG 和 Task 的简要统计信息。 之前的格式如下:
{
"example_http_operator": [
{
"state": "success",
"count": 0,
"dag_id": "example_http_operator",
"color": "green"
},
{
"state": "running",
"count": 0,
"dag_id": "example_http_operator",
"color": "lime"
}
]
}
dag_id
在负载中重复出现,这使得响应负载不必要地增大。
现在 dag_id
不会在负载中重复出现,响应格式如下:
{
"example_http_operator": [
{
"state": "success",
"count": 0,
"color": "green"
},
{
"state": "running",
"count": 0,
"color": "lime"
}
]
}