当在 FunSuite 的测试函数之外使用 SharedSparkContext (sc) 时,是什么导致了 NullPointerException?

What causes a NullPointerException when a SharedSparkContext (sc) is used outside a test function in FunSuite?

以下 scala 代码工作正常,测试运行:

import org.scalatest._
import com.holdenkarau.spark.testing._

class DummyTest extends FunSuite with SharedSparkContext {
   test("shared context only works inside test functions.") {
     val myRDD = sc.parallelize(List(1,2,3,4))
   }
}

但是,以下 Scala 代码会在 sc.parallelize 行生成 java.lang.NullPointerException:

import org.scalatest._
import com.holdenkarau.spark.testing._

class DummyTest extends FunSuite with SharedSparkContext {
   val myRDD = sc.parallelize(List(1,2,3,4))
   test("shared context only works inside test functions.") {
      assert(true)
   }
}

在测试函数之外使用 SparkContext 时,是什么原因导致 NullPointerException?

SparkContext 在 SharedSparkContext 中声明,但未作为该特征初始化的一部分进行初始化。相反,它是在特征的 beforeAll() 方法中初始化的,该方法在套件完全实例化后由测试框架调用。来源在这里:https://github.com/holdenk/spark-testing-base/blob/master/src/main/pre-2.0/scala/com/holdenkarau/spark/testing/SharedSparkContext.scala。如果你在初始化你的 class 时使用它,beforeAll() 还没有被调用,所以它仍然是空的。

总结一下,顺序是:

  1. 超级class初始化(代码只是在trait body中)
  2. Sub-class 初始化(代码就在你 class 的正文中)
  3. beforeAll() 调用
  4. 测试运行

因此您可以在第 4 步中使用 sc,但不能在第 2 步中使用。