用RDD迭代处理不能持续很长时间

时间:2016-12-07 08:41:44

标签: scala join apache-spark mesos

我需要加入2个RDD,这些RDD太大而无法加载并加入单个处理。所以我从源RDD和目标RDD获取一些记录并迭代加入它们。但我发现随着时间的推移,加入速度变得越来越慢,最后程序在某个阶段停止了。舞台的状态是暂存,从未改变过。似乎迭代中声明的RDD没有被释放,因此系统没有足够的内存用于新的RDD。如何解决?

var A: RDD[(Int, UUID)] = …
var B: RDD[(Int, UUID)] = …
for (i <- 0 until 64) {
    var tmpA = A.filter(x => x._1%64 == i)
    var tmpB = B.filter(x => x._1%64 == i)
    var C = A.join(B)
    println(C.count)
}

1 个答案:

答案 0 :(得分:2)

我相信至少部分问题是原始RDD无法解决内存问题。在每个步骤中,您基本上将它们加载到内存中以进行过滤。 相反,您可以将它们拆分为多个RDDS并将每个RDDS保存到磁盘。然后在执行连接时仅加载相关对。这意味着通过下一次加入,它可以释放所有其他内容。

也就是说,假设您的示例代表您的实际代码,您的RDD似乎有一个架构。我会尝试使用数据集或更好的数据帧,这些数据帧占用更少的内存(根据我的经验,这很容易就是10倍),然后一切都可能适合内存。