亚马逊AWS官方博客

使用 Apache Airflow、Genie 和 Amazon EMR 编排大数据工作流:第 1 部分

在 AWS 上运行大数据 ETL 工作流的大型企业的运营规模很大,从而为很多内部终端用户提供服务,并且同时运行数千个管道。再加上需要持续更新和扩展大数据平台以第一时间掌握新框架和最新版本的大数据处理框架,这便需要高效的架构和组织结构,既能简化大数据平台的管理,又能方便对大数据应用进行访问。此博文介绍了可帮助集中平台团队维护大数据平台以同时服务数千个 ETL 工作流的架构,并且简化了实现该目的所需的操作任务。

架构组成

从高层次来看,该架构将两个开源技术与 Amazon EMR 结合使用,以提供大数据平台进行 ETL 工作流编写、编排和执行。Genie 提供集中的 REST API 进行并行大数据作业提交、动态作业路由、集中配置管理和 Amazon EMR 集群的抽象。Apache Airflow 提供作业编排平台,以便您能够以编程方式编写、调度和监控复杂的数据管道。Amazon EMR 提供托管型集群平台,该平台可以运行和扩展 Apache Hadoop、Apache Spark 和其他大数据框架。

下图展示了此架构。

Apache Airflow

Apache Airflow 是一种开源工具,可用于编写和编排大数据工作流。

使用 Apache Airflow,数据工程师可以定义有向无环图 (DAG)。DAG 描述了如何运行工作流,且在 Python 中进行编写。工作流被设计为 对独立执行的任务进行分组的DAG。DAG 确保了任务之间的关系和依赖。

运算符(Operators)用于定义工作流中的单个任务进行的模板。Airflow 为常见任务提供开箱即用的运算符,您还可以定义自定义运算符。此博文讨论了通过自定义运算符 (GenieOperator)提交任务给Genie。

任务(task)是运算符的参数化实例。对运算符进行实例化后,它便被称为任务。任务实例代表任务的特定运行。任务实例具有相关的 DAG、任务和时间点。

您可以按需运行 DAG 和任务,或在 DAG 中定义 cron 表达式的指定时间来调度DAG 和任务的运行。

有关 Apache Airflow 的其他详细信息,请参阅 Apache Airflow 文档中的概念

Genie

Genie 是一种开源工具,提供通过抽象访问底层 Amazon EMR 集群的配置管理功能和作业的动态路由。

Genie 提供 REST API 以从 Apache Hadoop MapReduce 或 Apache Spark 等大数据应用程序中提交作业。Genie 管理底层集群的元数据以及在集群中运行的命令和应用程序。

Genie 通过将一个或多个标签与集群相关联抽象对处理集群的访问。您还可以将标签与大数据平台支持的应用程序和命令的元数据详细信息关联。当 Genie 收到特定标签的作业提交时,它将使用集群/命令标签的组合将每个作业动态路由至正确的 EMR 集群中。

Genie 的数据模型

Genie 提供一个数据模型来捕获与您的大数据环境中的资源关联的元数据。

应用程序资源是可重复使用的二进制文件、配置文件和安装文件集,可用于在提交作业至集群的 Genie 节点上安装和配置大数据平台支持的应用程序。当 Genie 收到作业时,Genie 节点将下载与应用程序关联的所有依赖项、配置文件和安装文件,并将其存储在作业工作目录中。应用程序与命令关联在一起,因为它们代表命令运行前所需的二进制文件和配置文件。

命令资源代表的是使用命令行提交工作至集群时的参数以及 PATH 上为了运行命令需要提供的应用程序。命令资源将元数据组件粘合在一起。举例来说,代表 Hive 命令的命令资源包括 hive-site.xml 并且与提供运行该命令所需的 Hive 和 Hadoop 二进制文件的应用程序资源集关联。此外,命令资源还与它运行所在的集群关联。

集群资源可识别执行集群的详细信息,包括连接详细信息、集群状态、标签和其他属性。集群资源可以在启动期间注册 到Genie,并在终止期间自动取消注册。集群与可在其中运行的一个或多个命令关联。命令与集群关联后,Genie 可以开始提交作业至集群。

最后,作业资源有三种类型:作业请求作业作业执行。作业请求资源表示包含作业运行详细信息的请求提交。作业资源基于请求中提交的参数创建。作业资源将捕获命令、集群以及与作业关联的应用程序等详细信息。此外,有关状态、开始时间和结束时间的信息也可在作业资源上找到。作业执行资源提供管理详细信息,因此,您可以知道作业的运行位置。

有关更多信息,请参阅 Genie 参考指南上的数据模型

Amazon EMR 和 Amazon S3

Amazon EMR 是一个托管集群平台,可简化在 AWS 上运行大数据框架的过程,如 Apache Hadoop 和 Apache Spark,以处理和分析海量数据。有关更多信息,请参阅 Amazon EMR 架构的概述Amazon EMR 的概述

数据存储在 Amazon S3 中,它是一个对象存储服务,具有可扩展的性能、易于使用的功能及原生加密和访问控制功能。有关 S3 的更多详细信息,请参阅 Amazon S3 作为数据湖存储平台

架构深入了解

与此架构进行交互的有两个主要角色:平台管理工程师和数据工程师。

平台管理工程师对所有组件具有管理员访问权。他们可以添加或移除集群,配置平台支持的应用程序和命令。

数据工程师专注于用他们的首选框架(Apache Spark、Apache Hadoop MR、Apache Sqoop、Apache Hive、Apache Pig 和 Presto)编写数据应用程序,以及编写表现为DAG 的 python 脚本。

从高层次来看,平台管理工程师团队准备支持的大数据应用程序及其依赖项,并在 Genie 中注册它们。平台管理工程师团队启动Amazon EMR 集群,并将其在启动期间注册到 Genie 中。

平台管理工程师团队将各个 Genie 元数据资源(应用程序、命令和集群)与 Genie 标签关联。例如,您可以将集群资源与名为环境的标签关联,且值可以是“生产环境”、“测试环境”或“开发环境”。

数据工程师将工作流编写为 Airflow DAG 并使用自定义的 Airflow 运算符 (GenieOperator) 将任务提交至 Genie。他们可以使用标签组合识别他们正在运行的任务类型以及任务应该运行的位置。例如,您可能需要在通过“生产环境”标签识别的环境中运行 Apache Spark 2.4.3 任务。要执行此操作,请在 Airflow GenieOperator 中将集群和命令标签设置为以下代码:

(cluster_tags=['emr.cluster.environment:production'],command_tags=['type:spark-submit','version:2.4.3'])

下图展示了此架构。

工作流与此图中的编号的对应关系如下:

  1. 平台管理工程师准备受支持应用程序的二进制文件和依赖项(Spark-2.4.5、Spark-2.1.0、Hive-2.3.5 等)。平台管理工程师还会准备命令(spark-submit、hive)。平台管理工程师在 Genie 中注册应用程序和命令。此外,平台管理工程师在步骤 2(如下)完成后将命令与应用程序关联,同时将命令与一组集群链接。
  2. Amazon EMR 集群在启动期间注册到Genie。
  3. 数据工程师编写 Airflow DAG 并使用 Genie 标签引用环境、应用程序、命令或以上任意组合。在工作流代码中,数据工程师使用 GenieOperator。GenieOperator 会提交作业至 Genie。
  4. 调度器将触发工作流执行,或者数据工程师手动触发工作流执行。组成工作流的作业被提交至 Genie,以使用指定作业应该运行的位置的一组 Genie 标签进行执行。
  5. 用作客户端网关的 Genie 节点将使用所有二进制文件和依赖项设置工作目录。Genie 将作业动态路由至与提供的 Genie 标签相关的集群中。Amazon EMR 集群运行作业。

有关 Apache Airflow 和 Genie 所支持的授权和身份验证机制的详细信息,请参阅 Apache Airflow 文档中的安全和 Genie 文档中的安全。 此架构模式不会公开对 Amazon EMR 集群的 SSH 访问。要详细了解如何通过 EMR 文件系统 (EMRFS) 提供对 Amazon S3 中的数据的不同级别访问,请参阅配置 IAM 角色以向 Amazon S3 进行 EMRFS 请求

此架构启用的使用案例

下面的使用案例展示了此架构提供的功能。

在不停机的情况下管理升级和部署,并采用最新的开源版本

在大型组织中,使用数据平台的团队会使用异构框架和不同的版本。您可以使用此架构支持在不停机的情况下进行升级,并在短时间内提供最新版本的开源框架。

Genie 和 Amazon EMR 是启用此使用案例的关键组件。随着 Amazon EMR 服务团队努力在短发布周期内添加运行在 Amazon EMR 上的最新版开源框架,您始终都能满足内部团队对其首选开源框架最新功能的需求。

当新版本的开源框架可用时,您需要测试它,添加新的支持版本及其依赖项到 Genie 中,并将旧集群中的标签移动到新集群中。新集群会接受新的作业提交,旧集群将结束仍在运行的作业。

此外,由于 Genie 会集中应用程序二进制文件及其依赖项的位置,升级 Genie 中的二进制文件和依赖项也会自动升级所有的上游客户端。使用 Genie 时不再需要手动升级所有的上游客户端。

管理集中配置、作业和集群状态及日志记录

在一个拥有数千个作业和多个集群的环境中,您需要确定特定作业运行所在位置并快速访问日志记录详细信息。通过此架构,您可以看到数据平台上运行的作业、作业、集群及其配置的日志记录。

以编程方式访问大数据平台

此架构可以通过使用 Genie 的 REST API 进行单点作业提交。通过支持管理任务外加提交作业至集群的一组 API 抽象对基础集群的访问。REST API 调用会将作业异步提交到 Genie 中。如果作业被接受,将返回 job-id,您可以用它通过 API 或 Web UI 以编程方式获取作业状态和输出。Genie 节点将设置工作目录并在独立的进程中运行作业。

您还可以将此架构与大数据应用程序和 Apache Airflow DAG 的持续集成和持续交付 (CI/CD) 管道集成。

启用可扩展的客户端网关和并发作业提交

Genie 节点用作客户端网关(边缘节点)并且可以水平扩展,以确保用于提交作业至数据平台的客户端网关资源满足需求。此外,Genie 允许提交并发作业。

何时使用此架构

建议使用多个大型多租户处理集群而非瞬态集群的组织使用此架构。对于组织应该考虑何时使用在线集群与瞬态集群(您可以使用 EMR Airflow 运算符建立注册了 Genie 的 Amazon EMR 集群,运行作业并终止它们),此博文中暂不论述。您应该将预留实例用于此架构。有关更多信息,请参阅使用预留实例

尤其建议选择由集中平台团队管理和维护大数据平台以支持需要同时运行数千个作业的很多内部团队的组织使用此架构。

此架构对于那些规模不大或者不希望发展到那种规模的组织可能没有意义。集群抽象和集中配置管理具有一些优点,非常适合于对存在数千个并发工作流和数百个团队的可能会混乱的环境进行结构化访问。

同时还建议支持多小时或重叠工作流和异构架构(Apache Spark、Apache Hive、Apache Pig、Apache Hadoop MapReduce、Apache Sqoop 或 Presto)使用比例较高的的组织使用此架构。

如果您的组织只依赖于 Apache Spark 并且符合上面讨论的建议,此架构可能仍然适用。对于规模不足以证明需要集中 REST API 来进行作业提交、集群抽象、动态作业路由或集中配置管理的组织,Apache Livy 与 Amazon EMR 可能是适当的选项。Genie 拥有自己的可扩展基础设施,可用作边缘客户端。原因是Genie 不会像 Apache Livy那样与 Amazon EMR 主实例竞争资源,。

如果您组织中大多数工作流是短暂作业,则为每个工作流选择无服务器处理层、无服务器临时查询层或使用专用的瞬态 Amazon EMR 集群可能更合适。如果您组织中大多数工作流由数千个短暂作业组成,由于可以省去创建及终止集群的必要,此架构仍然适用。

建议需要对处理平台进行完全控制以优化组件性能的组织使用此架构。此外,建议需要通过 CI/CD 管道对其工作流实行集中管理的组织使用此架构。

评价不同编排选项或采用 Airflow 作为编排层的优点的内容,在此博文中没有介绍。考虑采用某个架构时,也请考虑现有的技能集合和采用工具的时间。Genie 的开源性质可使您集成其他编排工具。如果您希望将此架构与其他编排工具结合使用,也可以选择评估该路线。

小结

此博文介绍了如何使用 Apache Airflow、Genie 和 Amazon EMR 管理大数据工作流。此博文还描述了架构组件、架构支持的使用案例及何时使用架构。此博文的第二部分部署了一个演示环境,并带您逐步了解了配置 Genie 和将 GenieOperator 用于 Apache Airflow 的步骤。

 


关于作者

Francisco Oliveira 是 AWS 的高级大数据解决方案架构师。他专注于使用开源技术和 AWS 构建大数据解决方案。在业余时间,他喜欢尝试新的运动、旅行和探索国家公园。

 

 

 

Jelez Raditchkov 在 AWS 领导 NoSQL AWS 专业服务实践。他通过在 NoSQL、Graph 和 Search 领域提供有针对性的指导,帮助客户实现所需的商业结果。他以前曾任 AWS 专业服务部的首席数据湖架构师。

要了解有关 AWS NoSQL 特定用途数据库服务的更多信息,请访问 https://aws.amazon.com/nosql/