Data Pipelines with Apache Airflow机翻-1.遇见Apache Airflow
1.遇见Apache Airflow
1.2 介绍Airflow
在本书中,我们重点介绍了 Airflow,它是一个用于开发和监控工作流的开源解决方案。在本节中,我们将提供一个俯视视图,然后我们将进入一个更详细的观测Airflow是否适合您的用例。
1.2.1 在(Python)代码中灵活地定义管道
与其他工作流管理器类似,Airflow 允许您将管道或工作流定义为任务的有向无环图(Directed Acyclic Graphs,简称 DAGs)。这些图与前面部分中的示例非常相似,将任务定义为图中的节点,将依赖关系定义为任务之间的有向边。
在Airflow中,您可以使用DAG文件中的Python代码定义DAG,这些文件本质上是描述相应DAG结构的Python脚本。 这样,每个DAG文件通常描述给定DAG的任务集以及任务之间的依赖关系,然后由Airflow对其进行解析以识别DAG结构(图1.7)。 除此之外,DAG文件通常还包含一些其他有关DAG的元数据,这些元数据告诉Airflow如何以及何时执行该操作等。我们将在下一部分中深入探讨此调度。
图1.7 Airflow 管道被定义为 DAGs (有向无环图) ,在 DAG 文件中使用 Python 代码。每个 DAG 文件通常定义一个 DAG,用于描述不同的任务及其依赖关系。除此之外,有向无环图还定义了一个调度间隔,用于决定何时通过Airflow执行有向无环图。
在 Python 代码中定义 airflow dags 的一个优点是,这种编程方法为构建 DAGs 提供了很大的灵活性。例如,正如我们将在本书后面看到的,您可以使用 Python 代码根据特定条件动态生成可选任务,甚至可以根据外部元数据或配置文件生成整个 DAGs。这种灵活性允许您在构建管道的方式上进行大量自定义-使Airflow适应构建任意复杂管道的需求。
除了这种灵活性之外,Airflow的Python基础的另一个优点是任务可以执行您可以在Python中实现的任何操作。 随着时间的流逝,这导致了许多Airflow扩展的发展,这些扩展使您可以跨各种系统执行任务,包括外部数据库,大数据技术和各种云服务; 允许您建立复杂的数据管道以将数据汇总在一起。
1.2.2 调度和执行管道
在将管道的结构定义为DAG之后,Airflow允许您为每个DAG定义一个计划间隔,该间隔确定由Airflow确切地运行管道的时间。这样,您可以告诉Airflow每小时,每天,每周等执行您的DAG,或者甚至基于类似cron的表达式使用更复杂的计划间隔。
要了解Airflow如何执行您的DAG,让我们简要了解开发和运行Airflow DAG涉及的整个过程。 从高层次上讲,Airflow分为三个主要组成部分(图1.8):
- Airflow scheduler--解析DAG,检查其调度间隔,并(如果DAG的调度已通过)(通过将DAG的任务传递给Airflow工作人员)开始调度要执行的任务。
- Airflow workers--负责接收计划执行的任务并执行它们。因此,工人实际上有责任‘做工作’。
- Airflow webserver--可视化调度程序解析的DAG,并为用户提供监视DAG运行及其结果的主要界面
图1.8 Airflow涉及的主要组件概述(例如Airflow Web服务器,调度程序和工作程序)
Airflow的核心可以说是调度程序,因为这是大多数魔术发生的地方,它决定了何时以及如何执行管道。 总体而言,调度程序执行以下步骤(图1.9):
- 一旦用户将其工作流程编写为DAG,调度程序将读取包含这些DAG的文件,以提取每个DAG的相应任务,依赖关系和调度间隔。
- 对于每个DAG,调度程序然后检查自上次读取DAG以来的调度间隔是否已经过去。 如果是这样,则将安排DAG中的任务执行。
- 对于每个计划任务,调度程序检查任务的依赖关系(= 上游任务)是否已经完成。如果是这样,任务将被添加到执行队列中。
- 调度程序会等待几秒钟,然后通过跳回到步骤1来开始新的循环。
精明的读者可能已经注意到,调度程序所遵循的步骤实际上与1.1节中介绍的算法非常相似。 这并非偶然,因为Airflow基本上遵循相同的步骤,在顶部添加了一些额外的逻辑来处理其调度逻辑。
图1.9使用Airflow开发和执行作为DAG的管道所涉及的过程的示意图
一旦任务被排队等待执行,将将由一组Airflow workers接收,并行执行任务并跟踪其结果。这些结果将通过Airflow的metastore进行通信,以便用户可以使用Airflow网络界面(由Airflow网络服务器提供)跟踪任务的进度并查看其日志。
1.2.3 监视和处理故障
除了调度和执行DAG,Airflow还提供了一个广泛的Web界面(图1.10),可用于查看DAG并监视DAG运行的结果。
图1.10 Airflow Web界面的主页,其中显示了所有DAG及其当前状态的详细概述。
例如,单个DAG的图形视图提供了DAG任务和依赖关系的清晰概述(图1.11),类似于我们在本章中绘制的示意图概述。 该视图对于查看DAG的结构(提供对任务之间的依赖关系的详细了解)以及查看单个DAG运行的结果特别有用。
图1.11 Airflow网页界面中的图表视图,显示了单个DAG中的任务以及这些任务之间的依赖关系的概述
除了此图形视图之外,Airflow还提供了详细的“树”视图,该视图显示了相应DAG的所有运行和历史运行(图1.12)。 可以说,这是Web界面提供的最强大的视图,因为它可以使您快速了解DAG随时间的执行情况,并允许您深入研究失败的任务以查看出了什么问题。
图1.12 Airflow 的树形视图,显示了 DAG 销售模型多次运行的结果(最近的 + 历史运行)。这些列显示 DAG 的一次执行的状态,行显示单个任务的所有执行的状态。颜色表示相应任务的结果。用户还可以点击任务“ squares”获取给定任务实例的更多详细信息,或者重置任务的状态,以便任务可以在需要时由 airflow 重新运行。
默认情况下,Airflow可以通过重试几次任务来处理任务中的失败(可选地,在两次尝试之间有一些等待时间),这可以帮助任务从任何间歇性失败中恢复。 如果重试无济于事,Airflow会将任务记录为失败,如果配置为失败,则可以选择通知您有关失败的信息。 调试任务失败非常简单,因为树视图允许您查看失败的任务并挖掘其日志。 同一视图还允许您清除各个任务的结果以重新运行它们(以及依赖于该任务的所有任务),从而使您可以在更改其代码后轻松地重新运行任何任务。
1.2.4 增量加载和回填
Airflow调度语义的一项强大功能是,调度间隔不仅会在特定时间点(类似于Cron)触发DAG,而且还会提供有关上一个和(预期)下一个调度间隔的详细信息。 这实际上使您可以将时间划分为离散的时间间隔(例如,每天,每周等),并针对每个时间间隔运行DAG。
Airflow的计划间隔属性对于实现高效的数据管道非常有用,因为它允许您构建增量数据管道。 在这些增量管道中,每个DAG运行仅处理相应时隙的数据,而不必每次都重新处理整个数据集。 尤其是对于较大的数据集,这可以通过避免对现有结果进行昂贵的重新计算而提供大量的时间和成本优势。
与“回填”概念结合使用时,计划间隔会变得更加强大,这使您可以针对过去已经发生的“历史”计划间隔执行新的DAG。 通过此功能,您只需为这些“过去”计划时间间隔运行DAG,即可轻松地使用历史数据轻松创建(或“回填”)新数据集。 此外,通过清除过去运行的结果,如果更改了任务代码,您还可以使用此Airflow 功能轻松地重新运行任何历史任务,从而可以在需要时轻松地重新处理整个数据集。
1.3 何时使用Airflow
在对Airflow进行了简要介绍之后,我们希望您对了解Airflow并充分了解其主要功能充满热情。 但是,在进行进一步介绍之前,我们将首先探讨您可能要选择使用Airflow的几个原因(以及您可能不想使用Airflow的几个原因),以确保Airflow确实是最适合您的。
1.3.1 选择Airflow的原因
在上一节中,我们已经描述了几个关键功能,这些功能使Airflow非常适合实现面向批处理的数据管道。 总之,这些包括:
- 使用Python代码实现管道的能力允许您使用Python中可以想象的任何东西创建任意复杂的管道。
- Airflow的Python基础使扩展和添加与许多不同系统的集成变得容易。 实际上,Airflow社区已经开发了丰富的扩展集合,这些扩展允许Airflow与许多不同类型的数据库,云服务等集成。
- 丰富的调度语义使您可以定期运行管道,并构建高效的管道,这些管道使用增量处理来避免对现有结果进行昂贵的重新计算。
- 回填之类的功能使您可以轻松地(重新)处理历史数据,从而使您可以在更改代码后重新计算任何派生的数据集。
- Airflow丰富的Web界面为查看管道运行结果和调试可能发生的任何故障提供了简便的视图。
除了这些功能之外,Airflow的另一个优点是它是开源的,可以确保您可以在Airflow上进行工作,而不会陷入任何供应商锁定的局面。多家公司也提供托管的Airflow解决方案(您需要一些技术支持) ),为您在运行和管理Airflow安装方面提供了很大的灵活性。
1.3.2 不选择Airflow的原因
尽管Airflow具有许多丰富的功能,但是Airflow的几种设计选择可能使其不适用于某些情况。 例如,某些不适合Airflow的用例包括:
- 处理流式处理管道,因为Airflow主要设计用于运行周期性或面向批处理的任务,而不是流式处理工作负载。
- 实施高度动态的管道,其中在每个管道运行之间添加/删除任务。 尽管Airflow可以实现这种动态行为,但Web界面将仅显示仍在最新版本的DAG中定义的任务。 因此,Airflow倾向于每次运行时结构都不会改变的管道。
- 具有很少或没有(Python)编程经验的团队,因为在Python中实现DAG可能会使很少的Python经验令人生畏。 在这样的团队中,将工作流管理器与图形界面(例如Azure Data Factory)或静态工作流定义一起使用可能更有意义。
- 同样,对于较大的用例,DAG中的Python代码可能很快变得复杂。 因此,实施和维护Airflow DAG要求适当的工程严格性,以使事情在长期内可维护。
最后,Airflow主要是一个工作流/管道管理平台,并且(当前)不包括更广泛的功能,例如维护数据沿袭,数据版本控制等。如果您需要这些功能,则可能需要考虑将Airflow与其他专业功能相结合 提供这些功能的工具。
1.4 这本书的其余部分
到目前为止,您应该(希望)对Airflow是什么以及它的功能如何有一个很好的了解,可以帮助您实现和运行数据管道。
在本书的其余部分,我们将首先介绍您需要熟悉的Airflow基本组件,以开始构建自己的数据管道。 前几章应广泛适用,并应吸引广大读者。 对于这些章节,我们希望您具有Python编程的中级经验(约1年经验),这意味着您应该熟悉基本概念,例如字符串格式,理解,args / kwargs等。除此之外,您还应该 熟悉Linux终端的基础知识,并具有数据库(包括SQL)和不同数据格式的基本工作知识。
在介绍之后,我们将更深入地研究Airflow的更高级功能,例如生成动态DAG,实现自己的操作员,运行容器化任务等。这些章节将需要对所涉及的技术有更多的了解,包括编写自己的Python类 ,基本的Docker概念,文件格式,数据分区等。我们希望第二部分对听众中的数据工程师特别感兴趣。
最后,本书结尾的几章重点介绍有关Airflow部署的主题,包括部署模式,监视,安全性,云体系结构等。我们希望这些章节对有兴趣推出和管理Airflow的人们特别感兴趣。 部署,例如系统管理员和DevOps工程师。
1.5 摘要
- 数据管道可以表示为有向无环图(Directed Acyclic Graphs,DAGs) ,它清楚地定义了任务及其依赖关系。可以利用依赖结构中固有的任何并行性,有效地执行这些图。
- 尽管多年来已经开发出许多工作流管理器来执行任务图,但是Airflow具有几个关键功能,这使其特别适合于实现高效的面向批处理的数据管道。
- Airflow由三个核心组件组成:Web服务器,调度程序和工作程序; 它们可以一起从数据管道计划任务,并帮助您监视其结果。