使用Spark 2.2.0时,我遇到了相当奇怪的闭包行为。这个程序
object SparkConst extends App {
val spark = SparkSession.builder()
.appName("spark_const")
.enableHiveSupport()
.getOrCreate()
val ctx = spark.sparkContext
ctx.setLogLevel("WARN")
val a = 2
val xs = ctx.parallelize(Seq(1))
val addValMap = xs.map(_ + a)
println(s"Result ${addValMap.collect().mkString(",")}")
}
打印“结果1”,以便在评估a
时map
等于零(默认值)。我究竟做错了什么?我应该如何将各种常量传递给RDD转换?
PS。该应用程序在客户端模式下的YARN群集上执行。
答案 0 :(得分:3)
应用程序应定义main()方法,而不是扩展scala.App。 scala.App的子类可能无法正常工作。
在实践中,App
的惰性特性与Spark的许多功能(包括序列化和Accumulators
)相互作用。
要解决此问题,只需重写您的代码即可使用标准main
:
object SparkConst {
def main(args: Array[String]) = {
val spark = SparkSession.builder()
...
}
}