Spark:对分区的增量collect()导致Heap中的OutOfMemory

时间:2016-01-27 19:46:50

标签: scala apache-spark garbage-collection out-of-memory

我有以下代码。基本上我需要将RDD打印到控制台,所以我通过每个分区收集它来收集较小块的大型RDD。这是为了避免一次收集整个RDD。在监控堆和GC日志时,似乎没有任何东西是GC' d。堆不断增长,直到它遇到OutOfMemory错误。如果我的理解是正确的,在下面一旦对收集的RDD执行println语句,它们就不再需要了,所以它对GC是安全的,但这不是我在GC日志中看到的每次调用收集累积到OOM。有谁知道为什么收集的数据不是GC' d?

 val writes = partitions.foreach { partition =>
      val rddPartition = rdds.mapPartitionsWithIndex ({ 
        case (index, data) => if (index == partition.index) data else Iterator[Words]()
      }, false).collect().toSeq
      val partialReport = Report(rddPartition, reportId, dateCreated)
      println(partialReport.name) 
    }

2 个答案:

答案 0 :(得分:1)

如果您的数据集很大,很可能主节点无法处理它并将关闭。您可以尝试将它们写入文件(例如saveAsTextFile),然后再次读取每个文件

答案 1 :(得分:0)

collect()创建一个包含RDD所有元素的数组。

在完全创建之前不能进行垃圾回收!因此,OOM。

取决于Report实际在做什么,可以解决这个问题。