我试图创建一个脚本,该脚本将在文件系统块大小左右的情况下,将许多小型实木复合地板文件合并为较小的实木复合地板文件。
我在弱虚拟机上运行我的代码(spark-2.4.3和scala-2.12.7),因此文件无法一次全部放入内存,磁盘空间有限,spark在本地模式下运行。 / p>
我想到了这个解决方案:
spark.read.parquet(shortFileList:_*)
.repartition(amountOfNewFiles)
.write
.parquet("outDir")
然后我在执行器上遇到了Out of memory exception
,但我不确定为什么,我以为spark将创建amountOfNewFiles
个任务,并逐个执行它们,但是看起来重新分区使spark可以同时读取所有小文件。
为什么重新分区会导致spark将所有数据读入内存,并且 有什么解决方法可以得到我期望的行为?
向朋友寻求帮助后,他想出了另一种方法:
shortFileList
.tail
.foldRight(spark.read.parquet(shortFileList.head)){ (newDfName, df) =>
df.union(spark.read.parquet(newDfName))
}.write.parquet("outDir")
该解决方案看起来很奇怪,我不知道该期待什么,因为转换函数获取的变量超出了他的范围,在运行它之后,我的执行器上出现了GC overhead limit exceeded
,这真的很奇怪,因为它不断运行,同时不断抛出这些异常,而不是
由于内存不足异常而崩溃,我不知道为什么会这样。