Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark单元测试:如何使用FunSuite为所有套件仅初始化一次sc_Scala_Apache Spark_Spark Streaming_Scalatest - Fatal编程技术网

Scala Spark单元测试:如何使用FunSuite为所有套件仅初始化一次sc

Scala Spark单元测试:如何使用FunSuite为所有套件仅初始化一次sc,scala,apache-spark,spark-streaming,scalatest,Scala,Apache Spark,Spark Streaming,Scalatest,我想写spark单元测试用例,我正在使用FunSuite。 但我希望我的sparkContext只初始化一次,由所有套件使用,然后在所有套件完成时终止 abstract class baseClass extends FunSuite with BeforeAndAfter{ before { println("initialize spark context") } after { println("kill spark context") } } @R

我想写spark单元测试用例,我正在使用FunSuite。 但我希望我的sparkContext只初始化一次,由所有套件使用,然后在所有套件完成时终止

abstract class baseClass extends FunSuite with BeforeAndAfter{
  before {
    println("initialize spark context")
  }
  after {
    println("kill spark context")
  }

}



@RunWith(classOf[JUnitRunner])
class A extends baseClass{
test("for class A"){
//assert
}

@RunWith(classOf[JUnitRunner])
class B extends baseClass{
test(for class b){
//assert
}
}
但是当我运行sbt测试时 我可以看到两个测试都调用了println语句基类。当为类A和B创建对象时,抽象 基类被称为。
但是,我们如何才能达到我的目的,即在所有测试用例都运行时,spark上下文只被初始化一次

选项1:使用出色的库来实现这一点(并提供许多其他好的处理)。在阅读自述之后,它就像在
SharedParkContext
而不是
baseClass
中混合一样简单,您将有一个
sc:SparkContext
值可以在测试中使用


选项2:要自己动手,您需要在
之前和之后混入
而不是
之前和之后混入
,并在
之前和之后实施
,这正是上面提到的
SharedParkContext
所做的。

如果您真的想在套件之间共享上下文,则必须将其设置为静态。然后,您可以使用
lazy
值使其在首次使用时启动。至于关闭它,您可以将它留给每次创建上下文时创建的自动关闭挂钩

它看起来像:

abstract class SparkSuiteBase extends FunSuite {
    lazy val sparkContext = SparkSuiteBase.sparkContext
}

// putting the Spark Context inside an object allows reusing it between tests
object SparkSuiteBase {
    private lazy val sparkContext = ??? // create the context here
}

我强烈建议使用
spark测试库
在测试期间管理sparkContext或sparkSession的生命周期。 您不必通过覆盖
之前
之后
方法以及管理
sparkSession
/
sparkContext
的生命周期来污染测试

通过覆盖以下方法,您可以为所有测试共享一个
sparkSession
/
sparkContext
def reusecontextifmably:Boolean=true

有关详细信息:


我希望有帮助

我已经提供了类似的答案并删除了。根据评论(“不要认为这是可行的,它显示了相同的结果。两个测试类都调用了print语句”),我相信OP希望所有套件都具有相同的上下文。是的。使用选项2后:sbt测试打印语句两次。初始化spark上下文初始化spark上下文kill spark上下文kill spark上下文Yes..我相信我的项目中的两个类创建了两个不同的套件。所以我的要求是在不同的套房之间共享sc。我已经把我的问题编辑成了一行。。偏离原问题的。有没有办法将这两个类A和B添加到一个套件中?扩展FunSuite的类就是套件。。所以我不知道怎么做。您可以在一个套件类中创建多个测试来测试多个类-不确定通过分离A和B来实现什么区别。我想在不同的测试类中测试不同的src类。所以,我们考虑创建两个不同的测试类A和B,这是有意义的,但是,为什么要坚持使用单个套件呢?无论如何,这确实是离题了,请说明您最初的问题是否得到了回答。注意:使用spark testing base在某个时候会让您使用hive,这可能不是您想要的。