SparkSession не закрывается должным образом между юнит-тестами - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть несколько модульных тестов, которые должны иметь свой собственный sparkSession.Я расширил SQLTestUtils и переопределяю функции beforeAll и afterAll, которые используются во многих других тестах Spark Unit (из источника).У меня есть несколько наборов тестов, которые выглядят примерно так:

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() должен был должным образом отключить искру, чтобы я мог создать новую.Разве это не правильно?Как мне это сделать?

1 Ответ

0 голосов
/ 11 декабря 2018

Один из способов сделать это - отключить параллельное выполнение теста для проекта приложения Spark, чтобы убедиться, что в данный момент активен только один экземпляр объекта Spark Session.В синтаксисе sbt это будет выглядеть так:

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

Недостатком является то, что это настройка для проекта и это также повлияет на тесты, которые выиграют от распараллеливания.Обходным путем будет создание отдельного проекта для тестов Spark.

...