上次更新日期:2021 年 2 月 3 日
我想要配置 AWS Glue ETL 作业以输出少量大文件而不是大量小文件。
解决方案使用以下一种或两种方法来减少 AWS Glue ETL 作业的输出文件数量。
提高 groupSize 参数的值当您使用动态帧且 Amazon Simple Storage Service (Amazon S3) 数据集包含超过 50000 个文件时,分组自动启用。默认的 groupSize 值为 1 MB。提高此值可创建更少、更大的输出文件。有关更多信息,请参阅读取大型组中的输入文件。
在以下示例中,groupSize 被设置为 10485760 个字节 (10MB):
dyf = glueContext.create_dynamic_frame_from_options("s3", {'paths': , '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)