我在执行这部分代码时遇到了一些困难,因为我落在了java.lang.StackOverflowError上。经过一些研究后,我发现它是由我在循环中创建的嵌套结构造成的,它达到了堆栈大小限制。
我读了两个选项,第一个是增加堆栈大小限制,但我们必须找到一个小的和一个大的大小的良好平衡。如何知道好的价值?
另一种选择是每隔N次操作检查一次RDD,并确保在检查点之前它是持久的。
因此,我尝试这段代码,看起来即使我遇到错误,堆栈大小和检查点的值也会继续。
我很高兴知道我对问题的理解是否良好,是否有更好的选择,或者我是否可以改进我的代码。
var ind1 = 0
while ( stop != 0 ) {
val rdd1 = rddY.filter( x => { Vectors.sqdist(x._2,vector0) <= threshold }).cache
val rdd2 = rdd1.map( x => (ind1.toString,x))
rdd0 = sc.union(rdd0,rdd2).coalesce(numPart).cache
if(ind1 % 20 == 19){
rdd0.checkpoint()
}
rdd0.foreach(x=>{})
rddY = rddY.subtract(rdd1).cache
if(ind1 % 20 == 19){
rddY.checkpoint()
}
stop = rddY.count().toInt
if(stop != 0) { vector0 = rddY.first()._2 }
ind1 += 1
rdd1.unpersist()
}