2014-10-02 11 views
0

을 던져, 기본 SparkContext와 테스트를 실행하는, localTest라고 내 테스트 스위트에 쉽게 테스트를 추가 할 수 있습니다내가 새로운 기능 FunSuite를 확장하여 내 <a href="https://spark.apache.org" rel="nofollow">Spark</a> 작업을 테스트 <a href="http://doc.scalatest.org/2.2.1/index.html#org.scalatest.FunSuite" rel="nofollow">FunSuite</a>을 사용하고자하는 NullPointerException이

0 :

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를 사용하는 나의 방식이 올바르지 않습니까?

저는 스칼라 2.10.4를 spark-core 1.0.2와 scalatest 2.2.2로 사용하고 있습니다.

+0

'.set ("spark.default.parallelism", "n")'을 호출하면,'setMaster' 바로 다음에'n'이 코어의 개수이고, NPE가 사라지나요? – huitseeker

+0

@huitseeker 같은 오류가 발생했습니다. 나는 정확히 null인지 모르겠다. – mariop

+0

Spark의 자체 유닛 테스트는 비슷한 패턴을 사용한다. (ScalaTest의 BeforeAndAfterAll과 BeforeAndAfterEach 특성을 사용하여이 설정을 수행한다.) 이것이 작동하지 않는다는 것에 놀랐다. 여러 테스트를 동시에 실행하고 있습니까 (예 : 동일한 JVM에서 동시에 실행중인 SparkContext를 보유하고 있습니까?). –

답변

1

이것이 작동하지 않는 이유는 내가 FunSuite.test을 잘못 사용했기 때문입니다. 이 메서드는 호출 될 때, 즉 FunSuite이 생성 될 때 새 테스트를 등록합니다. 그러면 테스트가 실행될 때 테스트가 호출됩니다. 그러나 localTestFunSuite.test을 호출하기 전후에 몇 가지 작업을 수행합니다. 특히 this.test(name)(f(sc))으로 테스트를 등록한 후 SparkContext을 중지합니다. 테스트가 호출되면 sc이 중지되고 인 taskScheduler 필드의 NullPointerException이 발생합니다. FunSuite를 사용하는 올바른 방법은 다음과 같습니다 하나 개 이상의 클래스에서 SparkContexts를 실행하는 경우

import org.scalatest.FunSuite 

import org.apache.spark.SparkConf 
import org.apache.spark.SparkContext 


class SparkFunSuite extends FunSuite { 

    def localTest(name : String)(f : SparkContext => Unit) : Unit = { 
    this.test(name) { 
     val conf = new SparkConf() 
     .setAppName(name) 
     .setMaster("local") 
     .set("spark.default.parallelism", "1") 
     val sc = new SparkContext(conf) 
     try { 
     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) 
    } 
} 
4

, 당신이 당신의 build.sbt에 parallelExecution in Test := false을 넣어 있는지 확인하십시오. 명령을 실행했을 때 문제가 발생했습니다 : sbt test. 나는 NPE 또는 PARSING_ERROR을 JVM에서 실행중인 여러 SparkContext로 인해 발생시킵니다.

+0

awesome - 나는 이것을 찾고 있었다. –

+0

이것은 스파크 테스트 문헌에서 두드러 질 필요가 있습니다. – Max

관련 문제