Airflow DAG 和最佳实践简介

2022-10-04 15:06:46 浏览数 (1)

由于组织越来越依赖数据,因此数据管道(Data Pipeline)正在成为其日常运营的一个组成部分。随着时间的推移,各种业务活动中使用的数据量急剧增长,从每天兆字节到每分钟千兆字节。

尽管处理这种数据泛滥似乎是一项重大挑战,但这些不断增长的数据量可以通过正确的设备进行管理。本文向我们介绍了 Airflow DAG 及其最佳实践。

当 Airbnb 在 2014 年遇到类似问题时,其工程师开发了 Airflow——一个工作流管理平台,允许他们使用内置界面编写和安排以及监控工作流。Apache Airflow 利用工作流作为 DAG(有向无环图)来构建数据管道。 Airflow DAG 是一组任务,其组织方式反映了它们的关系和依赖关系。本指南将全面了解 Airflow DAG、其架构以及编写 Airflow DAG 的最佳实践。继续阅读以了解更多信息。

什么是Airflow?

Apache Airflow是一个为数据编排开发的开源分布式工作流管理平台。Airflow 项目最初由Airbnb的 Maxime Beauchemin 发起。 随着项目的成功,Apache 软件基金会迅速采用了 Airflow 项目,首先在 2016 年作为孵化器项目,然后在 2019 年作为顶级项目。Airflow 为用户提供了以编程方式编写、调度和监控数据管道的功能。Airflow 的关键特性是它使用户能够使用灵活的 Python 框架轻松构建预定的数据管道。

Airflow DAG 简介

需要了解以下方面才能清楚地了解 Airflow DAG 的实际含义。

  • 将数据管道定义为图形
  • 定义有向图的类型
  • 定义 DAG

将数据管道定义为图形

不断增加的数据量需要数据管道来处理数据存储、分析、可视化等。数据管道是所有必要步骤的集合,它们共同负责某个过程。Apache Airflow 是一个允许用户开发和监控批处理数据管道的平台。 例如,一个基本的数据管道由两个任务组成,每个任务执行自己的功能。但是,在经过转换之前,新数据不能在管道之间推送。

在基于图的表示中,任务表示为节点,而有向边表示任务之间的依赖关系。边的方向代表依赖关系。例如,从任务 1 指向任务 2(上图)的边意味着任务 1 必须在任务 2 开始之前完成。该图称为有向图。

定义有向图的类型

有向图有两种类型:循环图和非循环图。

在循环图中,循环由于循环依赖关系而阻止任务执行。由于任务 2 和任务 3 相互依赖,没有明确的执行路径。

在无环图中,有一条清晰的路径可以执行三个不同的任务。

定义 DAG

在 Apache Airflow 中,DAG 代表有向无环图。DAG 是一组任务,其组织方式反映了它们的关系和依赖关系。这种 DAG 模型的优点之一是它提供了一种相当简单的技术来执行管道。另一个优点是它清楚地将管道划分为离散的增量任务,而不是依赖单个单体脚本来执行所有工作。

非循环特性特别重要,因为它很简单,可以防止任务陷入循环依赖中。Airflow 利用 DAG 的非循环特性来有效地解析和执行这些任务图。

Airflow架构

Apache Airflow 允许用户为每个 DAG 设置计划的时间间隔,这决定了 Airflow 何时运行管道。

Airflow包含4个主要部分:

  • Webserver:将调度程序解析的 Airflow DAG 可视化,并为用户提供监控 DAG 运行及其结果的主界面。
  • Scheduler:解析 Airflow DAG,验证它们的计划间隔,并通过将 DAG 任务传递给 Airflow Worker 来开始调度执行。
  • Worker:提取计划执行的任务并执行它们。
  • 数据库:您必须向 Airflow 提供的一项单独服务,用于存储来自 Web 服务器和调度程序的元数据。

Airflow DAG 最佳实践

按照下面提到的做法在您的系统中实施 Airflow DAG。

  • 编写干净的 DAG
  • 设计可重现的任务
  • 有效处理数据
  • 管理资源

编写干净的 DAG

在创建 Airflow DAG 时很容易陷入困境。例如,DAG 代码可能很容易变得不必要地复杂或难以理解,尤其是当 DAG 是由具有非常不同编程风格的团队成员制作时。

  • 使用样式约定:采用统一、干净的编程样式并将其一致地应用于所有 Airflow DAG 是构建干净且一致的 DAG 的第一步。在编写代码时,使其更清晰、更易于理解的最简单方法是使用常用的样式。
  • 集中管理凭证:Airflow DAG 与许多不同的系统交互,产生许多不同类型的凭证,例如数据库、云存储等。幸运的是,从 Airflow 连接存储中检索连接数据可以很容易地保留自定义代码的凭据。
  • 使用任务组对相关任务进行分组:由于所需任务的数量庞大,复杂的 Airflow DAG 可能难以理解。Airflow 2 的新功能称为任务组有助于管理这些复杂的系统。任务组有效地将任务分成更小的组,使 DAG 结构更易于管理和理解。

设计可重现的任务

除了开发出色的 DAG 代码之外,编写成功的 DAG 最困难的方面之一是使您的任务具有可重复性。这意味着即使任务在不同时间执行,用户也可以简单地重新运行任务并获得相同的结果。

  • 始终要求任务是幂等的:幂等性是良好 Airflow 任务的最重要特征之一。不管你执行多少次幂等任务,结果总是一样的。幂等性保证了面对失败时的一致性和弹性。
  • 任务结果应该是确定性的:要构建可重现的任务和 DAG,它们必须是确定性的。对于任何给定的输入,确定性任务应始终返回相同的输出。
  • 使用函数式编程范式设计任务:使用函数式编程范式设计任务更容易。函数式编程是一种构建计算机程序的方法,该程序主要将计算视为数学函数的应用,同时避免使用可变数据和可变状态。

有效处理数据

处理大量数据的气流 DAG 应该尽可能高效地进行精心设计。

  • 限制正在处理的数据:将数据处理限制为获得预期结果所需的最少数据是管理数据的最有效方法。这需要彻底考虑数据源并评估它们是否都是必要的。
  • 增量处理:增量处理背后的主要思想是将数据划分为(基于时间的)部分,并分别处理每个 DAG 运行。用户可以通过在过程的增量阶段执行过滤/聚合过程并对减少的输出进行大规模分析来获得增量处理的好处。
  • 避免将数据存储在本地文件系统上:在 Airflow 中处理数据有时可能很容易将数据写入本地系统。因此,下游任务可能无法访问它们,因为 Airflow 会并行运行多个任务。防止此问题的最简单方法是利用所有 Airflow 工作人员都可以访问的共享存储来同时执行任务。

管理资源

在处理大量数据时,它可能会使 Airflow Cluster 负担过重。因此,适当管理资源有助于减轻这种负担。

  • 使用池管理并发:当并行执行许多进程时,许多任务可能需要访问同一资源。Airflow 使用资源池来控制有多少任务可以访问给定的资源。每个池都有一定数量的插槽,这些插槽提供对相关资源的访问。
  • 使用 SLA 和警报检测长时间运行的任务:Airflow 的 SLA(服务级别协议)机制允许用户跟踪作业的执行情况。使用这种机制,用户可以有效地为 DAG 指定 SLA 超时,即使其中一个 DAG 任务花费的时间超过指定的 SLA 超时,Airflow 也会提醒他们。

结论

这篇博客告诉我们,Apache Airflow 中的工作流被表示为 DAG,它清楚地定义了任务及其依赖关系。同样,我们还在编写 Airflow DAG 时了解了一些最佳实践。

0 人点赞