大数据集群下,共有三种管理Hive UDF的方式,如下:
名称重启Hive服务Jar保存目录场景直接JAR配置需要HDFS开发辅助JARs目录配置需要本地目录防止意外覆盖文件可重载辅助JAR配置不需要本地目录频繁更新UDF场景{HIVE_HOME}/auxlib目录需要本地目录不建议{HIVE_HOME}/lib目录需要本地目录不建议
下面将详细介绍以上几种方式。
1 编译 UDF 包
HelloUDF.java
package org.song.udf;import org.apache.hadoop.hive.ql.exec.UDF;public class HelloUDF extends UDF { public String evaluate(String s){ if (s == null){ return null; } return "Hello " + s.toString(); }}pom.xml
org.apache.hadoop hadoop-common 3.3.4 org.apache.hive hive-exec 3.1.3 mvn package执行 mvn package 得到 UDF jar包 HelloUDF-1.0.jar
2 直接Jar方式
添加UDF
上传UDF Jar到HDFS
hdfs dfs -put HelloUDF-1.0.jar /tmp添加jar包到Hivepath
beeline -u "jdbc:hive2://test.bigdata.com:10000" -n "song" -p ""add jar hdfs:///tmp/HelloUDF-1.0.jar;add jar 建议制定一个HDFS路径,jar包上传到HDFS上,这样比较方便。如果指定是本地路径,则需要确保每个hive shell节点上的对应位置上都放置了需要的jar包,这样操作起来比较麻烦。
注册函数
create function HelloUDF as 'org.example.HelloUDF' USING JAR 'hdfs:///tmp/HelloUDF-1.0.jar';查看结果
select HelloUDF("Hive");+-------------+| _c0 |+-------------+| Hello Hive |+-------------+对当前beeline session有效,退出session后无效;重启hiveserver2后,对所有beeline有效。
删除UDF
在beeline中(所有hiveserver2)执行:
drop function HelloUDF;delete jar hdfs:///tmp/HelloUDF-1.0.jar;这一步操作需要在所有hiveserver2节点删除,只在一个节点上操作,用beeline连接其他节点UDF函数还会存在。或者只beeline一个hiveserver2删除,重启所有hiveserver2后,生效。
在hdfs上进行删除:
hdfs dfs -rm /tmp//tmp/HelloUDF-1.0.jar更新UDF
先执行删除UDF步骤
# 上传新的jar包hdfs dfs -put HelloUDF-1.0.jar /tmpbeeline -u "jdbc:hive2://test.bigdata.com:10000" -n "song" -p ""add jar hdfs:///tmp/HelloUDF-1.0.jar;create function HelloUDF as 'org.example.HelloUDF';select HelloUDF("Hive");+----------------+| _c0 |+----------------+| HelloTwo Hive |+----------------+3 辅助Jar目录
Variable NameDescriptionhive.aux.jars.pathThe location of the plugin jars that contain implementations of user defined functions and SerDes.
上传并配置
mkdir -p /usr/local/hive/auxjarcp HelloUDF-1.0.jar /usr/local/hive/auxjar如果 Hive Metastore 与 HiveServer2 不在同另一台主机上,那么要在这两台机器上创建相同的目录,但是 JAR 文件需要上传到 HiveServer2 主机上。
在 ${HIVE_HOME}/conf/hive-site.xml下配置:
hive.aux.jars.path /usr/local/hive/auxjar重启HiveServer2使配置生效。hive-site.xml的hive.aux.jars.path对服务器有效,对当前hive shell无效。
连接方式是否有效Hive Shell无效Hive Server重启Hive服务才生效
在 ${HIVE_HOME}/conf/hive-env.sh下配置:
#本地文件路径,不支持HDFS路径export HIVE_AUX_JARS_PATH=/usr/local/hive/auxjarhive-env.sh的HIVE_AUX_JARS_PATH对服务器无效,对当前hive shell有效。
连接方式是否有效Hive Shell重启Hive服务才生效且不同的Hive Shell互不影响Hive Server无效
创建UDF
beeline -u "jdbc:hive2://test.bigdata.com:10000" -n "song" -p ""create function HelloUDF as 'org.example.HelloUDF';select HelloUDF("Hive");+-------------+| _c0 |+-------------+| Hello Hive |+-------------+更新UDF
# 删除UDF函数drop function HelloUDF;# 删除旧的jar包rm -rf /usr/local/hive/auxjar/HelloUDF-1.0.jar# 将新的UDF jar放入辅助jar目录cp HelloUDF-1.0.jar /usr/local/hive/auxjar# 重新创建udfbeeline -u "jdbc:hive2://test.bigdata.com:10000" -n "song" -p ""create function HelloUDF as 'org.example.HelloUDF';select HelloUDF("Hive");+----------------+| _c0 |+----------------+| HelloTwo Hive |+----------------+4 可重载的辅助JAR方式
Variable NameDescriptionhive.reloadable.aux.jars.pathThe location of plugin jars that can be renewed (added, removed, or updated) by executing the Beeline reload command, without having to restart HiveServer2. These jars can be used just like the auxiliaryes in hive.aux.jars.pathfor creating UDFs or SerDes. (As of Hive 0.14.0.)
上传jar并配置
mkdir -p /usr/local/hive/auxjarcp HelloUDF-1.0.jar /usr/local/hive/auxjar在 ${HIVE_HOME}/conf/hive-site.xml下配置:
hive.aux.jars.path /usr/local/hive/auxjar重启HiveServer2使配置生效。
这一步只需第一次配置可重载的辅助JAR方式时,重启一次,以后就不需要重启了。
创建UDF
beeline -u "jdbc:hive2://test.bigdata.com:10000" -n "song" -p ""create function HelloUDF as 'org.example.HelloUDF';select HelloUDF("Hive");+-------------+| _c0 |+-------------+| Hello Hive |+-------------+更新UDF
# 删除旧的jar包rm -rf /usr/local/hive/auxjar/HelloUDF-1.0.jar# 将新的UDF jar放入辅助jar目录cp HelloUDF-1.0.jar /usr/local/hive/auxjarchmod 755 /usr/local/hive/auxjar/HelloUDF-1.0.jar# 更新UDF:不需要重启hiveserver2beeline -u "jdbc:hive2://test.bigdata.com:10000" -n "song" -p ""reload;select HelloUDF("Hive");+----------------+| _c0 |+----------------+| HelloTwo Hive |+----------------+5 auxlib方式
# vim ${HIVE_HOME}/bin/hive# adding jars from auxlib directoryfor f in ${HIVE_HOME}/auxlib/*.jar; do if [[ ! -f $f ]]; then continue; fi if $cygwin; then f=`cygpath -w "$f"` fi AUX_CLASSPATH=${AUX_CLASSPATH}:$f if [ "${AUX_PARAM}" == "" ]; then AUX_PARAM=file://$f else AUX_PARAM=${AUX_PARAM},file://$f; fidone上面代码说明了添加到${HIVE_HOME}/auxlib的可行性。
上传jar
复制jar包到${HIVE_HOME}/auxlib下
# 在${HIVE_HOME}中创建文件夹auxlib,然后将自定义jar文件放入该文件夹中。cp HelloUDF-1.0.jar /usr/lib/hive/auxlib/重启hiveserver2后,才生效
添加UDF
beeline -u "jdbc:hive2://test.bigdata.com:10000" -n "song" -p ""create function HelloUDF as 'org.example.HelloUDF';select HelloUDF("Hive");+-------------+| _c0 |+-------------+| Hello Hive |+-------------+删除UDF
drop function HelloUDF;6 ${HIVE_HOME}/lib方式
复制jar包到 ${HIVE_HOME}/lib下,后面操作跟auxlib方式相同。
7 总结
建议使用 直接jar、辅助jar和 可重载辅助jar这三种方式。
直接JAR配置:设置 Hive CLI 和 Beeline(需重启Hive服务) 均适用,目录位置为hdfs文件系统。辅助jar目录:只对 Beeline 适用,Hive CLI 方式无法识别 Jar 包,需要重启hive服务。优点在于目录位置可以随意指定。可重载的辅助JAR配置方式:只对 Beeline 适用,Hive CLI 方式无法识别 Jar 包,优点在于目录位置可以随意指定,使用时需要执行执行 RELOAD 命令即可加载到新增 Jar 包,不需要重启hive服务。注意事项:
在使用的时候,如不指定库名,默认使用default库下的UDF参数,如用指定库下的UDF函数需要指定库名才能使用。如果要删除修改函数,务必先删除函数,后删除jar包,否则会报File dose not exist这个错误。出现错误后的恢复方法:重新上传与该函数创建时一致的jar包和路径,然后再删除函数,删除jar包。