在单元测试之间,SparkSession无法正常关闭

时间:2018-12-10 21:34:07

标签: apache-spark testing apache-spark-sql derby

我有一些需要具有自己的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,以便我可以创建一个新的。这样不对吗我该怎么做?

1 个答案:

答案 0 :(得分:1)

一种实现方法是禁用Spark应用程序项目的并行测试执行,以确保当时只有一个Spark Session对象实例处于活动状态。在sbt语法中,它是这样的:

  project.in(file("your_spark_app"))
    .settings(parallelExecution in Test := false)

缺点是,这是针对每个项目的设置,并且也会影响从并行化中受益的测试。一种解决方法是为Spark测试创建一个单独的项目。