集成测试 Hive 作业

2022-08-31 14:03:14

我正在尝试使用Hive Thrift和JDBC接口编写一个不平凡的Hive作业,并且我在设置一个体面的JUnit测试时遇到问题。通过非平凡,我的意思是这项工作至少会导致一个MapReduce阶段,而不是只处理元存储。

测试应启动 Hive 服务器,将一些数据加载到表中,对该表运行一些重要的查询,并检查结果。

我根据Spring参考连接了Spring上下文。但是,该作业在MapReduce阶段失败,抱怨没有Hadoop二进制文件存在:

java.io.IOException:无法运行程序“/usr/bin/hadoop”(在目录“/Users/yoni/opower/workspace/intellij_project_root”中):error=2,没有这样的文件或目录

问题是 Hive 服务器在内存中运行,但依赖于 Hive 的本地安装才能运行。为了使我的项目是独立的,我需要嵌入Hive服务,包括HDFS和MapReduce集群。我尝试使用相同的Spring方法启动Hive服务器,并将其指向MiniDFSClusterMiniMRCluster,类似于Hive QTestUtil源代码和HBaseTestUtility中使用的模式。但是,我无法让它发挥作用。

经过三天的尝试,Hive集成测试,我想我会问社区:

  1. 你如何推荐 I 集成测试 Hive 作业?
  2. 您是否有一个工作 JUnit 示例,用于使用内存中 HDFS、MR 和 Hive 实例对 Hive 作业进行集成测试?

我查看的其他资源:

编辑:我完全知道,针对Hadoop集群(无论是本地还是远程)工作可以针对全栈Hive实例运行集成测试。如前所述,问题在于这不是有效测试 Hive 工作流的可行解决方案。


答案 1

理想情况下,人们将能够测试蜂巢查询,而不是诉诸于迷你集群测试。但是,由于 HIVE-3816 运行 hive 并导致调用系统上安装的 hive CLI 可执行文件(如您的问题中所述)。LocalJobRunnermapred.job.tracker=local

在解决 HIVE-3816 之前,小型群集测试是唯一的选择。以下是我针对CDH 4.4测试的蜂巢测试的最小迷你集群设置。

Configuration conf = new Configuration();

/* Build MiniDFSCluster */
MiniDFSCluster miniDFS = new MiniDFSCluster.Builder(conf).build();

/* Build MiniMR Cluster */
System.setProperty("hadoop.log.dir", "/path/to/hadoop/log/dir"); // MAPREDUCE-2785
int numTaskTrackers = 1;
int numTaskTrackerDirectories = 1;
String[] racks = null;
String[] hosts = null;
miniMR = new MiniMRCluster(numTaskTrackers, miniDFS.getFileSystem().getUri().toString(),
                           numTaskTrackerDirectories, racks, hosts, new JobConf(conf));

/* Set JobTracker URI */
System.setProperty("mapred.job.tracker", miniMR.createJobConf(new JobConf(conf)).get("mapred.job.tracker"));

无需运行单独的 hiveserver 或 hiveserver2 进程进行测试。您可以使用嵌入式 hiveserver2 进程进行测试,方法是将 jdbc 连接 URL 设置为jdbc:hive2:///


答案 2

我来找一个非常好的工具:HiveRunner。它是jUnit之上的框架,用于测试hive脚本。在引擎盖下,它启动一个独立的HiveServer,内存中的HSQL作为元存储。