Data Engineering
如何在 Apache Airflow 中设计更好的 DAG
设计工作流程时需要了解的两个最重要的属性
上周,我们学习了如何快速启动 Apache Airflow 的开发环境。[0]
This is awesome!
然而,我们还没有学会如何设计一个高效的工作流程。仅仅拥有一个触手可及的好工具并不能单独达成交易——不幸的是。
尽管 Apache Airflow 为我们完成了大部分繁重的工作,但我们仍然需要确保每个 Airflow 任务的某些关键属性,以获得正确且一致的结果。
幸运的是,存在许多最佳实践。
今天,我们从普遍适用于所有工作流程的两个最重要的概念开始。
今天,我们学习原子性和幂等性。
全有或全无:原子性
原子性通常用于数据库系统的上下文中,是 ACID 属性之一,被认为是不可分割、不可约的一系列操作,因此要么全部发生,要么根本不发生¹。它要么完全执行,要么根本不执行²。[0]
就 Apache Airflow 而言,这意味着任务的定义方式应允许在不影响系统状态的情况下以适当的结果成功或完全失败。
假设我们必须从 CSV 文件中提取数据,对其应用一些转换,然后将结果写入数据库。
Simple enough, right?
以下是一种糟糕的非原子方法。
我们逐行提取数据,立即应用转换,并将结果立即上传到数据库。都在同一个任务中。
现在,如果某些行损坏并且任务中途失败,我们只剩下所需结果的一小部分。有些行已处理并已插入——有些根本不存在。在避免重复的同时调试和重新运行此任务将是一场噩梦。
可以像这样定义改进的原子工作流。
所以要记住的一般经验法则是将操作分成不同的任务。一项操作等于一项任务——想想单一职责原则。[0]
不幸的是,这个简单的规则不能每次都适用。
有些操作是如此紧密耦合,最好将它们放在一个连贯的工作单元中。例如,在执行请求之前对 API 进行身份验证。
对我们来说幸运的是,大多数 Airflow 操作符都是以原子方式设计的,可以直接使用。然而,对于更灵活的运算符类型,如 Bash 或 Python 运算符,我们在设计工作流程时必须更加谨慎和注意。
创建原子 Airflow 任务允许从失败中恢复并仅重新运行失败的下游任务。原子性提供了更易于维护和透明的工作流程,没有隐藏的依赖关系和副作用。
开始、停止、倒带:幂等性
幂等性的概念与原子性的概念密切相关,并描述了数学和计算机科学中某些操作的属性。因此,可以多次应用这些操作,而不会改变初始应用之外的结果³。
将按下控制面板上的“开启按钮”视为一种操作。多次按下此按钮与仅按下一次的效果相同。
那么这在 Apache Airflow 的上下文中意味着什么?
使用相同的输入多次调用相同的任务没有额外的效果。换句话说,如果在不改变输入的情况下重新运行任务会产生相同的输出,则可以认为它是幂等的。
幂等性可以减少故障恢复时间并减少数据丢失。
现在,假设我们的工作是从数据库中获取特定日期的数据并将结果写入 CSV 文件。在同一天重新运行此任务应覆盖现有文件并在每次执行时产生相同的输出。
假设,我们以不同的方式设计我们的任务,每次重新运行时,我们只需将记录附加到现有文件中。
现在,我们违反了幂等性的概念。任务的每次重新运行都会产生不同的结果,并带有重复的记录。
一般来说,写入的任务应该检查现有记录、覆盖或使用 UPSERT 操作以符合幂等性规则。
然而,对于更一般的应用,我们必须仔细考虑所有可能的副作用。
Conclusion:
在本文中,我们介绍了在 Apache Airflow 中设计 DAG 时最重要的两个原则:原子性和幂等性。
将这些概念记入内存使我们能够创建更好的工作流程,这些工作流程可恢复、可重新运行、容错、一致、可维护、透明且更易于理解。
但是,在编码和创建下一个工作流程时,还有更多的最佳实践需要遵守和考虑。[0]
但这是另一天的话题……
喜欢这篇文章吗?成为 Medium 会员并继续无限制地学习。如果您使用以下链接,我将收到您的一部分会员费,您无需支付额外费用。[0]
References / Further Material:
- [1] https://en.wikipedia.org/wiki/Atomicity_(database_systems)[0]
- [2] https://www.webopedia.com/definitions/atomic-operation/[0]
- [3] https://en.wikipedia.org/wiki/Idempotence[0]
- https://en.wikipedia.org/wiki/ACID[0]
- https://en.wikipedia.org/wiki/Single-responsibility_principle[0]
- https://www.astronomer.io/guides/dag-best-practices/[0]
- 巴斯哈伦斯拉克,朱利安德鲁特。使用 Apache Airflow 的数据管道。纽约:曼宁,2021 年。
文章出处登录后可见!