Scala REPL在Spark RDD上调用map(f).sum时无限期挂起



我发现以下简单的例子在Scala REPL(sbt console(中无限期地挂起:

import org.apache.spark.sql._
val spark = SparkSession.builder().master("local[*]").getOrCreate()
val sc = spark.sparkContext
val rdd = sc.parallelize(1 to 100000000)
val n = rdd.map(_ + 1).sum

然而,以下操作很好:

import org.apache.spark.sql._
val spark = SparkSession.builder().master("local[*]").getOrCreate()
val sc = spark.sparkContext
val rdd1 = sc.parallelize(1 to 100000000)
val rdd2 = rdd1.map(_ + 1)
val n = rdd2.sum

我对此感到非常困惑,希望有人能解释。。。假设他们能够重现"问题"。

这基本上只是Almond内核的Spark文档页面上提供的示例,而且它在Jupyter中使用Almond内核运行得很好。此外,sbt "runMain Main"适用于以下情况:

import org.apache.spark.sql._
object Main extends App {
val spark = SparkSession.builder().master("local[*]").getOrCreate()
val sc = spark.sparkContext
val rdd = sc.parallelize(1 to 100000000)
val n = rdd.map(_ + 1).sum
println(s"nnn: $nnn")

spark.stop
}

为了完整起见,我使用了一个非常简单的build.sbt文件,如下所示:

name := """sparktest"""
scalaVersion := "2.12.10"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.6"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.4.6"

当我杀死控制台时,我注意到了一堆错误,如下所示:

08:53:36 ERROR Executor:70 - Exception in task 2.0 in stage 0.0 (TID 2): Could not initialize class $line3.$read$$iw$$iw$$iw$$iw$

这让我想到:

REPL中的Lambda(使用对象包装器(+并发=死锁#9076

我的问题似乎也是这个问题,并且是Scala2.12特有的。在build.sbt中添加以下行似乎是公认的解决方法:

scalacOptions += "-Ydelambdafy:inline"

最新更新