首页 > 解决方案 > 在 Spark RDD 上调用 map(f).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 内核的 Spark 文档页面上提供的示例,它在使用 Almond 内核的 Jupyter 中运行良好。此外,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"

标签: scalaapache-sparksbtrddread-eval-print-loop

解决方案


当我杀死控制台时,我注意到一堆类似以下的错误:

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

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

scalacOptions += "-Ydelambdafy:inline"

推荐阅读