java集成测试hive作业

balp4ylt  于 2021-06-04  发布在  Hadoop
关注(0)|答案(6)|浏览(422)

我正在尝试使用hive-thrift和jdbc接口编写一个非常简单的hive作业,但是在设置一个像样的junit测试时遇到了问题。我的意思是,该作业至少会导致一个mapreduce阶段,而不是只处理元存储。
测试应该启动一个配置单元服务器,将一些数据加载到一个表中,在该表上运行一些非常重要的查询,并检查结果。
我已经根据spring引用建立了一个spring上下文。但是,作业在mapreduce阶段失败,并抱怨不存在hadoop二进制文件:
java.io.ioexception:无法运行程序“/usr/bin/hadoop”(在目录“/users/yoni/opower/workspace/intellij\u project\u root”中):错误=2,没有这样的文件或目录
问题是,配置单元服务器在内存中运行,但依赖于配置单元的本地安装才能运行。为了使我的项目自包含,我需要嵌入hive服务,包括hdfs和mapreduce集群。我尝试过使用相同的spring方法启动一个配置单元服务器,并将其指向minidfscluster和minircluster,类似于配置单元qtestutil源代码和hbasetestutility中使用的模式。然而,我没能让它发挥作用。
经过三天的努力,我想我应该问问社区:
您建议我如何集成测试配置单元作业?
您是否有使用内存中hdfs、mr和hive示例进行集成测试的junit示例?
我看到的其他资源:
单元测试教程
Spring Hive示例
编辑:我完全知道,使用hadoop集群(无论是本地的还是远程的)可以对一个完整的堆栈配置单元示例运行集成测试。如前所述,问题是这不是有效测试配置单元工作流的可行解决方案。

u1ehiz5o

u1ehiz5o1#

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

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

请注意配置文档中给出的警告:
确定本地任务(通常是mapjoin哈希表生成阶段)是否在单独的jvm中运行(建议使用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);
    }
  }

默认配置值导致 executeInChildVM() 方法,该方法 hadoop jar . 另一个代码路径到目前为止已经在我的测试中解决了。可能的内存问题可以通过调整java堆配置(xmx、xms等)来解决。

nfzehxib

nfzehxib2#

我已经实现了hiverunner。
https://github.com/klarna/hiverunner
我们在mac上测试了它,在windows上遇到了一些问题,但是下面列出了一些变化,util运行良好。
对于windows,这里是为了让hiverunner在windows环境中工作而做的一些更改。在这些更改之后,可以对所有配置单元查询进行单元测试。
1.克隆项目https://github.com/steveloughran/winutils 在计算机上的任何位置,添加一个新的环境变量hadoop\u home,指向该文件夹的/bin目录。不允许正斜杠或空格。2.克隆项目https://github.com/sakserv/hadoop-mini-clusters 到你电脑上的任何地方。添加一个新的环境变量hadoop\u windows\u libs,指向该文件夹的/lib目录。同样,不允许正斜杠或空格。3.我还安装了cygwin,假设severla win utils for linux可能通过提供。
这种对gitbub的拉动有助于它在windows上工作,https://github.com/klarna/hiverunner/pull/63

jgwigjjp

jgwigjjp3#

理想情况下,可以使用 LocalJobRunner 而不是求助于小型集群测试。但是,由于hive-3816运行hive mapred.job.tracker=local 导致对系统上安装的配置单元cli可执行文件的调用(如问题中所述)。
在解决hive-3816之前,小型集群测试是唯一的选择。下面是我针对CDH4.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进程进行测试。您可以通过将jdbc连接url设置为 jdbc:hive2:///

bcs8qyzn

bcs8qyzn4#

我来找一个很好的工具:hiverunner。它是junit之上的一个测试配置单元脚本的框架。在引擎盖下,它启动一个独立的hiveserver,内存中的hsql作为元存储。

u0njafvf

u0njafvf5#

hive只支持嵌入式模式,因为存储hive表元信息的rdbms可以在本地或独立服务器上运行(请参阅https://cwiki.apache.org/confluence/display/hive/hiveclient 详细信息)。此外,hive及其附带的数据库仅仅是一系列mapreduce作业的编排器,这需要hadoop框架也在运行。
我建议使用这个具有预配置hadoop堆栈的虚拟机http://hortonworks.com/products/hortonworks-sandbox/ . hortonworks是两个领先的hadoop分发提供商之一,因此受到了很好的支持。

dsekswqp

dsekswqp6#

另一个蜂群少年跑在https://github.com/edwardcapriolo/hive_test

相关问题