【发布时间】:2018-09-16 21:47:34
【问题描述】:
我正在使用带有 Scala 2.11 的 spark-hive 2.3.0 并设置了一个单元测试框架。 spark-hive 带有 TestHiveContext 和 TestHiveSparkSession,它们可以方便地从单元测试中调用 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 中对其进行更改,但是当我创建 TestHiveContext 时,我的更改后来被 HiveUtils 吹走了。
在我的情况下,内存数据库更可取,因为我们的开发人员在 Windows 上运行(绝对不是我/我们的选择),并且在创建这些文件时,通常会出现权限或文件名中的无效字符等问题(因为 Hadoop 是从来没有真正打算在 Windows 上工作),并且这些文件经常被遗忘,因为它们无法清理(由于这些问题)。我们希望测试是完全独立的,因此它们可以在没有副作用的情况下运行和完成,因此它们可以在多个环境(开发人员、CI、Jenkins、AWS 等)中运行。
有趣的是,我在TestHive.scala 看到了这个:
{ // set the metastore temporary configuration
val metastoreTempConf = HiveUtils.newTemporaryConfiguration(useInMemoryDerby = false) ++ Map(
所以有一个使用内存数据库的标志,但这是不可配置的,并且没有将其设置为 true 的代码路径。
有没有什么方法可以配置或编写这个,以便TestHive 的 Derby 可以在内存中?尝试通过 hive-site.xml 或 hdfs-site.xml 设置 javax.jdo.option.ConnectionURL 的值不起作用,我认为这是因为 TestHive、TestHiveContext 和 TestHiveSparkSession 的初始化方式,它们有自己的自己的代码路径与非测试路径分开。它们提供的功能对测试框架非常有帮助,但显然没有提供覆盖此值和其他一些设置的方法。
到目前为止,我能看到的最佳选择是重写或编写我自己的 TestHiveContext 类,该类从该类中借用了一堆功能并重写了我需要的部分,但我认为这是一项相对较大的任务只需简单的配置更改即可完成。
【问题讨论】:
-
如何使用标准方式配置 Hive(或任何其他使用 Hadoop 配置库的 Hadoop 生态系统组件),即创建一个
hive-site.xml配置文件,并添加 目录 i> 包含该文件到 CLASSPATH? -
作为记录,当使用 shell 启动器时,例如
spark-submit,脚本将$SPARK_CONF_DIR添加到 CLASSPATH 中,这意味着它是拥有 Log4J 和 Hive 配置文件的正确位置。除其他外。 -
我尝试使用 hive-site.xml 或 hdfs-site.xml 配置此参数,但没有成功,我在原始帖子中添加了详细信息。
标签: unit-testing hive derby scalatest