Glue job的运行结果被分拆到了多个文件中,我如何控制结果被分拆的方式?

0

【以下的问题经过翻译处理】 当我运行一个Glue job来处理一些CSV文件时,我使用S3分区(例如按照年份和月份)来存储结果,但是当我在S3中查看时,在“目录层级结构”y=1018/m=1下创建的“文件”个数不是一个,而是创建了许多小文件(每个约9MB)。

  1. 可以控制这种行为吗? 即我能否指定每个指定的分区仅会产生一个文件?或者我可以指定每个文件被分成多块时,每块实际的大小?
  2. 这个(~9MB)是在Athena或Redshift Spectrum中使用的最佳文件大小吗(从使用Hadoop/HDFS中,我习惯于选择更大的文件大小,比如是在128到256 MB的范围内)?

我刚开始接触Glue/Spark开发,所以任何建议,文档链接或代码片段(最好是Python,因为我不是Scala开发人员)对我都是有帮助的!

profile picture
专家
已提问 5 个月前3 查看次数
1 回答
0

【以下的回答经过翻译处理】 您好,

  1. 无法直接进行控制。Spark使用分区来并行处理你的DataFrame。每个分区写入一个独立的CSV文件。理论上,如果您强制DataFrame只使用 n 个分区,您就可以"控制"文件大小,但这不是推荐的做法,因为重新分区是一种相对昂贵的操作。控制Spark分区的一种方式是通过强制重新分区(强制full reshuffle数据)。另一种减少分区数的方式是使用 coalesce()。coalesce()可以减少分区数(而不是增加),而不必full reshuffle数据。但对于您的问题,这些选项我都不推荐。相反,我会等Spark处理完后再合并这些文件。我们的文档中也提到:"解决小文件问题的一个方法是使用Amazon EMR上的S3DistCP实用程序。您可以使用它将较小的文件合并成较大的对象。您还可以使用S3DistCP以优化的方式从HDFS移动大量的数据到Amazon S3、从Amazon S3到Amazon S3、以及从Amazon S3到HDFS。"

  2. 这并不是Athena的最优文件大小。您对128MB/256MB范围的理解是正确的。请查看以下关于如何优化Athena和Redshift Spectrum的文档链接。

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则