Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark:PageRank迭代太大时抛出StackOverflower错误的示例_Scala_Iteration_Stack Overflow_Apache Spark - Fatal编程技术网

Scala Spark:PageRank迭代太大时抛出StackOverflower错误的示例

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

我测试了spark默认PageRank示例,并将迭代设置为1024,然后它抛出StackOverflowerError。我在我的另一个程序中也遇到了这个问题。我该如何解决它

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