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

上次更新时间:2020 年 3 月 16 日

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

解决方法

使用以下一种或两种方法来减少 AWS Glue ETL 作业的输出文件数量。

提高 groupSize 参数的值

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

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

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)

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?