文章目录
友情提示: 若想减少服务器上maven编译出错的概率,可以选择将源码放在本地使用idea打开,修改源码并编译(最终失败,可能idea问题),但是这样确保我们修改的代码一定是正确的,以及本地仓库包含了几乎所有的jar。然后打包本地仓库上传服务以及修改的代码替换服务器上的解压后的类。
1.下载源码
我的hadoop版本环境使用的是hadoop-2.6.0-cdh5.7.0,故我从CDH组件仓库下载对应的hive版本源码。
2.编译支持UDF
使用的是maven进行编译的。这里已省略maven的安装和配置,本人想直接使用idea编译hive但是但是,尝试类几个小时编译还是会报错,最终还是老老实实在服务器上用mvn编译类。
2.1 上传解压
#上传
[hadoop@hadoop001 source]$ rz
[hadoop@hadoop001 source]$ ll
-rw-r--r--. 1 hadoop hadoop 14652104 Apr 18 2019 hive-1.1.0-cdh5.7.0-src.tar.gz
#解压
[hadoop@hadoop001 source]$ tar -zxvf hive-1.1.0-cdh5.7.0-src.tar.gz -C ~/source/
2.2 添加UDF函数类
HelloUDF.java是我之前已经写好的UDF函数类,UDF编程详情可翻阅上一篇博客,将该类添加到hive-1.1.0-cdh5.7.0\ql\src\java\org\apache\hadoop\hive\ql\udf 目录下,注意修改该类中的包名称。
#添加之前写好的HelloUDF类
[hadoop@hadoop001 udf]$ ll
total 344
-rw-r--r--. 1 hadoop hadoop 567 Apr 20 2019 AddPre.java
drwxrwxr-x. 2 hadoop hadoop 12288 Mar 24 2016 generic
-rw-r--r--. 1 hadoop hadoop 409 Apr 20 2019 HelloUDF.java
drwxrwxr-x. 2 hadoop hadoop 4096 Mar 24 2016 ptf
-rw-r--r--. 1 hadoop hadoop 649 Apr 20 2019 RemovePre.java
#修改HelloUDF.java 的package名为 org.apache.hadoop.hive.ql.udf
[hadoop@hadoop001 udf]$ cd ~/source/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/udf/
[hadoop@hadoop001 udf]$ vim HelloUDF.java
package org.apache.hadoop.hive.ql.udf;
2.3注册函数
修改FunctionRegistry.java类,注册类一个叫say_hell0的函数
[hadoop@hadoop001 exec]$ cd ~/source/hive-1.1.0-cdh5.7.0/ql/src/java/org/apache/hadoop/hive/ql/exec/
#在static代码块添加注册信息
[hadoop@hadoop001 exec]$ vim FunctionRegistry.java
system.registerUDF("say_hell0", HelloUDF.class,false);
2.4编译hive
mvn clean package -DskipTests -Phadoop-2 -Pdist
[hadoop@hadoop001 ~]$ cd ~/source/hive-1.1.0-cdh5.7.0
#进行编译,第一次编译会耗时很久需要耐心等待,等到出现succfule即成功
[hadoop@hadoop001 hive-1.1.0-cdh5.7.0]$ mvn clean package -DskipTests -Phadoop-2 -Pdist
#查看编译好的包,apache-hive-1.1.0-cdh5.7.0-bin.tar.gz 即是我需要的包
[hadoop@hadoop001 target]$ cd ~/source/hive-1.1.0-cdh5.7.0/packaging/target/
[hadoop@hadoop001 target]$ ll
total 129092
drwxrwxr-x. 2 hadoop hadoop 4096 Apr 15 10:19 antrun
drwxrwxr-x. 3 hadoop hadoop 4096 Apr 15 10:20 apache-hive-1.1.0-cdh5.7.0-bin
-rw-rw-r--. 1 hadoop hadoop 105725582 Apr 15 10:21 apache-hive-1.1.0-cdh5.7.0-bin.tar.gz
-rw-rw-r--. 1 hadoop hadoop 12610961 Apr 15 10:21 apache-hive-1.1.0-cdh5.7.0-jdbc.jar
-rw-rw-r--. 1 hadoop hadoop 13826134 Apr 15 10:21 apache-hive-1.1.0-cdh5.7.0-src.tar.gz
drwxrwxr-x. 2 hadoop hadoop 4096 Apr 15 10:20 archive-tmp
drwxrwxr-x. 3 hadoop hadoop 4096 Apr 15 10:19 maven-shared-archive-resources
drwxrwxr-x. 3 hadoop hadoop 4096 Apr 15 10:19 tmp
drwxrwxr-x. 2 hadoop hadoop 4096 Apr 15 10:19 warehouse
3.部署安装
省略,请参考Hive之快速入门以及安装部署
部署过程注意不要与已经安装的hive冲突,尤其是执行hive命令,运行的确实以前的hive组件。
4.测试UDF
#查看 函数
hive> show functions;
此时我们可以看到一个名为say_hell0的函数,不要添加jar包即可实现了自定义函数的使用
#运行函数
hive> select say_hell0("666");
OK
hello:666
Time taken: 0.888 seconds, Fetched: 1 row(s)
hive> select rm_pre("3_wsk");
OK
wsk
Time taken: 0.183 seconds, Fetched: 1 row(s)
至此结合前面的UDF编程,从UDF编程到函数创建以及源码编译整个流程走了一遍。