我使用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时,会出现问题。但是我在本地计算机上运行单个测试而没有其他任务,因此我无法理解多个进程的来源
当HiveContext被实例化时,它会在测试路径中创建一个名为metastore_db的Metastore目录。因此,在测试后删除此目录将允许您再次创建HiveContext。
Java的:
FileUtils.deleteDirectory(new Path(path of metastore_db));
弄清楚我收到错误的原因。在单元测试中,我们将数据写入本地文件系统上的ORC,然后读取以验证写入是否正确完成。
write和read方法在同一个进程中创建了自己的HiveContexts,导致了对Metastore的锁定。我猜测,当它是SqlContext时,它不是一个阻止器,因为不需要本地Metastore。
我们现在已经开始在构建持久性服务时创建HiveContext。在语义上更有意义。选择此选项而不是为每个测试创建和销毁新的SparkContext(以及新的HiveContext),因为这会给我们的测试套件增加相当大的开销而不会带来太多好处(如果您有不同的意见,请纠正我)