使用 AWS Glue 构建 ETL 服务管道,将数据从 Amazon S3 增量加载到 Amazon Redshift - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 AWS Glue 构建 ETL 服务管道,将数据从 Amazon S3 增量加载到 Amazon Redshift

由罗汉·贾马达尼(AWS)和阿鲁纳巴数据塔(AWS)创建

创建者:AWS

环境:生产

技术:数据湖;存储和备份;分析

AWS 服务:Amazon Redshift;Amazon S3;AWS Glue;AWS Lambda

Summary

此模式提供了有关如何配置 Amazon Simple Storage Service (Amazon S3) 以获得最佳数据湖性能的指导,然后使用 AWS Glue 将增量数据更改从 Amazon S3 加载到 Amazon Redshift,执行数据提取、转换和加载 (ETL) 操作。 

Amazon S3 中的源文件可以具有不同的格式,包括逗号分隔值 (CSV)、XML 和 JSON 文件。此模式描述了如何使用 AWS Glue 将源文件转换为成本优化且性能优化的格式,如 Apache 镶木地板。您可以直接从 Amazon Athena 和 Amazon Redshift Spectrum 查询拼花文件。您还可以将镶木地板文件加载到 Amazon Redshift 中,聚合它们,并与消费者共享聚合数据,或使用 Amazon QuickSight 可视化数据。

先决条件和限制

先决条件

  • 一个有效的 AWS 账户。

  • 具有正确权限并包含 CSV、XML 或 JSON 文件的 S3 源存储桶。

假设

  • CSV、XML 或 JSON 源文件已加载到 Amazon S3 中,并且可以从配置 AWS Glue 和 Amazon Redshift 的账户访问。

  • 遵循加载文件、拆分文件、压缩和使用清单的最佳做法,如Amazon Redshift 文档.

  • 源文件结构未更改。

  • 源系统能够按照 Amazon S3 中定义的文件夹结构将数据引入 Amazon S3。

  • Amazon Redshift 集群跨越单个可用区。(此架构非常适合,因为 AWS Lambda、AWS Glue 和 Amazon Athena 是无服务器的。) 为了实现高可用性,群集快照以常规频率拍摄。

限制

Architecture

源技术堆栈

  • 包含 CSV、XML 或 JSON 文件的 S3 存储桶

目标技术堆栈

  • S3 数据湖(具有分区的镶木地板文件存储)

  • Amazon Redshift

目标架构

数据流

Tools

  • Amazon S3— Amazon Simple Storage Service (Amazon S3) 是一种高度可扩展的对象存储服务。Amazon S3 可用于各种存储解决方案,包括网站、移动应用程序、备份和数据湖。

  • AWS Lambda— AWS Lambda 让您能够运行代码,而无需预置或管理服务器。AWS Lambda 是一种由事件驱动的服务;您可以将您的代码设置为自动从其他 AWS 服务启动。

  • Amazon Redshift— Amazon Redshift 是一种完全托管的 PB 级数据仓库服务。借助 Amazon Redshift,您可以使用标准 SQL 在整个数据仓库和数据湖中查询 PB 的结构化和半结构化数据。

  • AWS Glue— AWS Glue 是一项完全托管的 ETL 服务,可以更轻松地准备和加载用于分析的数据。AWS Glue 发现您的数据并将关联的元数据(例如,表定义和架构)存储在 AWS Glue 数据目录中。您的目录数据可立即搜索、可查询和可用于 ETL。

  • AWS Secrets Manager— AWS Secrets Manager 有助于对应用程序或服务访问所需的密钥进行保护和集中管理。该服务存储数据库凭证、API 密钥和其他密钥,而不需要对明文形式的敏感信息进行硬编码。Secrets Manager 还提供密钥轮换以满足安全性和合规性需求。它具有 Amazon Redshift、Amazon Relational Database Service (Amazon RDS) 和 Amazon DocumentDB 的内置集成。您可以通过使用密钥管理器控制台、命令行界面 (CLI) 或密钥管理器 API 和开发工具包来存储密钥并集中管理密钥。

  • Amazon Athena— Amazon Athena 是一种交互式查询服务,让您能够轻松分析 Amazon S3 中存储的数据。Athena 是无服务器的,并与 AWS Glue 集成,因此它可以直接查询使用 AWS Glue 编目的数据。Athena 经过弹性扩展以提供交互式查询性能。

Epics

任务描述所需技能
分析数据结构和属性的源系统。

为有助于 Amazon S3 数据湖的每个数据源执行此任务。

数据
定义分区和访问策略。

此策略应基于数据捕获的频率、增量处理和使用需求。确保 S3 存储桶不向公众开放,并且访问仅由特定的基于服务角色的策略控制。有关更多信息,请参阅 Amazon S3 文档

数据
为每种数据源类型创建单独的 S3 存储桶,并为每个源创建一个单独的 S3 存储桶,用于处理的(镶木地板)数据。

为每个源创建一个单独的存储桶,然后创建一个基于源系统的数据引入频率的文件夹结构;例如:s3: //源系统名称/年/月/日/小时/。对于处理的(转换为镶木格式)文件,创建一个类似的结构;例如:s3://来源处理的存储段/年/月/日/小时。有关创建 S3 存储桶的更多信息,请参阅Amazon S3 文档.

数据
任务描述所需技能
创建一个新的密码以将 Amazon Redshift 用户名和密码存储在密码管理器中。

此密钥存储管理员用户以及单个数据库服务用户的凭据。有关说明,请参阅Secrets Manager 文档.

数据
创建 AWS Identity and Access Management (IAM) 策略来限制密钥管理器的访问。

仅限于 Amazon Redshift 管理员和 AWS Glue 访问密钥管理器。

数据
任务描述所需技能
使用适当的参数组以及维护和备份策略启动 Amazon Redshift 集群。

在创建 Amazon Redshift 集群时,使用 Secrets Manager 数据库密钥来获取管理员用户凭据。有关创建 Amazon Redshift 集群并调整其大小的信息,请参阅Amazon Redshift 文档调整云数据仓库白皮书。

数据
创建 IAM Service 角色并将其附加到 Amazon Redshift 集群。

这可确保对 Secrets Manager 和源 S3 存储桶的访问。有关更多信息,请参阅 AWS 文档。authorization添加角色.

数据
创建具有相应角色和权限的数据库用户以访问相应的数据库模式对象。

创建数据库用户时,请参阅存储在服务用户的密码管理器中的密码。AWS Glue 将使用此服务用户。有关更多信息,请参阅 。Amazon Redshift 文档.

数据
创建数据库架构。

遵循 Amazon Redshift 设计表的 Amazon Redshift 最佳实践。根据用例,选择适当的排序键和分发键,以及最佳的压缩编码。有关最佳实践,请参阅AWS 文档.

数据
根据您的要求,配置工作负载管理 (WLM) 队列、短查询加速 (SQA) 或并发扩展。

有关更多信息,请参阅 。实施工作负载管理在 Amazon Redshift 文档中。

数据
任务描述所需技能
在 AWS Glue 数据目录中,为 Amazon Redshift 添加连接。

有关说明,请参阅AWS Glue 文档.

数据
为 AWS Glue 创建并附加 IAM 服务角色,以访问 Secrets Manager、Amazon Redshift 和 S3 存储桶。

有关更多信息,请参阅 。AWS Glue 文档.

数据
确定源的 AWS Glue 数据目录。

此步骤包括在 AWS Glue 数据目录中创建数据库和所需表。您可以使用爬虫程序对 AWS Glue 数据库中的表进行编录,也可以将它们定义为 Amazon Athena 外部表。您还可以通过 AWS Glue 数据目录访问 Athena 中设置的外部表。有关更多信息,请参阅 AWS 文档设置数据目录创建外部表在 Athena。

数据
创建 AWS Glue 任务以处理源数据。

AWS Glue 任务可以是 Python 外壳或 PySpark,用于对源数据文件进行标准化、重复数据消除和清理。为了优化性能并避免查询整个 S3 源存储桶,请按日期对 S3 存储桶进行分区,并按年、月、日和小时细分,作为 AWS Glue 任务的推下谓词。有关更多信息,请参阅 。AWS Glue 文档. 将处理的数据和转换的数据加载到已处理的 S3 存储桶分区中以镶木格式。您可以从 Athena 查询实木复合地板文件。

数据
创建 AWS Glue 任务以将数据加载到 Amazon Redshift 中。

AWS Glue 作业可以是 Python 外壳或 PySpark,通过向上传数据,然后进行完整刷新来加载数据。有关详细信息,请参阅AWS Glue 文档其他信息部分。

数据
(可选)根据需要使用触发器安排 AWS Glue 作业。

增量数据加载主要由 Amazon S3 事件驱动,该事件导致 AWS Lambda 函数调用 AWS Glue 作业。对于需要基于时间而不是基于事件的调度的任何数据加载,使用基于 AWS Glue 触发器的调度。

数据
任务描述所需技能
为 AWS Lambda 创建并附加 IAM 服务链接角色,以访问 S3 存储桶和 AWS Glue 任务。

为 AWS Lambda 创建 IAM 服务链接角色,其中包含读取 Amazon S3 对象和存储桶的策略,以及访问 AWS Glue API 以启动 AWS Glue 作业的策略。有关更多信息,请参阅 。知识中心.

数据
创建 Lambda 函数,以基于预定的 Amazon S3 事件运行 AWS Glue 作业。

Lambda 函数应通过创建 Amazon S3 清单文件来启动。Lambda 函数应将 Amazon S3 文件夹位置(例如,源桶/年/月/日期/小时)作为参数传递给 AWS Glue 作业。AWS Glue 作业将使用此参数作为推送谓词,以优化文件访问和任务处理性能。有关更多信息,请参阅 。AWS Glue 文档.

数据
创建 Amazon S3 PUT 对象事件以检测对象创建,并调用相应的 Lambda 函数。

Amazon S3 PUT 对象事件只能通过创建清单文件来启动。清单文件控制 Lambda 函数和 AWS Glue 作业并发,并将负载作为批处理,而不是处理到达 S3 源存储桶特定分区的单个文件。有关更多信息,请参阅 。Lambda 文档.

数据

其他信息

上插和完全刷新的详细方法

Upsert:这适用于需要历史聚合的数据集,具体取决于业务使用案例。请按照更新和插入新数据(Amazon Redshift 文档),根据您的业务需求。

完全刷新:这适用于不需要历史聚合的小型数据集。请遵循以下方法之一:

  1. 截断 Amazon Redshift 表。

  2. 从暂存区加载当前分区

或:

  1. 使用当前分区数据创建临时表。

  2. 删除目标 Amazon Redshift 表。

  3. 将临时表重命名为目标表。