亚马逊AWS官方博客

利用AWS Glue 自动触发数据目录和ETL job 构建自动化无服务器数据湖

Original URL: https://aws.amazon.com/blogs/big-data/build-and-automate-a-serverless-data-lake-using-an-aws-glue-trigger-for-the-data-catalog-and-etl-jobs/

如今,海量数据从四面八方纷涌而来,比如来自 IoT 传感器、应用程序日志和点击流等资源的非结构化数据,以及来自事务处理应用程序、关系数据库和电子表格的结构化数据。数据已成为每家企业的重要组成部分。为了快速获取数据中的价值,保持单一事实来源(single source of truth),并且自动执行从数据提取到转换和分析的整个pipeline的需求应运而生。

随着数据的体量、处理速度和种类的增加,人们越来越关注数据分析的复杂性。数据要经过一些步骤的处理才能变为可供企业用户使用的状态,而这些步骤的数量和复杂性对于企业来说是一种担忧。数据工程团队的大部分时间常常用来构建和优化“提取、转换和加载”(ETL) 管道。自动执行整个流程能缩短实现价值的时间和降低运营成本。在这篇博文中,我们将介绍如何创建全自动的数据编目和 ETL 管道来转换数据。

架构

在这篇博文中,您将了解到如何构建和自动化以下架构。

您通过将 Amazon Simple Storage Service (Amazon S3) 用作主数据存储来构建无服务器数据湖。考虑到 Amazon S3 的可扩展性与高可用性,它最适合作为数据的单一事实来源。

您可以使用不同的方法在 Amazon S3 中提取和存储数据。例如,您可以使用 Amazon Kinesis Data Firehose 提取流数据,可以使用 AWS Database Migration Service (AWS DMS) 从现有数据库中提取关系数据,还可以使用 AWS DataSync 从本地网络文件系统 (NFS) 中提取文件。

提取的数据放在我们称为原始区的 Amazon S3 存储桶中。要使该数据可用,您必须在 AWS Glue 数据目录中为该数据的架构进行编目。要执行此操作,您可以使用由 Amazon S3 触发器调用的 AWS Lambda 函数,来启动对该数据进行编目的 AWS Glue 爬网程序。在该爬网程序完成表定义的创建后,您要使用 Amazon CloudWatch Events 规则调用第二个 Lambda 函数。此步骤会启动 AWS Glue ETL 作业来处理数据,并将数据输出到我们称为已处理区的另一个 Amazon S3 存储桶中。

AWS Glue ETL 作业将数据转换为 Apache Parquet 格式,然后将其存储在已处理的 S3 存储桶中。您可以修改 ETL 作业以实现其他目的,例如数据的更精细分区、压缩或扩充。监视和通知是自动化流程的重要组成部分。因此,在 ETL 作业完成时,另一条 CloudWatch 规则会立即使用 Amazon Simple Notification Service (Amazon SNS) 主题向您发送电子邮件通知。此通知指出您的数据已成功处理。

总的来说,此管道将数据进行分类和转换,并在完成时向您发送电子邮件通知。

使用 AWS CloudFormation 部署自动化的数据管道

首先,您要使用 AWS CloudFormation 模板创建所有必要的资源。这消除了手动出错的机会、提高了效率并确保配置保持一致。
使用以下“启动堆栈”按钮启动 AWS CloudFormation 模板。

请务必选择 “美国东部(弗吉尼亚北部)”区域 (us-east-1) ** 。然后,输入合适的堆栈名称、电子邮件地址和 AWS Glue 爬网程序名称以创建数据目录。添加 AWS Glue 数据库名称以保存元数据表。如以下屏幕截图所示确认 IAM 资源的创建,然后选择创建** 。

注意 :请务必输入您的有效电子邮件地址,以确保在 ETL 作业完成时能够收到通知。

此 AWS CloudFormation 模板在您的 AWS 账户中创建以下资源:

  • 两个 Amazon S3 存储桶,分别用来存储原始数据和已处理的 Parquet 数据。
  • 两个 AWS Lambda 函数:一个用来创建 AWS Glue 数据目录,另一个用来将主题发布到 Amazon SNS。
  • 一个 Amazon Simple Queue Service (Amazon SQS) 队列,用来维持重试逻辑。
  • 一个 Amazon SNS 主题,用来通知您数据已成功处理。
  • 两条 CloudWatch Events 规则:一条与 AWS Glue 爬网程序有关,另一条与 AWS Glue ETL 作业有关。
  • 多个 AWS Identity and Access Management (IAM) 角色,用于访问 AWS Glue、Amazon SNS、Amazon SQS 和 Amazon S3。

在 AWS CloudFormation 堆栈准备就绪时,检查您的电子邮件并确认 SNS 订阅。选择 资源 选项卡并查找详细信息。

按照以下步骤验证您的电子邮件订阅,以便在 ETL 作业完成时立即收到电子邮件提醒。

  1. 在 Amazon SNS 控制台上,在导航窗格中选择 主题 。名为 SNSProcessedEvent 的 SNS 主题会出现在屏幕上。 
  2. 选择 ARN。此时会显示“主题详细信息”页,并会将电子邮件订阅列出为 等待确认 。请务必确认通过 终端节点 列中提供的电子邮件地址进行了订阅。

如果没有看到电子邮件地址,或者链接在电子邮件中显示为无效,请选择相应的订阅终端节点。然后,选择 请求确认 以确认订阅。请务必检查垃圾邮件文件夹中是否有请求确认链接。

配置 Amazon S3 存储桶事件触发器

在此部分中,您将在原始 S3 存储桶上配置一个触发器。配置后,如果有新数据放入该存储桶,就会触发已在 AWS CloudFormation 部署中创建的 GlueTriggerLambda。

要配置通知,请执行以下操作:

  1. 打开 Amazon S3 控制台
  2. 选择源存储桶。在本例中,存储桶名称包含 raws3bucket,例如 -raws3bucket-1k331rduk5aph 。
  3. 转到 属性 选项卡,在 高级设置 下选择 事件 。 
  4. 选择 添加通知 ,然后按照以下设置来配置通知:
  • 名称 – 输入您选择的名称。在本例中,名称是 crawlerlambdaTrigger。
  • 事件 – 选中所有对象创建事件复选框,以在您上传文件时创建 AWS Glue 数据目录。
  • 发送到 – 选择 Lambda 函数。
  • Lambda – 选择已在部署部分中创建的 Lambda 函数。您的 Lambda 函数应包含字符串 GlueTriggerLambda 。 请查看以下屏幕截图,了解所有设置。完成时,选择 保存 。

有关配置事件的更多详细信息,请参阅 Amazon S3 控制台用户指南中的如何为 S3 存储桶启用和配置事件通知?

下载数据集

在这篇博文中,您将使用一个公开的纽约绿色出租车数据集(CSV 格式)。您要将每月数据上传到原始区,然后使用 AWS Glue 爬网程序执行自动化的数据编目。编目后会触发自动执行的 AWS Glue ETL 作业,该作业将每月绿色出租车数据转换为 Parquet 格式并存储在已处理区中。

您可以从 NYC Taxi & Limousine Commission 行程记录数据站点下载原始数据集。下载每月绿色出租车数据集,然后仅上传一个月的数据。例如,首先仅将 2018 年 1 月的绿色出租车数据上传到原始 S3 存储桶。

使用 AWS Glue 爬网程序自动进行数据编目

现代数据湖的一个重要方面是对可用数据进行编目处理,以便能轻松发现数据。要依据数据湖运行 ETL 作业或即时查询,您必须首先确定数据的架构和其他元数据信息(如位置、格式和大小)。AWS Glue 爬网程序可以轻松执行此流程。

将数据上传到原始区之后,您在这篇博文的前面部分创建的 Amazon S3 触发器会调用 GlueTriggerLambda 函数。此函数创建一个 AWS Glue 数据目录,以存储从已爬网的数据中推导出的元数据信息。

打开 AWS Glue 控制台。您应看到已使用 AWS CloudFormation 模板创建的数据库、表和爬网程序。您的 AWS Glue 爬网程序应显示如下。

使用左侧导航窗格浏览到表。您将在您前面创建的数据库中看到该表。

选择表名称,然后进一步查看爬网程序发现的元数据,如下所示。 

您还可以查看列、数据类型和其他详细信息。 在以下屏幕截图中,Glue 爬网程序通过确定列名称和相应的数据类型从 Amazon S3 中可用的文件创建了架构。您可以使用此架构创建外部表。 

使用 AWS Glue 编写 ETL 作业

AWS Glue 提供托管的 Apache Spark 环境来运行 ETL 作业,无需利用按需付费模式来维护任何基础设施。

打开 AWS Glue 控制台,然后选择 ETL 部分下的作业来开始编写 AWS Glue ETL 作业。为作业指定您选择的名称并记下该名称,因为稍后您将需要使用该名称。选择已创建的 IAM 角色(名称中包含 – GlueLabRole ),如下所示。保留其他默认选项。

AWS Glue 会生成所需的 Python 或 Scala 代码,您可以按照自己的数据转换需求来自定义这些代码。在 高级属性 部分中,选择作业书签列表中的 启用 ,以免重复处理旧数据。 

在下一页上,选择原始 Amazon S3 存储桶作为数据源,然后选择 下一步 。在 数据目标 页上,选择已处理的 Amazon S3 存储桶作为数据目标路径,然后选择 Parquet 作为格式。 

在下一页上,您可以根据需要更改架构,例如更改列名称、删除您不太感兴趣的列名称,甚至可以更改数据类型。AWS Glue 会相应地生成 ETL 代码。 最后,查看作业参数,然后选择保存作业并编辑脚本 ,如下所示。 

在下一页上,您可以按照自己的数据转换需求进一步修改脚本。在这篇博文中,您可以保留脚本不变。在下一部分中,您将让此 ETL 作业自动执行。

自动执行 ETL 作业

随着数据提取的频率不断提高,您希望让 ETL 作业自动执行以转换数据。自动执行此流程有助于降低运营开销,并使数据工程团队能将精力集中在更重要的任务上。

AWS Glue 在批量处理数据方面进行了优化。您可以将其配置为按照设定的时间间隔批量处理数据。您隔多久运行一次作业由最终用户需要多新的数据以及数据处理成本来决定。有关不同方法的信息,请参阅 AWS Glue 开发人员指南中的在 AWS Glue 中触发作业。 首先,您需要在 Lambda 函数和 CloudWatch Events 规则中进行一次性更改和配置 ETL 作业名称。在控制台上,打开已使用 AWS CloudFormation 堆栈创建的 ETLJobLambda Lambda 函数。

选择出现的 Lambda 函数链接,然后查看代码。将 JobName 值更改为您在上一步中创建的 ETL 作业名称,然后选择 保存 。 

如以下屏幕截图所示,您将看到与 AWS Lambda 函数关联的 AWS CloudWatch Events 规则 CrawlerEventRule。在该 CloudWatch Events 规则收到成功状态时,它会触发 ETLJobLambda Lambda 函数。 

现在,您已做好准备,在将文件上传到原始 S3 存储桶时将立即触发 AWS Glue ETL 作业。在测试数据管道之前,请设置监视和提醒功能。

使用 Amazon CloudWatch Events 进行监视和发送通知

如果您希望在 AWS Glue ETL 作业完成时收到电子邮件通知。刚才启动的 AWS CloudFormation 模板已经部署了 CloudWatch Events 规则 OpsEventRule。此 CloudWatch Events 规则监视 AWS Glue ETL 作业的状态,并在作业成功完成时使用 SNS 主题发送电子邮件通知。以下为具体的配置方法。

如下图所示,您在 CloudWatch 的 事件模式 部分中配置 AWS Glue 作业名称。在 AWS Glue 作业状态变为 已成功 时,事件会触发配置为目标的 SNS 主题。此 SNS 主题向您在部署部分中提供的用来接收通知的电子邮件地址发送电子邮件通知。

让我们在 CloudWatch Events 规则 OpsEventRule 中进行一次性的配置更改,以获取 AWS Glue ETL 作业的状态。

  1. 打开 CloudWatch 控制台。
  2. 在导航窗格中,在 事件 下选择规则。选择包含 OpsEventRule 的规则名称,如以下所示。 
  3. 在右上角中依次选择 操作、编辑 。 
  4. 将 Your-ETL-jobName 替换为您在上一步创建的 ETL 作业名称。 
  5. 向下滚动并选择配置详细信息,然后选择 更新规则。 

至此,已通过自动方式创建了具有相应通知和提醒的完整数据管道,现在可以测试这套管道了。比如将新的每月数据上传到原始 Amazon S3 存储桶(例如,上传 2018 年 2 月的纽约绿色出租车 CSV 数据),会触发 GlueTriggerLambda AWS Lambda 函数。您可以导航到 AWS Glue 控制台,在其中可以查看正在运行的 AWS Glue 爬网程序。

在爬网程序完成运行后,CloudWatch Events 规则 CrawlerEventRule 会触发 ETLJobLambda Lambda 函数。现在,您可以注意到 AWS Glue ETL 作业正在运行。

在 ETL 作业成功完成后,CloudWatch Events 规则 OpsEventRule 会使用 Amazon SNS 主题向您发送电子邮件通知(如下所示),从而完成自动循环。 

请务必检查已处理的 Amazon S3 存储桶,在其中您将找到由自动化的 ETL 管道处理的已转换数据。既然已处理的数据在 Amazon S3 中准备就绪,接下来您需要在此 Amazon S3 位置运行 AWS Glue 爬网程序。爬网程序会在 AWS Glue 数据目录中创建一个具有相关架构的元数据表。

创建数据目录表之后,您可以使用 Amazon Athena 执行标准的 SQL 查询,以及使用 Amazon QuickSight 将数据可视化。要了解更多信息,请参阅博客文章 Harmonize, Query, and Visualize Data from Various Providers using AWS Glue, Amazon Athena, and Amazon QuickSight。

小结

拥有自动化的无服务器数据湖架构可以减轻从源到目的地对数据进行管理(包括发现、审计、监视和数据质量)的负担。利用覆盖多个组织的一个自动化数据管道,您能以比以前快得多的速度识别相关数据集和获取价值。缩短分析时间的优点是:企业可以在数据变得可用时对数据进行实时分析。通过使用 BI 工具,查询单个数据集返回结果的速度比查询多个数据库要快得多。

现在,企业分析师可以更快完成本职工作,而数据工程团队可以从重复性任务中抽身出来。您可以将数据加载到数据仓库(如 Amazon Redshift)中,或者通过 Amazon SageMaker 使数据可用于机器学习,从而进一步扩展其用途。

本篇作者