如何控制Spark作业在写入时创建的输出部分文件的数量?
How to control the number of output part files created by Spark job upon writing?
我有几个每天处理数千个文件的 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 作业在最终输出目录中创建了大量小零件文件。据我了解,Spark 会为每个 partition/task 创建零件文件,如果我错了请纠正我。我们如何控制 Spark 创建的零件文件的数量?
最后,我想使用这些 parquet/orc 目录创建 Hive table,我听说当我们有大量的小文件时 Hive 很慢。
您可能想尝试使用DataFrame.coalesce方法来减少分区数量;它 returns 具有指定分区数的 DataFrame(每个分区在插入时成为一个文件)。
要增加或减少分区,您可以使用 Dataframe.repartition
函数。
但是 coalesce
不会导致洗牌,而 repartition
会。
从 1.6 开始,您可以对数据框使用重新分区,这意味着每个配置单元分区将获得 1 个文件。但是要注意大洗牌,如果可能的话,最好从一开始就正确地对你的 DF 进行分区。
参见
我有几个每天处理数千个文件的 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 作业在最终输出目录中创建了大量小零件文件。据我了解,Spark 会为每个 partition/task 创建零件文件,如果我错了请纠正我。我们如何控制 Spark 创建的零件文件的数量?
最后,我想使用这些 parquet/orc 目录创建 Hive table,我听说当我们有大量的小文件时 Hive 很慢。
您可能想尝试使用DataFrame.coalesce方法来减少分区数量;它 returns 具有指定分区数的 DataFrame(每个分区在插入时成为一个文件)。
要增加或减少分区,您可以使用 Dataframe.repartition
函数。
但是 coalesce
不会导致洗牌,而 repartition
会。
从 1.6 开始,您可以对数据框使用重新分区,这意味着每个配置单元分区将获得 1 个文件。但是要注意大洗牌,如果可能的话,最好从一开始就正确地对你的 DF 进行分区。
参见