如何控制Spark job在写入时创建的输出零件文件的数量?

b1uwtaje  于 2023-03-13  发布在  Apache
关注(0)|答案(2)|浏览(143)

我有一对夫妇的Spark作业,每天处理数千个文件。文件大小可能非常从MB到GB。完成作业后,我通常使用以下代码保存

finalJavaRDD.saveAsParquetFile("/path/in/hdfs"); OR
dataFrame.write.format("orc").save("/path/in/hdfs") //storing as ORC file as of Spark 1.4

Spark job在最终输出目录中创建了大量的小零件文件。据我所知,Spark为每个分区/任务创建零件文件-这是正确的吗?我们如何控制Spark创建的零件文件的数量?
最后,我想使用这些parquet/orc目录创建配置单元表,我听说当我们有大量的小文件时,配置单元很慢。

xqnpmsa8

xqnpmsa81#

您可能希望尝试使用DataFrame.coalesce方法来减少分区的数量;它返回具有指定分区数的DataFrame(每个分区在插入时都成为一个文件)。
要增加或减少分区,您可以使用Dataframe.repartition函数。但是coalesce不会导致shuffle,而repartition会。

rfbsl7qr

rfbsl7qr2#

从1.6开始你可以对 Dataframe 使用repartition,这意味着你将得到每个配置单元分区的一个文件。但是要小心大的shuffle,如果可能的话,最好从一开始就对你的DF进行正确的分区。参见https://stackoverflow.com/a/32920122/2204206

相关问题