集成测试Hive作业

yon*_*oni 71 java testing hadoop hive mapreduce

我正在尝试使用Hive Thrift和JDBC接口编写一个非平凡的Hive作业,而我在设置一个像样的JUnit测试时遇到了麻烦.非平凡,我的意思是这项工作至少会产生一个MapReduce阶段,而不是只处理Metastore.

测试应该启动一个Hive服务器,将一些数据加载到一个表中,在该表上运行一些非平凡的查询,并检查结果.

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

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

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

经过三天试图纠缠Hive集成测试后,我想我会问社区:

  1. 你如何推荐我集成测试Hive工作?
  2. 您是否有使用内存HDFS,MR和Hive实例的集成测试Hive作业的JUnit示例?

我看过的其他资源:

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

oby*_*by1 12

理想情况下,人们可以测试配置单元查询,LocalJobRunner而不是诉诸迷你集群测试.但是,由于HIVE-3816正在运行配置单元,mapred.job.tracker=local导致调用系统上安装的配置单元CLI可执行文件(如您的问题中所述).

在解决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"));
Run Code Online (Sandbox Code Playgroud)

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


Luí*_*hin 5

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

  • 非常有趣的项目。看来Hive版本有一些限制,但是我肯定会在下一个项目中研究它。目前,我将@ oby1的答案作为最佳选择,但是如果人们继续报告HiveRunner成功,我将继续进行切换。 (2认同)