3

我使用 Spark 1.6。

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

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

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

据我了解,当多个 HiveContexts 或多个进程尝试访问 metastore_db 时,就会出现此问题。但是我在本地机器上运行一个测试并且没有其他作业,所以我无法理解多个进程的来源

4

3 回答 3

1

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

爪哇:

FileUtils.deleteDirectory(new Path(path of metastore_db));
于 2017-12-21T20:28:16.370 回答
0

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

write 和 read 方法在同一进程中创建自己的 HiveContext,从而导致 Metastore 上的锁定。我猜当它是 SqlContext 时它不是一个阻止程序,因为不需要本地元存储。

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

于 2017-06-05T08:38:32.777 回答
0

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

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

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

after { 
 sparkSession.stop() 
}
于 2020-04-26T11:30:38.353 回答