我在Specs2框架中使用Scala在Spark中编写了单元测试用例。在一些测试中,我正在创建一个Spark Context并传入函数。
val conf = new SparkConf().setAppName("test").setMaster("local[2]")
val sc = new SparkContext(conf)
val rdd = sc.parallelize(arr)
val output = Util.getHistograms(rdd, header, skipCols, nBins)
这些测试在eclipse JUnit插件中正确执行,没有错误或失败,但是当我运行sbt test
时,我得到一个奇怪的异常并且测试返回错误。
[info] Case 8: getHistograms should
[error] ! return with correct output
[error] akka.actor.InvalidActorNameException: actor name [ExecutorEndpoint] is not unique! (ChildrenContainer.scala:192)
[error] akka.actor.dungeon.ChildrenContainer$TerminatingChildrenContainer.reserve(ChildrenContainer.scala:192)
[error] akka.actor.dungeon.Children$class.reserveChild(Children.scala:77)
[error] akka.actor.ActorCell.reserveChild(ActorCell.scala:369)
[error] akka.actor.dungeon.Children$class.makeChild(Children.scala:202)
[error] akka.actor.dungeon.Children$class.attachChild(Children.scala:42)
[error] akka.actor.ActorCell.attachChild(ActorCell.scala:369)
[error] akka.actor.ActorSystemImpl.actorOf(ActorSystem.scala:552)
[error] org.apache.spark.rpc.akka.AkkaRpcEnv.actorRef$lzycompute$1(AkkaRpcEnv.scala:92)
[error] org.apache.spark.rpc.akka.AkkaRpcEnv.org$apache$spark$rpc$akka$AkkaRpcEnv$$actorRef$1(AkkaRpcEnv.scala:92)
[error] org.apache.spark.rpc.akka.AkkaRpcEnv$$anonfun$setupEndpoint$1.apply(AkkaRpcEnv.scala:148)
[error] org.apache.spark.rpc.akka.AkkaRpcEnv$$anonfun$setupEndpoint$1.apply(AkkaRpcEnv.scala:148)
[error] org.apache.spark.rpc.akka.AkkaRpcEndpointRef.actorRef$lzycompute(AkkaRpcEnv.scala:281)
[error] org.apache.spark.rpc.akka.AkkaRpcEndpointRef.actorRef(AkkaRpcEnv.scala:281)
[error] org.apache.spark.rpc.akka.AkkaRpcEndpointRef.hashCode(AkkaRpcEnv.scala:329)
[error] org.apache.spark.rpc.akka.AkkaRpcEnv.registerEndpoint(AkkaRpcEnv.scala:73)
[error] org.apache.spark.rpc.akka.AkkaRpcEnv.setupEndpoint(AkkaRpcEnv.scala:149)
[error] org.apache.spark.executor.Executor.<init>(Executor.scala:89)
[error] org.apache.spark.scheduler.local.LocalEndpoint.<init>(LocalBackend.scala:57)
[error] org.apache.spark.scheduler.local.LocalBackend.start(LocalBackend.scala:119)
[error] org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:144)
[error] org.apache.spark.SparkContext.<init>(SparkContext.scala:514)
[error] UtilTest$$anonfun$8$$anonfun$apply$29.apply(UtilTest.scala:113)
[error] UtilTest$$anonfun$8$$anonfun$apply$29.apply(UtilTest.scala:111)
我想因为SparkContext(sc)没有被创建而我得到一个null,但是我无法理解导致这个的原因。 提前谢谢。
答案 0 :(得分:1)
这种情况正在发生,因为sbt一起执行所有测试,因此多次运行规范文件会创建多个SparkContext。 要解决此问题,请添加一个单独的对象并在其中初始化SparkContext。在测试代码中使用此sc,以便不会多次创建它。
答案 1 :(得分:1)
实际上原因更简单 - 你不能同时在同一个JVM中运行可变的spark上下文。 sbt test并行执行测试,这意味着如果你的测试都产生了一个spark上下文,那么测试就会失败。
为防止这种情况发生,请将以下内容添加到build.sbt:
// super important with multiple tests running spark Contexts
parallelExecution in Test := false
将导致顺序测试执行。