Scala Spark上的java.lang.StackOverflower错误和检查点

Scala Spark上的java.lang.StackOverflower错误和检查点,scala,apache-spark,Scala,Apache Spark,我在执行这部分代码时遇到一些困难,因为我遇到了java.lang.StackOverflower错误。经过一些研究,我发现这是因为我在循环中创建的嵌套结构达到了堆栈大小限制 我读了两个选项,第一个是增加堆栈大小限制,但我们必须找到大小的一个小和一个大之间的良好平衡。如何知道好的价值 另一个选项是每N次操作检查一次RDD,并确保在检查之前将其持久化 因此,我尝试了这段代码,似乎堆栈大小和检查点的值足够大,即使遇到错误,计算仍将继续 我很高兴知道我对这个问题的理解是否正确,是否有更好的选择,或者我是

我在执行这部分代码时遇到一些困难,因为我遇到了java.lang.StackOverflower错误。经过一些研究,我发现这是因为我在循环中创建的嵌套结构达到了堆栈大小限制

我读了两个选项,第一个是增加堆栈大小限制,但我们必须找到大小的一个小和一个大之间的良好平衡。如何知道好的价值

另一个选项是每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()
}
var ind1=0
while(停止!=0){
val rdd1=rddY.filter(x=>{Vectors.sqdist(x._2,vector0)(ind1.toString,x))
rdd0=sc.union(rdd0,rdd2).合并(numPart).缓存
如果(ind1%20==19){
rdd0.checkpoint()
}
foreach(x=>{})
rddY=rddY.subtract(rdd1.cache)
如果(ind1%20==19){
rddY.checkpoint()
}
stop=rddY.count().toInt
如果(stop!=0){vector0=rddY.first()。\u 2}
ind1+=1
rdd1.unpersist()
}

请参见,您可能需要在对RDD执行操作之前放置检查点调用(例如,
rdd0.foreach(x=>{})
stop=rddY.count().toInt
)检查点的位置effect@TzachZohar这对我来说似乎是一个有效的答案。你不想发布它吗?@KyBe我看到你根据我的评论编辑了代码-这解决了问题吗?我认为它应该可以工作,而不需要增加堆栈大小。它工作起来很有魅力。谢谢你!看,你可能需要在之前进行检查点调用对RDD的操作(例如,
rdd0.foreach(x=>{})
stop=rddY.count().toInt
)检查点的位置effect@TzachZohar这对我来说似乎是一个有效的答案。难道你不想发布它吗?@KyBe我看到你根据我的评论编辑了代码-这解决了问题吗?我认为它应该可以工作,而不需要增加堆栈大小。它工作起来很有魅力。谢谢!