为什么单个测试失败 "Error XSDB6: Another instance of Derby may have already booted the database"?
Why does single test fail with "Error XSDB6: Another instance of Derby may have already booted the database"?
我使用 Spark 1.6。
我们有一个使用 SqlContext
写入 HDFS 的 HDFS 写入方法。现在我们需要切换到使用 HiveContext
。当我们这样做时,现有的单元测试不会 运行 并给出错误
Error XSDB6: Another instance of Derby may have already booted the database <local path>\metastore_db
无论我 运行 通过 IntelliJ 测试 运行ner 还是通过命令行上的 maven 进行单个测试,都会发生这种情况。
据我了解,当多个 HiveContext 或多个进程试图访问 metastore_db 时,就会发生此问题。但是,我 运行 在我的本地机器上进行了一次测试,没有其他作业,所以我无法理解多个进程的来源
弄清楚为什么我会收到错误消息。在单元测试中,我们将数据写入本地文件系统上的 ORC,然后读取以验证写入是否正确完成。
写入和读取方法在同一进程中创建自己的 HiveContext,这导致元存储锁定。我猜想当它是 SqlContext 时它不是阻止程序,因为不需要本地元存储。
我们现在已经开始在构建持久性服务时创建 HiveContext。从语义上讲,这更有意义。选择这个选项而不是为每个测试创建和销毁一个新的 SparkContext(以及一个新的 HiveContext),因为这会给我们的测试套件增加相当大的开销而不会提供太多好处(如果您有不同意见,请纠正我)
当 HiveContext 被实例化时,它会在您的测试路径中创建一个名为 metastore_db 的 Metastore 目录。因此在测试后删除此目录将允许您再次创建 HiveContext。
Java:
FileUtils.deleteDirectory(new Path(path of metastore_db));
即使我在 运行测试套件中遇到了同样的错误。
我可以 运行 成功地创建单个测试文件,但是当我 运行 套件时,一些测试一直失败。有很多测试使用 SparkSession 在本地文件系统中进行 IO。
在那种情况下,在每个测试文件中使用 after
方法(在我的例子中,它在 1-2 个文件中丢失)来关闭此会话。
after {
sparkSession.stop()
}
我使用 Spark 1.6。
我们有一个使用 SqlContext
写入 HDFS 的 HDFS 写入方法。现在我们需要切换到使用 HiveContext
。当我们这样做时,现有的单元测试不会 运行 并给出错误
Error XSDB6: Another instance of Derby may have already booted the database <local path>\metastore_db
无论我 运行 通过 IntelliJ 测试 运行ner 还是通过命令行上的 maven 进行单个测试,都会发生这种情况。
据我了解,当多个 HiveContext 或多个进程试图访问 metastore_db 时,就会发生此问题。但是,我 运行 在我的本地机器上进行了一次测试,没有其他作业,所以我无法理解多个进程的来源
弄清楚为什么我会收到错误消息。在单元测试中,我们将数据写入本地文件系统上的 ORC,然后读取以验证写入是否正确完成。
写入和读取方法在同一进程中创建自己的 HiveContext,这导致元存储锁定。我猜想当它是 SqlContext 时它不是阻止程序,因为不需要本地元存储。
我们现在已经开始在构建持久性服务时创建 HiveContext。从语义上讲,这更有意义。选择这个选项而不是为每个测试创建和销毁一个新的 SparkContext(以及一个新的 HiveContext),因为这会给我们的测试套件增加相当大的开销而不会提供太多好处(如果您有不同意见,请纠正我)
当 HiveContext 被实例化时,它会在您的测试路径中创建一个名为 metastore_db 的 Metastore 目录。因此在测试后删除此目录将允许您再次创建 HiveContext。
Java:
FileUtils.deleteDirectory(new Path(path of metastore_db));
即使我在 运行测试套件中遇到了同样的错误。
我可以 运行 成功地创建单个测试文件,但是当我 运行 套件时,一些测试一直失败。有很多测试使用 SparkSession 在本地文件系统中进行 IO。
在那种情况下,在每个测试文件中使用 after
方法(在我的例子中,它在 1-2 个文件中丢失)来关闭此会话。
after {
sparkSession.stop()
}