Apache Airflow 部署与生产

2025 年 6 月 8 日 | 9 分钟阅读

引言

Apache Airflow 是一个开源平台,允许用户以编程方式编写、调度和监控工作流。它在编排复杂数据管道和工作流方面越来越受欢迎,尤其是在数据工程、机器学习DevOps环境中。

用于 Airflow 的 Docker Compose

要使用 Docker 部署 Airflow,通常会使用 Docker Compose,它是一个用于定义和管理多容器 Docker 应用程序的工具。Docker Compose 通过允许用户在一个 YAML 文件中定义整个应用程序堆栈,简化了 Airflow 组件(包括 Web 服务器、调度器和数据库)的部署。

在典型的 Airflow Docker Compose 设置中,会定义几个服务:

  • Web 服务器: 用户可以与之交互的 Airflow UI。
  • 调度器: 调度和触发 DAG 的组件。
  • PostgreSQL 数据库: Airflow 使用关系数据库来存储元数据,例如 DAG 定义、任务状态和日志。
  • Redis: 用于在分布式环境中 Web 服务器和调度器之间的通信。

设置 Airflow 的 Docker 步骤

以下是使用 Docker 部署 Apache Airflow 的关键步骤:

步骤 1:安装 Docker 和 Docker Compose

确保您的系统上已安装 Docker 和 Docker Compose。您可以遵循官方安装指南。

  • Docker 安装指南
  • Docker Compose 安装指南

步骤 2:创建 Docker Compose 文件

创建一个 docker-compose.yml 文件来定义 Airflow 服务。以下是一个部署 Airflow 的示例 Docker Compose 文件:

步骤 3:初始化 Airflow 数据库

在启动服务之前,您需要初始化 Airflow 数据库。运行以下命令:

步骤 4:启动服务

现在,运行以下命令启动 Airflow 服务:

这将启动 Web 服务器、调度器和其他必需组件。一切就绪后,您可以访问 https://:8080 上的 Airflow Web UI。

为什么使用 Kubernetes 进行 Apache Airflow 部署

Kubernetes 是一个开源平台,可自动化容器化应用程序的部署、扩展和管理。Kubernetes 为运行 Apache Airflow 等分布式应用程序提供了高度可扩展且有弹性的环境。

将 Kubernetes 用于 Airflow 部署的一些优点包括:

  • 可扩展性: Kubernetes 允许您根据资源需求扩展 Airflow 组件,例如 Web 服务器、调度器和工作器。
  • 高可用性: Kubernetes 确保始终运行所需数量的每个组件副本,从而提供容错能力并减少停机时间。
  • 资源管理: Kubernetes 可以根据使用模式动态地将资源(CPU、内存)分配给 Airflow 组件,从而优化资源消耗。

基于 Kubernetes 的 Apache Airflow 部署

Airflow 的 Kubernetes Operator

要在 Kubernetes 上部署 Apache Airflow,**Kubernetes Executor** 是一个流行的选项。此执行器在单独的 Kubernetes Pod 中运行每个任务,从而实现更好的隔离和可扩展性。Kubernetes 还提供 **Kubernetes PodOperator**,允许任务在具有自定义配置的特定运行 Pod 中执行。

设置 Airflow 的 Kubernetes 步骤

要在 Kubernetes 上部署 Apache Airflow,请遵循以下步骤:

步骤 1:设置 Kubernetes 集群

您需要有一个正在运行的 Kubernetes 集群。您可以使用 **Minikube** 或 **Kind** 等工具在本地集群,或者使用 Google Kubernetes Engine (GKE)、Amazon EKS 或 Azure AKS 等云提供商。

步骤 2:安装 Helm

Helm 是 Kubernetes 的包管理器,它简化了 Airflow 的部署过程。请遵循官方 Helm 文档安装 Helm。

步骤 3:添加 Airflow Helm Chart 仓库

Apache Airflow 拥有官方的 Helm Chart 仓库。将其添加到您的 Helm 配置中:

步骤 4:使用 Helm 部署 Airflow

使用 Helm 安装 Airflow:

这将会在您的 Kubernetes 集群上部署 Airflow。部署完成后,您可以通过端口转发访问 Airflow Web UI:

现在您可以通过 https://:8080 访问 Airflow Web UI。

比较 Airflow 的 Docker 与 Kubernetes 部署

Docker 和 Kubernetes 都提供了部署 Apache Airflow 的强大方法,但需要考虑一些关键区别:

  • 易用性: Docker Compose 设置更简单,非常适合小型或本地部署,而 Kubernetes 更复杂,需要管理机器集群。
  • 可扩展性: Kubernetes 在应用程序扩展方面表现出色,因此更适合需要处理大量工作流的生产环境。
  • 容错性: Kubernetes 提供更好的容错能力并确保高可用性,而 Docker Compose 更依赖于单台机器,可能需要手动干预才能进行故障恢复。
  • 资源管理: Kubernetes 提供高级资源管理,这对于优化大型 Airflow 部署的性能很有帮助。

Airflow CI/CD 管道

持续集成 (CI) 和持续部署 (CD) 管道自动化了将代码更改集成并部署到生产环境的过程。对于使用 **Apache Airflow** 的团队来说,CI/CD 管道对于管理有向无环图 (DAG) 的演进至关重要,可确保工作流的更改经过系统性测试并部署。

为什么 Airflow 需要 CI/CD?

  • 一致性和可靠性: CI/CD 管道确保 Airflow DAG 能够针对错误进行持续测试,并在暂存或生产环境中得到充分部署。
  • 自动化: 可以自动化运行测试、代码检查和部署代码等重复性任务,从而节省时间并减少人为错误。
  • 版本控制: 通过将 Airflow DAG 与 Git 等版本控制系统集成,团队可以管理更改、跟踪版本并在必要时回滚。
  • 协作: CI/CD 管道为多个开发人员提供了一个结构化的环境,让他们可以在不向生产工作流引入 bug 或问题的情况下协作处理 DAG。

设置 Airflow DAG 的 CI/CD 管道

使用 Git 进行版本控制

任何 CI/CD 管道的基础都是版本控制系统,而对于 Airflow,Git 是常用的。DAG 应存储在 Git 仓库中,允许开发人员对工作流进行版本控制和管理更改。

  • 设置 Git 仓库(GitHub、GitLab、Bitbucket 等)来存储您的 Airflow DAG。
  • 使用 Git 分支来开发和测试 DAG。例如,主分支可用于生产级 DAG,而开发分支用于测试新功能。
  • 定期提交对 DAG 的更改,遵循提交消息和分支策略的最佳实践。

DAG 的持续集成

持续集成 (CI) 侧重于在每次更改代码时自动构建和测试代码。对于 Airflow DAG,CI 可确保工作流中的任何更改(例如新的任务依赖项或代码更新)都不会破坏工作流或导致问题。

Airflow DAG 的 CI 步骤

  • 代码检查和格式化: 可以使用 flake8 或 black 等工具来确保 DAG 符合 Python 编码标准。
  • 单元测试: 为您的 DAG 编写单元测试,以确保它们按预期工作。这可以包括测试单个任务、验证连接和模拟失败。
    • 使用 pytest 或 unittest 等库进行测试。
    • 对于具有复杂逻辑的 DAG,测试任务依赖项和执行顺序。
    • 语法验证: 确保 DAG 文件在语法上是正确的。Apache Airflow 有一个内置命令(airflow dags list)来列出所有 DAG,可用于检查代码中的语法问题。

以下是一个使用 GitHub Actions 测试 Airflow DAG 的简单 CI 管道示例:

DAG 的持续部署

一旦您的 DAG 通过 CI 检查,就可以自动将其部署到暂存或生产 Airflow 环境。持续部署 (CD) 确保新更改始终可用于生产执行,只需最少的手动干预。

Airflow DAG 的 CD 步骤

  • Docker 部署: 使用 Docker 将您的 Airflow DAG 容器化并部署到您的 Airflow 环境。如果您正在使用 Kubernetes,则可以使用 Helm Charts 或 Kubernetes Operator 部署 Airflow DAG。
  • Airflow 调度器: 将 DAG 文件推送到正确位置后,Airflow 调度器将自动拾取新的 DAG 并执行它们。
  • 回滚: 如果部署失败,您可以使用 Git 标签或快照自动执行回滚,以恢复到稳定版本。

自动化测试和验证

Airflow DAG 的测试和验证应在 CI/CD 管道中自动化,以确保任何更改在到达生产环境之前都经过适当的审查。常见做法包括:

  • 单元测试: 测试单个任务和 DAG 结构。
  • 集成测试: 测试整个工作流,包括任务依赖项和故障场景。
  • 端到端测试: 验证 DAG 是否端到端地执行预期任务,例如数据提取、转换和加载。

自动化测试可确保 DAG 保持稳定,并且更改不会在生产中引起意外问题。

处理敏感信息

Airflow DAG 通常需要 API 密钥、数据库凭据和其他敏感信息。安全地管理这些敏感信息对于防止未经授权的访问至关重要。

使用环境变量

在 Airflow 中处理敏感信息的最简单方法之一是使用环境变量。这允许在运行时将敏感数据注入到 Airflow 工作器和 Web 服务器中,而无需将其硬编码到 DAG 文件中。

关键步骤

  • 定义环境变量: 在 Airflow 运行的主机、Kubernetes Pod 或 Docker 容器上设置环境变量。
  • 在 DAG 中访问: 在 DAG 中,使用 Python 的 `os.environ` 方法访问环境变量:

环境变量是小型部署的不错选择,但随着敏感信息的数量增加,管理起来可能会变得更具挑战性。

与 HashiCorp Vault 集成

为了更强大、更安全的敏感信息管理,将 **HashiCorp Vault** 与 Airflow 集成是一种广泛使用的方法。Vault 允许您安全地存储和访问敏感信息,加密敏感数据并管理访问控制。

  1. 设置 Vault: 部署 HashiCorp Vault(本地或云端),并将其配置为存储您的敏感信息。
  2. 配置 Airflow 以访问 Vault: 安装必要的 Airflow 提供程序以与 Vault 集成,例如 hashicorp 提供程序。
  3. 访问敏感信息: 在 DAG 中,使用 Airflow Secrets Backend 功能从 Vault 获取敏感信息:

Vault 提供比环境变量更好的安全性,并且对于需要集中管理敏感信息的更大、更复杂的环境来说是可扩展的。

升级和迁移 Apache Airflow

Airflow 发展迅速,有效管理升级和迁移对于维护稳定的生产环境至关重要。

处理 Airflow 升级

升级 Airflow 需要仔细规划,尤其是在生产环境中,因为它涉及到 Airflow 核心和数据库模式的更改。

  • 检查兼容性: 升级前,请查看 Airflow 发行说明,确保您的 DAG、插件和提供程序版本与新版本兼容。
  • 备份数据: 在执行升级之前,务必备份您的 Airflow 元数据数据库。
  • 使用 Docker 镜像: 如果您使用 Docker,可以通过拉取最新稳定镜像版本并重新部署容器来升级 Airflow。
  • 在暂存环境中测试: 在生产环境中升级之前,请在暂存环境中测试新版本以及您的工作流,以确保一切正常。

数据库迁移

Airflow 使用元数据数据库(例如 PostgreSQL、MySQL)来存储 DAG 和任务执行元数据。升级 Airflow 可能需要运行数据库迁移以确保与新版本的兼容性。

要执行迁移:

此命令将更新模式并将您的元数据数据库迁移到新版本。

处理兼容性问题

Airflow 升级可能会引入破坏性更改,从而影响您的 DAG、Operator 或插件。至关重要的是:

  • 查看发行说明和破坏性更改。
  • 在升级到生产环境之前,在新版本上测试您的 DAG 和插件。
  • 制定回滚策略,以防出现任何问题。

CI/CD、敏感信息管理和升级

  • 自动化一切: 从代码检查、测试到部署和回滚,自动化可最大限度地减少人为错误并加快发布周期。
  • 版本控制: 始终使用 Git 进行版本控制,以跟踪对 DAG 和其他 Airflow 组件的更改。
  • 敏感信息管理: 使用 Vault 或环境变量等工具安全地管理敏感信息。避免在 DAG 中硬编码敏感信息。
  • 全面测试: 确保为您的所有工作流自动化单元测试、集成测试和端到端测试。
  • 规划升级: 在升级生产环境之前,始终在暂存环境中测试新版本的 Airflow。