Spark

时间:2016-04-05 08:46:40

标签: scala apache-spark

我在执行这部分代码时遇到了一些困难,因为我落在了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()
}

0 个答案:

没有答案