我使用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时会出现问题。但是,我在本地计算机上运行单个测试并且没有其他任务,因此我无法理解多个进程的来源
答案 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()
}