优化 AWS 输入文件大小的 ETL 摄取 - AWS Prescriptive Guidance

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

优化 AWS 输入文件大小的 ETL 摄取

由 Apoorva Patrikar (AWS) 创建

环境:PoC 或试点

技术:分析、数据湖

工作负载:开源

Amazon Web Services:AWS Glue;Amazon S3

Summary

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

先决条件和限制

先决条件

架构

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

不同格式的数据由 AWS Glue 任务处理,然后存储在 S3 存储桶中。

图表显示了以下工作流:

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

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

工具

  • AWS Glue 是一项完全托管的 ETL 服务。它可以帮助您在数据存储和数据流之间对数据进行可靠地分类、清理、扩充和移动。

  • Amazon Simple Storage Service(Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。

操作说明

任务描述所需技能

指定群组大小。

如果您的文件数量超过 50,000 个,预设情况下将进行分组。但是,您也可以通过在 connectionOptions 参数中指定组大小来对少于 50,000 个文件使用分组。connectionOptions 参数使用 create_dynamic_frame.from_options 方法。

数据工程师

编写分组代码。

使用 create_dynamic_frame 方法创建动态框架。例如:

S3bucket_node1 = glueContext.create_dynamic_frame.from_options( format_options={"multiline": False}, connection_type="s3", format="json", connection_options={ "paths": ["s3://bucket/prefix/file.json"], "recurse": True, "groupFiles": 'inPartition', "groupSize": 1048576 }, transformation_ctx="S3bucket_node1", )

注意:使用 groupFiles 对 Amazon S3 分区组中的文件进行分组。使用 groupSize 设置要在内存中读取的组的目标大小。以字节为指定 groupSize (1048576 = 1 MB)。

数据工程师

将代码添加到工作流。

在 AWS Glue 中将分组代码添加至您的任务工作流

数据工程师
任务描述所需技能

选择语言与处理平台。

选择针对您的用例量身定制的脚本语言与处理平台。

云架构师

编写代码。

编写自定义逻辑,将文件一起批处理。

云架构师

将代码添加到工作流。

在 AWS Glue 中添加代码到您的工作流。这样,您就可在每次运行作业时应用自定义逻辑。

数据工程师
任务描述所需技能

分析消费模式。

了解下游应用程序将如何使用您写入的数据。例如,如果他们每天查询数据,而您只按区域对数据进行分区,或者输出文件非常小,例如每个文件 2.5 KB,那么这并不是最佳的使用方式。

数据库管理员

在写入之前对数据进行重新分区。

在处理过程中(基于处理逻辑)和处理后(基于消耗量),根据联接或查询进行重新分区。例如,根据字节大小进行重新分区(例如).repartition(100000),或基于列的重新分区,例如。.repartition("column_name")

数据工程师

相关资源

其他信息

确定文件大小

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

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

其它注意事项

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