集成testingHive作业

我正在尝试使用Hive Thrift和JDBC接口编写一个不重要的Hive作业,并且在设置一个体面的JUnittesting时遇到了麻烦。 通过非平凡的方式,我的意思是说,至less在一个MapReduce阶段完成工作,而不是只处理Metastore。

testing应该启动一个Hive服务器,将一些数据加载到表中,在该表上运行一些不重要的查询,然后检查结果。

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

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

问题是,Hive服务器正在内存中运行,但依靠Hive的本地安装才能运行。 对于我的项目是独立的,我需要embeddedHive服务,包括HDFS和MapReduce集群。 我尝试使用相同的Spring方法启动一个Hive服务器,并将它指向MiniDFSCluster和MiniMRCluster ,类似于Hive QTestUtil源代码和HBaseTestUtility中使用的模式。 但是,我一直无法得到这个工作。

经过三天的争取Hive集成testing,我想我会问社区:

  1. 你如何build议我集成testingHive作业?
  2. 你有一个工作JUnit示例集成testing使用内存中的HDFS,MR和Hive实例的Hive作业吗?

我看过的其他资源:

  • Hiveunit testing教程
  • Spring Hive示例

编辑:我完全意识到,针对Hadoop集群(无论是本地还是远程),可以对整个堆叠的Hive实例运行集成testing。 正如所述,问题在于,这不是有效testingHive工作stream的可行解决scheme。

理想情况下,人们可以使用LocalJobRunnertestingconfiguration单元查询,而不是使用小型集群testing。 但是,由于HIVE-3816运行configuration单元, mapred.job.tracker=local调用系统上安装的hive CLI可执行文件(如您的问题中所述)。

在HIVE-3816解决之前,微型集群testing是唯一的select。 下面是我已经用CDH 4.4testing过的一个最小化的迷你集群设置。

 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进程进行testing。 您可以通过将jdbc连接URL设置为jdbc:hive2:///来testingembedded式hiveserver2进程jdbc:hive2:///

我来找一个不错的工具: HiveRunner 。 它是jUnit之上的框架来testingconfiguration单元脚本。 在引擎盖下,它启动一个独立的HiveServer,内存HSQL作为Metastore。

Hive仅支持embedded模式,因为存储Hive表元信息的RDBMS可以在本地运行,也可以在独立服务器上运行(有关详细信息,请参阅https://cwiki.apache.org/confluence/display/Hive/HiveClient )。 而且,与其相伴的数据库configuration单元只是一串MapReduce作业的编排器,这也需要Hadoop框架的运行。

我build议使用具有预configuration的Hadoop堆栈的虚拟机http://hortonworks.com/products/hortonworks-sandbox/ 。 Hortonworks是两家领先的Hadoop分发提供商之一,因此得到了很好的支持。

我不确定自2014年2月接受的答案以来发生了什么变化,但是从Hive 1.2.0开始,下面围绕OP描述的问题开​​展工作:

 System.setProperty(HiveConf.ConfVars.SUBMITLOCALTASKVIACHILD.varname, "false"); 

请注意configuration文件中给出的警告:

确定本地任务(通常是mapjoin哈希表生成阶段)是否在单独的JVM中运行(build议使用true)。 避免产生新JVM的开销,但可能导致内存不足的问题。

这可以解决这个问题,因为在MapredLocalTask.java

  @Override public int execute(DriverContext driverContext) { if (conf.getBoolVar(HiveConf.ConfVars.SUBMITLOCALTASKVIACHILD)) { // send task off to another jvm return executeInChildVM(driverContext); } else { // execute in process return executeInProcess(driverContext); } } 

默认的configuration值会导致调用executeInChildVM()方法,它实际上调用了hadoop jar 。 另一个代码path到目前为止在我的testing中已经解决了。 潜在的内存问题很可能通过调整Java堆configuration(Xmx,Xms等)来解决。

另一个Hive JUnit跑步者在https://github.com/edwardcapriolo/hive_test