

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

# 优化 AWS 输入文件大小的 ETL 摄取
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws"></a>

*Apoorva Patrikar，Amazon Web Services*

## Summary
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-summary"></a>

本指南向您展示如何通过在处理数据之前优化文件大小，以优化 AWS Glue 上的大数据和 Apache Spark 工作负载的提取、转换、加载（ETL）过程的摄取步骤。使用此模式可防止或解决*小文件问题*。也就是说，当大量小文件由于文件总大小而减慢数据处理速度时。例如，数百个只有几百 KB 的文件可能会显着降低 AWS Glue 作业的数据处理速度。这是因为 AWS Glue 必须在 Amazon Simple Storage Service (Amazon S3) 上执行内部列表功能，并且 YARN (Yet Another Resource Negotiator) 必须存储大量元数据。为了提高数据处理速度，您可以使用分组，以使 ETL 任务将一组输入文件读取至单个内存分区。该分区会自动将较小文件组合在一起。或者，您可以使用自定义代码将批处理逻辑添加至现有文件。

## 先决条件和限制
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 一个或多个 AWS glue [作业](https://docs.aws.amazon.com/glue/latest/dg/author-job.html)
+ 一个或多个大数据或 [Apache Spark](https://spark.apache.org/) 工作负载
+ 一个 [S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html)

## 架构
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-architecture"></a>

以下指南展示了 AWS Glue 作业如何处理不同格式的数据，然后将其存储在 S3 存储桶中以了解性能。

![\[不同格式的数据由 AWS Glue 作业处理，然后存储在 S3 存储桶中。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/88ee332f-2f12-4d88-b491-e78bbb173850/images/9a97b54a-3f67-4a48-94d2-5807373ace25.png)


图表显示了以下工作流：

1. 
**注意**  
AWS Glue 任务将 CSV、JSON 和 Parquet 格式的小文件转换至动态框架。：输入文件的大小对 AWS Glue 任务性能影响最大。

1. AWS Glue 任务在 S3 存储桶执行内部列表功能。

## 工具
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-tools"></a>
+ [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html) 是一项完全托管的 ETL 服务。它可以帮助您在数据存储和数据流之间对数据进行可靠地分类、清理、扩充和移动。
+ [Amazon Simple Storage Service(Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。

## 操作说明
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-epics"></a>

### 读取期间通过分组优化 ETL 摄取
<a name="use-grouping-to-optimize-etl-ingestion-during-reading"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 指定群组大小。 | 如果您的文件数量超过 50,000 个，预设情况下将进行分组。但是，您也可以通过在 `connectionOptions` 参数中指定组大小来对少于 50,000 个文件使用分组。`connectionOptions` 参数使用 `create_dynamic_frame.from_options` 方法。 | 数据工程师 | 
| 编写分组代码。 | 使用 `create_dynamic_frame` 方法创建动态框架。例如：<pre>S3bucket_node1 = glueContext.create_dynamic_frame.from_options(<br />    format_options={"multiline": False},<br />    connection_type="s3",<br />    format="json",<br />    connection_options={<br />        "paths": ["s3://bucket/prefix/file.json"],<br />        "recurse": True,<br />        "groupFiles": 'inPartition', <br />        "groupSize": 1048576<br />    },<br />    transformation_ctx="S3bucket_node1",<br />)</pre>使用 `groupFiles` 对 Amazon S3 分区组中的文件进行分组。使用 `groupSize` 设置要在内存中读取的组的目标大小。以字节为指定 `groupSize` (1048576 = 1 MB)。 | 数据工程师 | 
| 将代码添加到工作流。 | 在 AWS Glue 中将分组代码添加至您的任务[工作流](https://docs.aws.amazon.com/glue/latest/dg/workflows_overview.html)。 | 数据工程师 | 

### 通过自定义逻辑优化 ETL 摄取
<a name="use-custom-logic-to-optimize-etl-ingestion"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 选择语言与处理平台。 | 选择针对您的用例量身定制的脚本语言与处理平台。 | 云架构师 | 
| 编写代码。 | 编写自定义逻辑，将文件一起批处理。 | 云架构师 | 
| 将代码添加到工作流。 | 在 AWS Glue 中添加代码到您的[工作流](https://docs.aws.amazon.com/glue/latest/dg/workflows_overview.html)。这样，您就可在每次运行作业时应用自定义逻辑。 | 数据工程师 | 

### 转换后写入数据时重新分区
<a name="repartition-when-writing-data-after-transformation"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 分析使用模式。 | 了解下游应用程序将如何使用您写入的数据。例如，如果他们每天查询数据，而您只按区域对数据进行分区，或者输出文件非常小（例如每个文件 2.5 KB），那么这并非最佳的使用方式。 | 数据库管理员 | 
| 写入之前对数据重新分区。 | 在处理过程中（基于处理逻辑）和处理后（基于使用量），根据联接或查询进行重新分区。例如，根据字节大小进行重新分区（如 `.repartition(100000)`），或者根据列重新分区（如 `.repartition("column_name")`）。 | 数据工程师 | 

## 相关资源
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-resources"></a>
+ [读取较大群组中的输入文件](https://docs.aws.amazon.com/glue/latest/dg/grouping-input-files.html)
+ [监控 AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/monitor-glue.html)
+ [使用亚马逊 CloudWatch 指标监控 AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)
+ [作业监控和调试](https://docs.aws.amazon.com/glue/latest/dg/monitor-profile-glue-job-cloudwatch-metrics.html)
+ [在 AWS Glue 上开启无服务器 ETL 入门](https://docs.aws.amazon.com/prescriptive-guidance/latest/serverless-etl-aws-glue/welcome.html)

## 附加信息
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-additional"></a>

**确定文件大小**

没有直接的方法可确定文件大小。文件大小对处理性能的影响，取决于集群的配置。在核心 Hadoop，我们建议您使用 128 MB 或 256 MB 文件，以充分利用数据块。

对于 AWS Glue 上的大多数文本文件工作负载，我们建议 5-10 DPU 个集群的文件大小在 100 MB 到 1 GB 之间。要找出输入文件的最佳大小，请监控 AWS Glue 任务预处理部分，然后检查该作业的 CPU 利用率和内存利用率。

**其它注意事项**

如果早期 ETL 阶段的性能存在瓶颈，请考虑在处理之前对数据文件进行分组或合并。如果您可完全控制文件生成过程，则在将原始数据发送至 AWS 之前，在源系统本身上聚合数据点会更加高效。