本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
由 Apoorva Patrikar (AWS) 创建
摘要
本指南向您展示如何通过在处理数据之前优化文件大小,以优化 AWS Glue 上的大数据和 Apache Spark 工作负载的提取、转换、加载(ETL)过程的摄取步骤。使用此模式可防止或解决小文件问题。也就是说,当大量小文件由于文件总大小而减慢数据处理速度时。例如,数百个只有几百 KB 的文件可能会显着降低 AWS Glue 作业的数据处理速度。这是因为 AWS Glue 必须在 Amazon Simple Storage Service (Amazon S3) 上执行内部列表功能,并且 YARN (Yet Another Resource Negotiator) 必须存储大量元数据。为了提高数据处理速度,您可以使用分组,以使 ETL 任务将一组输入文件读取至单个内存分区。该分区会自动将较小文件组合在一起。或者,您可以使用自定义代码将批处理逻辑添加至现有文件。
先决条件和限制
先决条件
一个有效的 Amazon Web Services account
一个或多个 AWS glue 作业
一个或多个大数据或 Apache Spark
工作负载 一个 S3 存储桶
架构
以下指南展示了 AWS Glue 作业如何处理不同格式的数据,然后将其存储在 S3 存储桶中以了解性能。

图表显示了以下工作流:
注意
AWS Glue 任务将 CSV、JSON 和 Parquet 格式的小文件转换至动态框架。:输入文件的大小对 AWS Glue 任务的性能影响最大。
AWS Glue 任务在 S3 存储桶执行内部列表功能。
工具
AWS Glue 是一项完全托管的 ETL 服务。它可以帮助您在数据存储和数据流之间对数据进行可靠地分类、清理、扩充和移动。
Amazon Simple Storage Service(Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。
操作说明
Task | 描述 | 所需技能 |
---|---|---|
指定群组大小。 | 如果您的文件数量超过 50,000 个,预设情况下将进行分组。但是,您也可以通过在 | 数据工程师 |
编写分组代码。 | 使用
注意
| 数据工程师 |
将代码添加到工作流。 | 在 AWS Glue 中将分组代码添加至您的任务工作流。 | 数据工程师 |
Task | 描述 | 所需技能 |
---|---|---|
选择语言与处理平台。 | 选择针对您的用例量身定制的脚本语言与处理平台。 | 云架构师 |
编写代码。 | 编写自定义逻辑,将文件一起批处理。 | 云架构师 |
将代码添加到工作流。 | 在 AWS Glue 中添加代码到您的工作流。这样,您就可在每次运行作业时应用自定义逻辑。 | 数据工程师 |
Task | 描述 | 所需技能 |
---|---|---|
分析消费模式。 | 了解下游应用程序将如何使用您写入的数据。例如,如果他们每天查询数据,而您只按区域对数据进行分区,或者输出文件非常小,例如每个文件 2.5 KB,那么这并不是最佳的使用方式。 | 数据库管理员 |
在写入之前对数据进行重新分区。 | 在处理过程中(基于处理逻辑)和处理后(基于消耗量),根据联接或查询进行重新分区。例如,根据字节大小进行重新分区(例如) | 数据工程师 |
相关资源
其他信息
确定文件大小
没有直接的方法可确定文件大小。文件大小对处理性能的影响,取决于集群的配置。在核心 Hadoop,我们建议您使用 128 MB 或 256 MB 文件,以充分利用数据块。
对于 AWS Glue 上的大多数文本文件工作负载,我们建议 5-10 DPU 个集群的文件大小在 100 MB 到 1 GB 之间。要找出输入文件的最佳大小,请监控 AWS Glue 任务预处理部分,然后检查该作业的 CPU 利用率和内存利用率。
其它注意事项
如果早期 ETL 阶段的性能存在瓶颈,请考虑在处理之前对数据文件进行分组或合并。如果您可完全控制文件生成过程,则在将原始数据发送至 AWS 之前,在源系统本身上聚合数据点会更加高效。