我有一些需要具有自己的sparkSession的单元测试。我扩展了SQLTestUtils,并覆盖了许多其他Spark单元测试中使用的beforeAll和afterAll函数(来自源代码)。我有一些看起来像这样的测试套件:
class MyTestSuite extends QueryTest with SQLTestUtils {
protected var spark: SparkSession = null
override def beforeAll(): Unit = {
super.beforeAll()
spark = // initialize sparkSession...
}
override def afterAll(): Unit = {
try {
spark.stop()
spark = null
} finally {
super.afterAll()
}
}
// ... my tests ...
}
如果我运行其中之一,就可以了,但是如果我运行两个或多个,则会出现此错误:
原因:错误XSDB6:Derby的另一个实例可能已经启动了数据库/ home / jenkins / workspace / Query / apache-spark / sql / hive-thriftserver-cat-server / metastore_db。
但是我认为afterAll()
应该正确关闭spark,以便我可以创建一个新的。这样不对吗我该怎么做?
答案 0 :(得分:1)
一种实现方法是禁用Spark应用程序项目的并行测试执行,以确保当时只有一个Spark Session对象实例处于活动状态。在sbt语法中,它是这样的:
project.in(file("your_spark_app"))
.settings(parallelExecution in Test := false)
缺点是,这是针对每个项目的设置,并且也会影响从并行化中受益的测试。一种解决方法是为Spark测试创建一个单独的项目。