为什么Spark会将数据帧写入不同的文件大小和不同的时间?

时间:2019-10-25 06:45:32

标签: scala apache-spark

考虑通用算法:

val first : DataFrame = ...            // about 100 Mb
val second : DataFrame = ...           // about 5 GMb 
val third : DataFrame = ...            // about 7 GMb
val fourth : DataFrame = ...           // about 13 GMb

//all dataframe are filtered, renamed all columns. A new colun is added into `third` and `fourth`  

val = firstAndSecond = first.join(first("first_id") === second("second_id"))
val = thirdsAndAll = firstAndSecond.join(firstAndSecond("some_id") === third("third_id"))
val = fourthAndAll = thirdsAndAll.join(thirdsAndAll("other_id") === fourth("fourth_id"))

fourthAndAll.write.mode(saveMode = SaveMode.Overwrite).parquet("file://C:path")

注释*

  1. 所有数据帧都可以从SSD驱动器读取和写入。
  2. 对木地板文件执行的读写操作
  3. 程序在具有8个内核(16个虚拟),80Gb Ram(火花消耗约25Gb)的Threadripper上运行,也有99%的时间 (写入最后一个文件时除外)所有16个内核均100%加载。

问题

我输出的实木复合地板文件的大小有很大不同,从100 kb到500Nb。同样,较大的文件有很长的写入时间。 例如。每个文件都由某些线程写入,这些线程写入500Mb,450Mb(等)文件执行其工作时间过长。 (对于500Mb,大约需要8个小时)

有没有人想到如何设置spark来写入大小相等的CPU负载的镶木地板文件?

1 个答案:

答案 0 :(得分:0)

(我主要使用RDD s,对dataframe api的使用经验不多,但是我猜它的工作方式相同)

我猜.parquet为rdd的每个分区创建了一个文件。如果文件大小完全不同,则数据不会均匀分布在各个分区中。 它还可能会降低join操作的性能。 repartition命令应该会有所帮助。