代码之家  ›  专栏  ›  技术社区  ›  user3685285

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

  •  1
  • user3685285  · 技术社区  · 6 年前

    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 ...
    
    }
    

    原因:ERROR XSDB6:Derby的另一个实例可能已经启动了数据库/home/jenkins/workspace/Query/apache spark/sql/hive thriftserver cat server/metastore_db。

    但我认为 afterAll() 我应该正确地关闭spark以便我可以创建一个新的。这不对吗?我该怎么做?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Denis Makarenko    6 年前

    一种方法是禁用Spark应用程序项目的并行测试执行,以确保此时只有一个Spark会话对象实例处于活动状态。在sbt语法中,它将如下所示:

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

    缺点是,这是每个项目的设置,它也会影响将受益于并行化的测试。解决方法是为Spark测试创建一个单独的项目。