scala - 在 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"
解决方案
当我杀死控制台时,我注意到一堆类似以下的错误:
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"
推荐阅读
- javascript - vue.js 动态导入组件
- hql - Oozie 启动 HQL 文件
- java - 具有公钥和私钥的非对称密码学
- fabricjs - Fabricjs - 编辑组的元素
- multithreading - C ++ 11同时读取一个布尔值
- javascript - Firefox 和 safari 无法创建“CORS”模式的获取请求
- php - #1044 - 用户 'A WEIRD USER'@'localhost' 拒绝访问数据库 'MY DATABASE'
- android - Zipping Room Flowable 可防止更新
- ignite - 在另一个缓存的调用处理器中调用缓存删除时,Ignite 服务挂起,“条带池中可能出现饥饿”?
- macos - 如何使用 sed 替换多行