参考https://cwiki.apache.org/confluence/display/Hive/HiveDeveloperFAQ#HiveDeveloperFAQ-Mavensettings
首先你得下载一分源码,这里我下载的是http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.1-src.tar.gz。(根据自己的cdh版本下载相应版本的源码)
当然编译代码得在linux环境下,解压看,cd到源码目录下面,执行mvn clean package -DskipTests -Phadoop-2 -Pdist
经过漫长的编译之后,会在源码目录下面的packaging/target目录下面生成一个tar包,相关的hive模块jar包都能在这个tar包里面找到。
比如我们改了hive的源代码,重新打了包,如何替换运行环境中cdh自身的jar包?
我修改了一下
org.apache.hive.hcatalog.templeton.tool.TempletonControllerJob
这个类的源代码,webhcat生成的所有job name在resourcemanager ui界面上都叫做TempletonControllerJob。如果有很多个任务同时执行,不好直观的看出来哪个任务执行的哪个HQL。于是改了一下代码:
private String makeJobName(String sql){
if(sql.length()<100)
return sql;
else{
return MessageFormat.format("{0}...{1}",sql.substring(0,50),sql.substring(sql.length()-50));
}
}
原来run方法里面修改成:
// job.setJobName(TempletonControllerJob.class.getSimpleName());
job.setJobName(makeJobName(args[args.length-1]));
原来就是获取类的simplename作为jobname,改成获取传入的sql,然后根据sql的长度不同采用截取部分SQL省略中间部分SQL的方式,生成jobname,这样跟HUE或者其他hive jdbc或者shell提交上来的任务在resourcemanager ui上看起来名字差不多一致了。
然后按照上面的步骤编译打包。打包好后,在tar包中找到hive-webhcat-1.1.0-cdh5.7.1.jar,替换掉集群所有节点上的/opt/cloudera/parcels/CDH/jars/hive-webhcat-1.1.0-cdh5.7.1.jar(假设你的parcels安装在/opt/cloudera/parcels目录下面)。重启一下hive服务,再提交一下webhcat rest hive查询api,再去看看resourcemanager中的jobname,变成提交的sql了。