在Spark RDD上调用mapf.sum时,Scala REPL无限期挂起

问题描述

我发现以下简单示例在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 kernel's Spark documentation page上提供的示例,并且在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"\n\nn: $n\n\n")
  
  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$

这导致我:

Lambda in REPL (using object-wrappers) + concurrency = deadlock #9076

似乎我的问题是同一件事,并且特定于Scala 2.12。将以下行添加到build.sbt似乎是公认的解决方法:

scalacOptions += "-Ydelambdafy:inline"