为什么单个测试失败"错误XSDB6:另一个Derby实例可能已经启动了数据库"?

时间:2017-06-02 06:56:27

标签: apache-spark hdfs apache-spark-sql derby apache-spark-1.6

我使用Spark 1.6。

我们有一个使用SqlContext写入HDFS的HDFS写入方法。现在我们需要切换到使用HiveContext。当我们这样做时,现有的单元测试不运行并给出错误

Error XSDB6: Another instance of Derby may have already booted the database <local path>\metastore_db

无论是通过IntelliJ测试运行器还是通过命令行上的maven运行单个测试,都会发生这种情况。

据我所知,当多个HiveContexts或多个进程试图访问metastore_db时会出现问题。但是,我在本地计算机上运行单个测试并且没有其他任务,因此我无法理解多个进程的来源

3 个答案:

答案 0 :(得分:1)

当HiveContext被实例化时,它会在您的测试路径中创建一个名为metastore_db的Metastore目录。因此,在测试后删除此目录将允许您再次创建HiveContext。

爪哇:

FileUtils.deleteDirectory(new Path(path of metastore_db));

答案 1 :(得分:0)

弄清楚我收到错误的原因。在单元测试中,我们将数据写入本地文件系统上的ORC,然后读取以验证写入是否正确完成。

write和read方法在同一进程中创建了自己的HiveContexts,导致了对Metastore的锁定。我猜测,当它是SqlContext时,它不是一个阻止器,因为不需要本地Metastore。

我们现在已经开始在构建持久性服务时创建HiveContext。在语义上更有意义。选择此选项而不是为每个测试创建和销毁新的SparkContext(以及新的HiveContext),因为这会给我们的测试套件增加相当大的开销而不会带来太多好处(如果您有不同的意见,请纠正我)

答案 2 :(得分:0)

即使我正在运行测试套件,也遇到相同的错误。

我可以成功运行单个测试文件,但是当我运行套件时,一些测试仍然失败。有很多使用SparkSession在本地文件系统中进行IO的测试。

在这种情况下,请在每个测试文件中使用after方法(在我的情况下,在1-2个文件中丢失)来关闭该会话。

after { 
 sparkSession.stop() 
}
相关问题