我想用FunSuite通過用新的功能擴展FunSuite測試我Spark工作,叫localTest
,運行帶有默認SparkContext測試:使用FunSuite測試星火引發NullPointerException異常
class SparkFunSuite extends FunSuite {
def localTest(name : String)(f : SparkContext => Unit) : Unit = {
val conf = new SparkConf().setAppName(name).setMaster("local")
val sc = new SparkContext(conf)
try {
this.test(name)(f(sc))
} finally {
sc.stop
}
}
}
然後我可以輕鬆地添加測試,我的測試套件:
class MyTestSuite extends SparkFunSuite {
localTest("My Spark test") { sc =>
assertResult(2)(sc.parallelize(Seq(1,2,3)).filter(_ <= 2).map(_ + 1).count)
}
}
的問題是,當我運行測試中,我得到了NullPointerException
:
[info] MyTestSuite:
[info] - My Spark test *** FAILED ***
[info] java.lang.NullPointerException:
[info] at org.apache.spark.SparkContext.defaultParallelism(SparkContext.scala:1215)
[info] at org.apache.spark.SparkContext.parallelize$default$2(SparkContext.scala:435)
[info] at MyTestSuite$$anonfun$1.apply(FunSuiteTest.scala:24)
[info] at MyTestSuite$$anonfun$1.apply(FunSuiteTest.scala:23)
[info] at SparkFunSuite$$anonfun$localTest$1.apply$mcV$sp(FunSuiteTest.scala:13)
[info] at SparkFunSuite$$anonfun$localTest$1.apply(FunSuiteTest.scala:13)
[info] at SparkFunSuite$$anonfun$localTest$1.apply(FunSuiteTest.scala:13)
[info] at org.scalatest.Transformer$$anonfun$apply$1.apply$mcV$sp(Transformer.scala:22)
[info] at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
[info] at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
[info] ...
什麼是造成NullPointerException
?我在這方面使用Spark的方式不正確嗎?
我正在使用Scala 2.10.4和spark-core
1.0.2和scalatest
2.2.2。
如果你調用'.set(「spark.default.parallelism」,「n」)',其中'n'是核心數量,在'setMaster'之後,NPE是否會消失? – huitseeker 2014-10-03 14:01:55
@huitseeker同樣的錯誤。我不知道到底是什麼零... ... – mariop 2014-10-03 14:46:16
Spark自己的單元測試使用了類似的模式(我們使用ScalaTest的BeforeAndAfterAll和BeforeAndAfterEach特性來執行此設置),所以我很驚訝這不起作用。您是否並行運行多個測試(例如,您是否曾經在同一個JVM中同時運行SparkContexts)? – 2014-10-03 15:18:58