

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

# 使用 AWS Glue 构建 ETL 服务管道以增量方式将数据从 Amazon S3 加载到 Amazon Redshift
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue"></a>

*Rohan Jamadagni 和 Arunabha Datta，Amazon Web Services*

## Summary
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-summary"></a>

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

Amazon S3 中的源文件可以具有不同的格式，包括逗号分隔值 (CSV)、XML 和 JSON 文件。本示例介绍了如何使用 AWS Glue 将源文件转换为成本优化且性能优化的格式，例如 Apache Parquet。您可以直接从 Amazon Athena 和 Amazon Redshift Spectrum 查询 Parquet 文件。您还可以将 Parquet 文件加载到 Amazon Redshift 中，对其进行聚合，然后与消费者共享汇总数据，或者使用 Amazon Quick Sight 对数据进行可视化。

## 先决条件和限制
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-prereqs"></a>

**先决条件**
+ 一个活跃的 AWS 账户。
+ 具有正确权限并包含 CSV、XML 或 JSON 文件的 S3 源存储桶。

**假设**
+ CSV、XML 或 JSON 源文件已加载到 Amazon S3 中，可以从配置 AWS Glue 和 Amazon Redshift 的账户进行访问。
+ 如 [Amazon Redshift 文档](https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-S3.html)中所述，遵循加载文件、拆分文件、压缩和使用清单的最佳实践。
+ 源文件结构保持不变。
+ 源系统能够按照 Amazon S3 中定义的文件夹结构将数据提取至 Amazon S3 中。
+ Amazon Redshift 集群可跨越单个可用区。(这种架构很合适，因为 AWS Lambda、AWS Glue 和 Amazon Athena 为无服务器。) 为了实现高可用性，定期拍摄集群快照。

**限制**
+ 文件格式仅限于 [AWS Glue 当前支持的格式](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format.html)。
+ 不支持实时下游报告。

## 架构
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-architecture"></a>

**源技术堆栈**
+ 包含 CSV、XML 或 JSON 文件的 S3 存储桶

**目标技术堆栈**
+ S3 数据湖（带有分区 Parquet 文件存储）
+ Amazon Redshift

**目标架构**

![\[使用 AWS Glue 从 Amazon S3 到 Amazon Redshift 加载增量更改的架构。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/105b58ec-56c1-464a-8e69-f625360caa14/images/626aa365-e6e6-4874-a873-1c71adbe5306.png)


 

**数据流**

![\[使用 AWS Glue 从 Amazon S3 到 Amazon Redshift 加载增量更改的数据流。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/105b58ec-56c1-464a-8e69-f625360caa14/images/29569e48-9f2d-4f48-bc59-1f33949d01ca.png)


## 工具
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-tools"></a>
+ [Amazon S3](https://aws.amazon.com/s3/) — Amazon Simple Storage Service（Amazon S3）是一项可扩展的数据存储服务。Amazon S3 可用于各种存储解决方案，包括网站、移动应用程序、备份和数据湖。
+ [AWS Lambda](https://aws.amazon.com/lambda/) – AWS Lambda 让您无需预置或管理服务器即可运行代码。AWS Lambda 是一项事件驱动的服务，您可以将代码设置为自动从其他 Amazon Web Services 启动。
+ [Amazon Redshift](https://aws.amazon.com/redshift/) — Amazon Redshift 是一种完全托管的 PB 级数据仓库服务。借助 Amazon Redshift，您可以使用标准 SQL 跨数据仓库和数据湖查询 PB 级的结构化和半结构化数据。
+ [AWS Glue](https://aws.amazon.com/glue/) — AWS Glue 是一项完全托管的 ETL 服务，可让客户轻松准备和加载数据以进行分析。AWS Glue 发现您的数据并将关联的元数据（例如表定义和架构）存储在 AWS Glue Data Catalog 中。分类后的数据立即变得可搜索、可查询和可用于 ETL。
+ [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) — AWS Secrets Manager 有助于保护和集中管理应用程序或服务访问所需密钥。该服务存储数据库凭证、API 密钥和其他机密，并且无需以明文格式对敏感信息进行硬编码。Secrets Manager 还提供密钥轮换，以满足安全和合规性需求。它内置了 Amazon Redshift、Amazon Relational Database Service（Amazon RDS）和 Amazon DocumentDB 的集成。你可以使用 Secrets Manager 控制台、命令行界面 (CLI) 或 Secrets Manager API 来存储和集中管理密钥。 SDKs
+ [Amazon Athena](https://aws.amazon.com/athena/) — Amazon Athena 是一种交互式查询服务，可让您轻松分析存储在 Amazon S3 中的数据。Athena 是无服务器的，可与 AWS Glue 集成，因此它可以直接查询使用 AWS Glue 编目的数据。Athena 可弹性扩展以提供交互式查询性能。

## 操作说明
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-epics"></a>

### 创建 S3 存储桶与文件夹结构
<a name="create-the-s3-buckets-and-folder-structure"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 分析源系统的数据结构与属性。 | 对参与 Amazon S3 数据湖的每个数据来源执行此任务。 | 数据工程师 | 
| 定义分区与访问策略。 | 该策略应基于数据捕获的频率、增量处理以及消耗需求。确保 S3 存储桶不向公众开放，并且访问仅由基于特定服务角色的策略控制。有关更多信息，请参阅 [Amazon S3 文档](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/using-folders.html)。 | 数据工程师 | 
| 为每种数据来源类型创建单独的 S3 存储桶，为每个数据来源创建单独的 S3 存储桶 (Parquet)，为每个数据来源创建单独的 S3 存储桶。 | 为每个源创建一个单独的存储桶，然后根据源系统的数据提取频率创建文件夹结构，例如 `s3://source-system-name/date/hour`。对于已处理的 (转换为 Parquet 格式) 文件，请创建类似的结构，例如 `s3://source-processed-bucket/date/hour`。有关创建 S3 存储桶的更多信息，请参阅 [Amazon S3 文档](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html)。 | 数据工程师 | 

### 在 Amazon Redshift 中创建数据仓库
<a name="create-a-data-warehouse-in-amazon-redshift"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用适当的参数组以及维护和备份策略启动 Amazon Redshift 集群。 | 创建 Amazon Redshift 集群时，使用 Secrets Manager 数据库密钥作为管理员用户凭证。有关创建和调整 Amazon Redshift 集群规模的信息，请参阅 [Amazon Redshift 文档](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/event-publishing-redshift-cluster.html)和 [Sizing Cloud Data Warehouses](https://d1.awsstatic.com/whitepapers/Size-Cloud-Data-Warehouse-on-AWS.pdf) 白皮书。 | 数据工程师 | 
| 创建 IAM 服务角色，并将其附加至 Amazon Redshift 集群。 | AWS Identity and Access Management (IAM) 服务角色确保对 Secrets Manager 和源 S3 存储桶的访问。有关更多信息，请参阅有关[授权](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html)和[添加角色](https://docs.aws.amazon.com/redshift/latest/dg/c-getting-started-using-spectrum-add-role.html)的 AWS 文档。 | 数据工程师 | 
| 创建数据库架构。 | 遵循设计表的 Amazon Redshift 最佳实践。根据用例，选择适当的排序和分配键，以及最佳的压缩编码。有关最佳实践，请参阅 [AWS 文档](https://docs.aws.amazon.com/redshift/latest/dg/c_designing-tables-best-practices.html)。 | 数据工程师 | 
| 配置工作负载管理。 | 根据您的要求配置工作负载管理 (WLM) 队列、短查询加速 (SQA) 或者并发扩展。有关更多信息，请参阅 Amazon Redshift 文档中的[实施工作负载管理](https://docs.aws.amazon.com/redshift/latest/dg/cm-c-implementing-workload-management.html)。 | 数据工程师 | 

### 在 Secrets Manager 中创建密钥
<a name="create-a-secret-in-secrets-manager"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建一个新密钥以将 Amazon Redshift 登录凭证存储在 Secrets Manager 中。 | 此机密存储管理员用户以及各个数据库服务用户的凭证。有关说明，请参阅 [Secrets Manager 文档](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html)。选择 **Amazon Redshift 集群**作为密钥类型。此外，在**密钥轮换**页面，打开轮换。这将在 Amazon Redshift 集群中创建适当的用户，并按定义的时间间隔轮换密钥。 | 数据工程师 | 
| 创建 IAM policy 以限制 Secrets Manager 访问权限。 | 将 Secrets Manager 的访问权限限制为仅限 Amazon Redshift 管理员和 AWS Glue。 | 数据工程师 | 

### 配置 AWS Glue
<a name="configure-aws-glue"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 AWS Glue Data Catalog 中，为 Amazon Redshift 添加连接。 | 有关说明，请参阅 [AWS Glue 文档](https://docs.aws.amazon.com/glue/latest/dg/console-connections.html)。 | 数据工程师 | 
| 创建并附加 AWS Glue 的 IAM 服务角色，以访问 Secrets Manager、Amazon Redshift 和 S3 存储桶。 | 有关更多信息，请参阅 [AWS Glue 文档](https://docs.aws.amazon.com/glue/latest/dg/create-service-policy.html)。 | 数据工程师 | 
| 为数据源定义 AWS Glue Data Catalog。 | 此步骤涉及在 AWS Glue Data Catalog 中创建数据库和所需表。您可使用爬网程序对 AWS Glue 数据库中的表进行编目，也可以将其定义为 Amazon Athena 外部表。您还可以通过 AWS Glue Data Catalog 访问在 Athena 中定义的外部表。有关在 Athena 中[定义数据目录](https://docs.aws.amazon.com/glue/latest/dg/populate-data-catalog.html)和[创建外部表](https://docs.aws.amazon.com/athena/latest/ug/creating-tables.html)的更多信息，请参阅 AWS 文档。 | 数据工程师 | 
| 创建 AWS Glue 作业来处理源数据。 | AWS Glue 任务可以是 Python 外壳，也可以 PySpark 用于对源数据文件进行标准化、重复数据删除和清理。为了优化性能并避免查询整个 S3 源存储桶，请按日期对 S3 存储桶进行分区，按年、月、日和小时细分，作为 AWS Glue 作业的下推谓词。有关更多信息，请参阅 [AWS Glue 文档](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html)。将处理和转换后的数据以 Parquet 格式加载至已处理的 S3 存储桶分区。您可从 Athena 查询 Parquet 文件。 | 数据工程师 | 
| 创建 AWS Glue 作业以将数据加载至 Amazon Redshift 中。 | AWS Glue 任务可以是 Python 外壳，也可以 PySpark 通过更新数据然后完全刷新来加载数据。有关详细信息，请参阅 [AWS Glue 文档](https://docs.aws.amazon.com/glue/latest/dg/author-job.html)和*其他信息*部分。 | 数据工程师 | 
| （可选）必要时使用触发器安排 AWS Glue 作业。 | 增量数据加载主要由 Amazon S3 事件驱动，该事件导致 AWS Lambda 函数调用 AWS Glue 作业。对于需要基于时间而不是基于事件的调度的任何数据加载，使用基于 AWS Glue 触发器的调度。 | 数据工程师 | 

### 创建 Lambda 函数
<a name="create-a-lambda-function"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为 AWS Lambda 创建并附加 IAM 服务相关角色，以访问 S3 存储桶和 AWS Glue 作业。 | 为 AWS Lambda 创建 IAM 服务相关角色，并使用读取 Amazon S3 对象和存储桶的策略以及访问 AWS Glue API 以启动 AWS Glue 作业的策略。有关更多信息，请参阅[知识中心](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-execution-role-s3-bucket/)。 | 数据工程师 | 
| 创建 Lambda 函数，以根据定义的 Amazon S3 事件运行 AWS Glue 任务。 | Lambda 函数应通过创建 Amazon S3 清单文件来启动。Lambda 函数应将 Amazon S3 文件夹位置（例如 source\$1bucket/year/month/date/hour）作为参数传递给 AWS Glue 作业。AWS Glue 作业将使用此参数作为下推谓词，以优化文件访问和作业处理性能。有关更多信息，请参阅 [AWS Glue 文档](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-calling.html)。 | 数据工程师 | 
| 创建 Amazon S3 PUT 对象事件以检测对象创建，并调用相应的 Lambda 函数。 | Amazon S3 PUT 对象事件只能通过创建清单文件启动。清单文件控制 Lambda 函数和 AWS Glue 作业并发性，并批量处理负载，而不是处理到达 S3 源存储桶的特定分区的单个文件。有关更多信息，请参阅 [Lambda 文档](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html)。 | 数据工程师 | 

## 相关资源
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-resources"></a>
+ [Amazon S3 文档](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html)
+ [AWS Glue 文档](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html)
+ [Amazon Redshift 文档](https://docs.aws.amazon.com/redshift/latest/gsg/getting-started.html)
+ [AWS Lambda](https://aws.amazon.com/lambda/)
+ [Amazon Athena](https://aws.amazon.com/athena/)
+ [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/)

## 附加信息
<a name="build-an-etl-service-pipeline-to-load-data-incrementally-from-amazon-s3-to-amazon-redshift-using-aws-glue-additional"></a>

**更新插入和完全刷新的详细方法**

**更新插入**：这适用于需要历史汇总的数据集，具体取决于业务用例。根据您的业务需求，按照[更新和插入新数据](https://docs.aws.amazon.com/redshift/latest/dg/t_updating-inserting-using-staging-tables-.html)（Amazon Redshift 文档）中描述的方法之一进行操作。

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

1. 截断 Amazon Redshift 表。

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

或者：

1. 创建包含当前分区数据的临时表。

1. 删除目标 Amazon Redshift 表。

1. 将临时表重命名至目标表。