Airflow 1.10.10 包含自 1.10.9 以来的 199 次提交,新增 11 项功能,43 项改进,44 个 bug 修复,以及若干文档变更。

详情:

一些值得注意的新特性(面向用户)包括:

允许用户在 RBAC UI 中选择使用的时区

默认情况下,Web UI 显示的时间为 UTC。可以通过右上角的菜单(点击时钟图标)更改显示的时区。

截图: 允许用户在 RBAC UI 中选择时区

详情:https://airflow.org.cn/docs/1.10.10/timezone.html#web-ui

注意:此功能仅在 RBAC UI(通过在 airflow.cfg[webserver] 区段设置 rbac=True 启用)下可用。

新增对生产环境 Docker 镜像的支持

现在提供全新的生产环境镜像(alpha 质量)供 Airflow 1.10.10 使用。你可以从 Apache Airflow Dockerhub 仓库拉取并开始使用。

有关使用生产镜像的更多信息,请参阅 https://github.com/apache/airflow/blob/master/IMAGES.rst#using-the-images。后续还会更新使用官方 Helm Chart 部署镜像的说明。

要拉取镜像,可运行以下任意命令:

  • docker pull apache/airflow:1.10.10-python2.7
  • docker pull apache/airflow:1.10.10-python3.5
  • docker pull apache/airflow:1.10.10-python3.6
  • docker pull apache/airflow:1.10.10-python3.7
  • docker pull apache/airflow:1.10.10(使用 Python 3.6)

允许从各种 Secrets 后端检索 Airflow 连接和变量

从 Airflow 1.10.10 起,用户可以通过环境变量获取 Airflow 变量。

详情:https://airflow.org.cn/docs/1.10.10/concepts.html#storing-variables-in-environment-variables

引入了 Secrets Backend 的新概念,用于检索 Airflow 连接和变量。

从 Airflow 1.10.10 开始,用户可以使用相同的语法(无需修改 DAG 代码)从 airflow.cfg 中定义的 secret backend 获取连接和变量。如果未定义后端,Airflow 将回退到环境变量,再回退到 Metadata DB。

请查看 https://airflow.org.cn/docs/1.10.10/howto/use-alternative-secrets-backend.html#configuration 了解如何配置 Secrets backend 的细节。

截至 1.10.10,Airflow 支持以下 Secret Backend:

  • Hashicorp Vault
  • GCP Secrets Manager(GCP 秘密管理器)
  • AWS Parameters Store(AWS 参数存储)

详情:https://airflow.org.cn/docs/1.10.10/howto/use-alternative-secrets-backend.html

使用 Hashicorp Vault 作为后端的示例配置

[secrets]
backend = airflow.contrib.secrets.hashicorp_vault.VaultBackend
backend_kwargs = {"url": "http://127.0.0.1:8200", "connections_path": "connections", "variables_path": "variables", "mount_point": "airflow"}

使用 DAG 序列化的无状态 Web 服务器

在启用 DAG 序列化后,Webserver 可以在不访问 DAG 文件的情况下运行。我们已经解决了 1.10.7‑1.10.9 中的两个限制(https://airflow.org.cn/docs/1.10.7/dag-serialization.html#limitations)。

这样做的主要优势是:在拥有大量 DAG 时,可显著减少 Webserver 的启动时间。未使用 DAG 序列化时,所有 DAG 会在 Webserver 启动时一次性加载到 DagBag 中。

使用 DAG 序列化时,会创建空的 DagBag,只有在需要时(例如在主页点击特定 DAG 时)才从数据库加载 DAG。

详情:https://airflow.org.cn/docs/1.10.10/dag-serialization.html

使用 Dummy Operator 的任务不再发送到执行器

Dummy Operator 实际上不执行任何工作,主要用于配合 BranchPythonOperator 对任务进行组织/分组。

以前,在使用 Kubernetes Executor 时,即使是 Dummy 任务也会启动完整的工作节点 pod 来执行。自 Airflow 1.10.10 起,使用 Dummy Operator 的任务仅由 Scheduler 调度与评估,而不会提交给 Executor,这将大幅提升执行速度并降低资源消耗。

在 UI 触发 DAG 时允许传递 DagRun 配置

当通过 CLI 或 REST API 触发 DAG 时,可以将 DAG 运行的配置以 JSON blob 形式传入。

从 Airflow 1.10.10 起,用户点击 “Trigger Dag” 按钮后,会出现一个确认触发请求的页面,并允许用户输入 JSON 配置 blob。

截图: 在 UI 触发 DAG 时允许传递 DagRun 配置

详情:https://github.com/apache/airflow/pull/7312

升级指南

如果你正将 Apache Airflow 从旧版本升级到 1.10.10,请注意以下事项:

  • 在执行 pip install -U apache-airflow==1.10.10 之后运行 airflow upgradedb,因为 1.10.10 包含 3 次数据库迁移。

  • 如果你的 DAG 中使用了 none_failed 触发规则,请改为使用新的 none_failed_or_skipped 触发规则。之前的实现会在所有父任务也被跳过时跳过当前任务,这与文档描述不符。我们已修改实现以匹配文档,如需旧行为请使用 none_failed_or_skipped

    更多细节请参见 https://github.com/apache/airflow/pull/7464

  • 将 Airflow 变量设置为空字符串时,现在会返回空字符串,之前会返回 None

    示例

    >> Variable.set('test_key', '')
    >> Variable.get('test_key')
    

    上述代码以前返回 None,现在将返回空字符串('')。

  • 当用户在 Airflow UI 中将任务标记为 success 时,会调用在 on_success_callback 中定义的函数。

特别说明 / 弃用

Python 2

Python 2 已于 2020 年 1 月正式停止维护。Airflow 主分支已不再支持 Python 2,Airflow 1.10 系列将是最后一个支持 Python 2 的版本。

我们强烈建议用户使用 Python >= 3.6

使用 Airflow RBAC UI

Airflow 1.10.10 附带两个 UI,默认的是基于 Flask‑admin 的非 RBAC UI,另一个是基于 Flask‑AppBuilder(FAB)的 UI。

基于 Flask‑AppBuilder 的 UI 支持基于角色的访问控制(RBAC),并提供比传统 Flask‑admin UI 更丰富的功能。可通过在 airflow.cfg[webserver] 区段将 rbac=True 来启用该 UI。

基于 Flask‑admin 的 UI 已被废弃,新的特性将不再移植到该 UI。该 UI 在 1.10 系列仍为默认 UI,但在 Airflow 2.0 中将不再提供。

在 macOS 上运行 Airflow

在调度器环境中运行 export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES。如果你在 macOS 上运行 Airflow 并在 Scheduler 日志中看到以下错误,请使用该命令。

objc[1873]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called.
objc[1873]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.

该错误是由于 macOS High Sierra 及以上版本对多进程/多线程的安全限制导致的。

我们已迁移到 GitHub Issues

Airflow 项目已从 JIRA 移至 GitHub 用于跟踪问题。

因此,如果在 Airflow 1.10.10 中发现任何 Bug,请在 GitHub 上创建相应的 Issue。

贡献者名单

根据 git shortlog,以下人员为 1.10.10 版本做出了贡献。感谢所有贡献者!

ANiteckiP, Alex Guziel, Alex Lue, Anita Fronczak, Ash Berlin-Taylor, Benji Visser, Bhavika Tekwani, Brad Dettmer, Chris McLennon, Cooper Gillan, Daniel Imberman, Daniel Standish, Felix Uellendall, Jarek Potiuk, Jiajie Zhong, Jithin Sukumar, Kamil Breguła, Kaxil Naik, Kengo Seki, Kris, Kumpan Anton, Lokesh Lal, Louis Guitton, Louis Simoneau, Luyao Yang, Noël Bardelot, Omair Khan, Philipp Großelfinger, Ping Zhang, RasPavel, Ray, Robin Edwards, Ry Walker, Saurabh, Sebastian Brandt, Tomek Kzukowski, Tomek Urbaszek, Van-Duyet Le, Xiaodong Deng, Xinbin Huang, Yu Qian, Zacharya, atrbgithub, cong-zhu, retornam

分享

阅读更多

Apache Airflow 1.10.12

Kaxil Naik

我们很高兴为大家呈现 Apache Airflow 1.10.12

Apache Airflow 1.10.8 & 1.10.9

Kaxil Naik

我们很高兴为大家呈现全新的 1.10.8 与 1.10.9 版本发布。