这是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