Scala Spark:PageRank迭代太大时抛出StackOverflower错误的示例
我测试了spark默认PageRank示例,并将迭代设置为1024,然后它抛出StackOverflowerError。我在我的另一个程序中也遇到了这个问题。我该如何解决它Scala Spark:PageRank迭代太大时抛出StackOverflower错误的示例,scala,iteration,stack-overflow,apache-spark,Scala,Iteration,Stack Overflow,Apache Spark,我测试了spark默认PageRank示例,并将迭代设置为1024,然后它抛出StackOverflowerError。我在我的另一个程序中也遇到了这个问题。我该如何解决它 object SparkPageRank { def main(args: Array[String]) { if (args.length < 3) { System.err.println("Usage: PageRank <master> <file> <nu
object SparkPageRank {
def main(args: Array[String]) {
if (args.length < 3) {
System.err.println("Usage: PageRank <master> <file> <number_of_iterations>")
System.exit(1)
}
var iters = args(2).toInt
val ctx = new SparkContext(args(0), "PageRank",System.getenv("SPARK_HOME"), SparkContext.jarOfClass(this.getClass))
val lines = ctx.textFile(args(1), 1)
val links = lines.map{ s => val parts = s.split("\\s+")
(parts(0), parts(1))
}.distinct().groupByKey().cache()
var ranks = links.mapValues(v => 1.0)
for (i <- 1 to iters) {
val contribs = links.join(ranks).values.flatMap{ case (urls, rank) =>
val size = urls.size
urls.map(url => (url, rank / size))
}
ranks = contribs.reduceByKey(_ + _).mapValues(0.15 + 0.85 * _)
}
val output = ranks.collect()
output.foreach(tup => println(tup._1 + " has rank: " + tup._2 + "."))
System.exit(0)
}
}
我猜发生错误的原因是中间RDD在
collect()
之前不会得到计算。在收集时,递归地计算它们
尝试添加cache()
以在每次迭代中评估RDD,这可能会有帮助:
ranks = contribs.reduceByKey(_ + _).mapValues(0.15 + 0.85 * _).cache
这是因为for循环中的这些转换在rdd中产生了很长的依赖关系。当您尝试运行spark作业时,对rdd的递归访问将导致stackoverflow错误 要解决此问题,可以在rdd上使用
checkpoint()
cache()
无法帮助您立即评估rdd
因此,在某些迭代之后,您应该在中间rdd上调用
cache()
和checkpoint()
,并手动评估它以清除其依赖关系。您可以共享stacktrace的顶部(前几行)吗?我发布stacktrace。
ranks = contribs.reduceByKey(_ + _).mapValues(0.15 + 0.85 * _).cache