如何配置 AWS Glue ETL 任务以输出更大的文件?
上次更新时间:2021 年 10 月 7 日
我想要配置 AWS Glue ETL 任务以输出少量大文件而不是大量小文件。
解决方案
使用以下一种或两种方法来减少 AWS Glue ETL 作业的输出文件数量。
提高 groupSize 参数的值
当您使用动态帧且 Amazon Simple Storage Service (Amazon S3) 数据集包含超过 50000 个文件时,分组自动启用。提高此值可创建更少、更大的输出文件。有关更多信息,请参阅读取大型组中的输入文件。
在以下示例中,groupSize 被设置为 10485760 个字节 (10MB):
dyf = glueContext.create_dynamic_frame_from_options("s3", {'paths': ["s3://awsexamplebucket/"], 'groupFiles': 'inPartition', 'groupSize': '10485760'}, format="json")
使用 coalesce()
在写入 Amazon S3 前使用 Apache Spark .coalesce() 操作减少 Spark 输出分区的数量。这将减少输出文件的数量。
请记住:
- coalesce() 可支持 Spark 数据分发,从而可以大大提高任务运行时间。
- 如果您指定少量分区,任务可能会失败。例如,如果您运行 coalesce(1),Spark 将尝试把所有数据放入一个分区内。这可能会造成磁盘空间问题。
注意:您还可以使用 repartition() 减少分区数量。然而,repartition() 将重新分发所有数据。coalesce() 操作使用现有分区最大限度减少数据分发量。
要使用 coalesce() 操作减少 Spark 分区的数量:
1. 检查当前分区数量:
dynamic_frame.getNumPartitions()
2. 运行 coalesce()。示例:
dynamic_frame_with_less_partitions=dynamic_frame.coalesce(20)