我有以下代码。基本上我需要将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)
}
答案 0 :(得分:1)
如果您的数据集很大,很可能主节点无法处理它并将关闭。您可以尝试将它们写入文件(例如saveAsTextFile),然后再次读取每个文件
答案 1 :(得分:0)
collect()
创建一个包含RDD所有元素的数组。
在完全创建之前不能进行垃圾回收!因此,OOM。
取决于Report
实际在做什么,可以解决这个问题。