如何配置 AWS Glue ETL 作业以输出更大的文件?

1 分钟阅读
0

我想要配置 AWS Glue ETL 作业以输出少量大文件而不是大量小文件。

解决方法

使用以下任意方法来减少 AWS Glue ETL 作业的输出文件数量。

提高 groupSize 参数的值

当您使用动态帧且 Amazon Simple Storage Service (Amazon S3) 数据集包含超过 50000 个文件时,分组自动启用。提高此值可创建更少、更大的输出文件。有关更多信息,请参阅读取大型组中的输入文件

在以下示例中,groupSize 被设置为 10485760 个字节(10 MB):

dyf = glueContext.create_dynamic_frame_from_options("s3", {'paths': ["s3://awsexamplebucket/"], 'groupFiles': 'inPartition', 'groupSize': '10485760'}, format="json")

**注意:**以下数据格式仅支持 groupSizegroupFiles 参数:csv、ion、grokLog、json 和 xml。avro、parquet 和 orc 不支持此选项。

使用 coalesce(N) 或 repartition(N)

1.    (可选)根据输入数据集大小计算分区目标数量 (N)。使用以下公式:

targetNumPartitions = 1 Gb * 1000 Mb/10 Mb = 100

**注意:**在此示例中,输入大小为 1 GB,目标输出为 10 MB。此计算允许您控制输出文件的大小。

2.    使用以下代码检查当前分区数量:

currentNumPartitions = dynamic_frame.getNumPartitions()

**注意:**当你重新分区时,targetNumPartitions 应小于 currentNumPartitions

3.   在写入 Amazon S3 前使用 Apache Spark coalesce() 操作减少 Spark 输出分区的数量。这将减少输出文件的数量。例如:

dynamic_frame_with_less_partitions=dynamic_frame.coalesce(targetNumPartitions)

请记住:

  • coalesce() 可支持 Spark 数据分发,从而可以大大提高任务运行时间。
  • 如果您指定少量分区,任务可能会失败。例如,如果您运行 coalesce(1),Spark 将尝试把所有数据放入一个分区内。这可能会造成磁盘空间问题。
  • 您还可以使用 repartition() 减少分区数量。然而,repartition() 将重新分发所有数据。coalesce() 操作使用现有分区最大限度减少数据分发量。有关使用 repartition() 的更多信息,请参阅 eduCBA 网站上的 Spark Repartition

使用 maxRecordsPerFile

使用 Spark write() 方法控制每个文件的最大记录计数。以下示例将最大记录计数设置为 20:

df.write.option("compression", "gzip").option("maxRecordsPerFile",20).json(s3_path)

**注意:**maxRecordsPerFile 选项仅用作每个文件记录计数的上限。每个文件的记录计数将小于或等于指定的数量。如果该值为零或负数,则表示没有限制。


相关信息

使用分组修复多个文件的处理

AWS 官方
AWS 官方已更新 2 年前