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

Iteratively process with RDD can't last long

我需要加入 2 个 RDD,它们太大而无法在单个处理中加载和加入。所以我从源 RDD 和目标 RDD 中获取一些记录并迭代地加入它们。但是我发现随着时间的推移,连接速度越来越慢,最后程序停在了某个阶段。舞台的状态是 staging 并且从未改变。似乎在迭代中声明的 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)
}

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

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