使用Spark将较小的Parquet文件合并为较大的Parquet文件失败,并出现OOM错误

时间:2019-08-15 21:10:11

标签: scala apache-spark

我试图创建一个脚本,该脚本将在文件系统块大小左右的情况下,将许多小型实木复合地板文件合并为较小的实木复合地板文件。

我在弱虚拟机上运行我的代码(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,这真的很奇怪,因为它不断运行,同时不断抛出这些异常,而不是 由于内存不足异常而崩溃,我不知道为什么会这样。

0 个答案:

没有答案