多次递归后创建的长谱系RDD导致的堆栈溢出错误

时间:2015-10-30 20:44:26

标签: scala recursion apache-spark stack-overflow rdd

这是Scala递归的一部分,它在多次递归后产生堆栈溢出。我尝试了很多东西,但我没有设法解决它。

val eRDD: RDD[(Int,Int)] = ... 

val oldRDD: RDD[Int,Int]= ...

val result = **Algorithm**(eRDD,oldRDD)


Algorithm(eRDD: RDD[(Int,Int)] , oldRDD: RDD[(Int,Int)]) : RDD[(Int,Int)]{

    val newRDD = Transformation(eRDD,oldRDD)//only transformations

    if(**Compare**(oldRDD,newRDD)) //Compare has the "take" action!!

          return **Algorithm**(eRDD,newRDD)

    else

         return newRDD
}

以上代码是递归的并执行多次迭代(直到比较返回false)

经过一些迭代后,我遇到了堆栈溢出错误。血统链可能已经变得太长了。有什么方法可以解决这个问题吗? (persist / unpersist,checkpoint,sc.saveAsObjectFile)。

注1:只有比较功能对RDD执行操作

注意2:我尝试了一些persist / unpersist的组合,但没有一个工作!

我尝试了spark.streaming的检查点。我在每次递归时都设置了一个检查点,但仍然收到溢出错误

我还尝试在每次迭代时使用sc.saveAsObjectFile,然后在下一次迭代中从文件(sc.objectFile)中读取。不幸的是,我注意到每次迭代创建的文件夹正在增加,而我期望它们每次迭代具有相同的大小。 以下是我尝试使用“sc.saveAsObjectFile”解决它的方法:

Algorithm(eRDD: RDD[(Int,Int)] , recursion:Int) : RDD[(Int,Int)] = {

    val filename="RDD"+recursion.toString+".txt"

    val oldRDD :RDD[(Int,Int)] = sc.objectFile(filename)

    val newRDD=Transform(eRDD,oldRDD)

    if (compare(newRDD, oldRDD)){

          val newfilename="RDD"+(recursion+1).toString+".txt"

          newRDD.saveAsObjectFile(newfilename)

          return Algorithm(eRDD,recursion + 1)
    }

    else

          return newRDD
}

在此尝试之后,对象文件具有以下增长趋势:         RDD1.txt有1个分区(partition00000)         RDD2.txt有4个分区(partition00000 ... partition00003)         。         。         RDD6.txt有64个分区(partition00000 .... .... partition00063)         。         。         e.t.c

0 个答案:

没有答案