gpt4 book ai didi

unit-testing - 如何使用内存中的 Derby 数据库进行 Hive (Scala) 测试

转载 作者:行者123 更新时间:2023-12-04 04:15:06 24 4
gpt4 key购买 nike

我正在使用带有 Scala 2.11 的 spark-hive 2.3.0 并设置了一个单元测试框架。 spark-hive 自带 TestHiveContextTestHiveSparkSession它可以方便地从单元测试中调用 Hive,而无需运行 Hadoop、Spark 或集群,这非常适合自动化测试。

Hive 的元存储需要一个数据库,当以这种方式运行时,它使用 Derby 作为配置为 javax.jdo.option.ConnectionURL 的嵌入式数据库。默认为 jdbc:derby:;databaseName=<file-path>;create=true . <file-path>是本地文件系统中的一个位置,并且是运行 Derby 的一个选项。

另一种选择是在内存中运行 Derby,这通常很简单,只需将此 URL 更改为类似 jdbc:derby:memory:databaseName;create=true 的内容即可。 .然而,这在 Hive 中是不可能的,因为配置是在内部 HiveUtils 中进行的。类,不能被覆盖。我尝试在我的 Spark Session Builder 中更改它,但我的更改后来被 HiveUtils 吹走了当我创建我的 TestHiveContext .

在我的情况下,内存数据库更可取,因为我们的开发人员在 Windows 上运行(绝对不是我/我们的选择),并且在创建这些文件时,通常会出现诸如权限或文件名中的无效字符之类的问题(因为 Hadoop 从未真正打算在 Windows 上工作),并且这些文件经常被遗忘,因为它们无法被清理(由于这些问题)。我们希望测试是完全独立的,因此它们可以在没有副作用的情况下运行和完成,因此它们可以在多个环境(开发人员、CI、Jenkins、AWS 等)中运行。

有趣的是,我在 TestHive.scala 中看到了这一点:

{ // set the metastore temporary configuration
val metastoreTempConf = HiveUtils.newTemporaryConfiguration(useInMemoryDerby = false) ++ Map(

所以有一个使用内存数据库的标志,但这是不可配置的,并且没有将其设置为 true 的代码路径.

有什么方法可以配置或编写它以便 TestHive的 Derby 可以在内存中吗?试图设置 javax.jdo.option.ConnectionURL 的值通过 hive-site.xml 或 hdfs-site.xml 都不起作用,我认为这是因为 TestHive , TestHiveContextTestHiveSparkSession初始化后,它们有自己的代码路径,与非测试路径分开。它们提供的功能对测试框架非常有帮助,但显然没有提供覆盖此值和其他一些设置的方法。

到目前为止,我能看到的最佳选择是覆盖或编写我自己的 TestHiveContext类从该类中借用了一堆功能并覆盖了我需要的部分,但对于我认为可以通过简单的配置更改来完成的事情来说,这是一个相对较大的任务。

最佳答案

我终于想出了如何做到这一点,并想分享答案,以防其他人试图做同样的事情。

我的测试类使用 SharedSparkContext特征,它提供了 SparkContext通过 var sc 引用.

初始化 SparkContext 后(我使用了 beforeAll 测试框架中提供的 scalatest Hook ),我创建了一个 TestHiveContext像这样:

hc = new TestHiveContext(sc, false)

然后紧接着,我可以设置 javax.jdo.option.ConnectionURL大概还有一些其他的 Hadoop 和 Hive 配置,如下所示:
sc.hadoopConfiguration.set("javax.jdo.option.ConnectionURL", 
"jdbc:derby:memory:db;create=true")

此配置参数由 Hive 使用,但显然必须添加到用于构建 Hive 测试上下文的 Hadoop 配置中。

诀窍是时机,这必须在 Hadoop 和 Hive 初始化自己(使用配置文件和诸如此类)之后完成,并且 scalatest 框架也被初始化,最后在 TestHive 框架初始化之后,但在你运行任何测试之前.尝试在这些其他初始化之前设置此参数意味着您的设置将在测试运行之前被覆盖。

关于unit-testing - 如何使用内存中的 Derby 数据库进行 Hive (Scala) 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49700009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com