Hive管理UDF详解

本文详细介绍了大数据集群下管理Hive UDF的三种方式:直接Jar方式、辅助Jar目录和可重载的辅助JAR方式。包括编译UDF包、上传到HDFS、添加到Hive classpath、注册和删除函数等步骤,并讨论了不同方式的适用场景和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大数据集群下,共有三种管理Hive UDF的方式,如下:

名称重启Hive服务Jar保存目录场景
直接JAR配置需要HDFS开发
辅助JARs目录配置需要本地目录防止意外覆盖文件
可重载辅助JAR配置不需要本地目录频繁更新UDF场景
{HIVE_HOME}/auxlib目录需要本地目录不建议
{HIVE_HOME}/lib目录需要本地目录不建议

下面将详细介绍以上几种方式。

编译 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

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>3.3.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>3.1.3</version>
    </dependency>
</dependencies>

mvn package
执行 mvn package 得到 UDF jar包 HelloUDF-1.0.jar

直接Jar方式

添加UDF

上传UDF Jar到HDFS
hdfs dfs -put HelloUDF-1.0.jar /tmp
添加jar包到Hive classpath
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 /tmp
beeline -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  |
+----------------+

辅助Jar目录

Variable NameDescription
hive.aux.jars.pathThe location of the plugin jars that contain implementations of user defined functions and SerDes.

上传并配置

mkdir -p /usr/local/hive/auxjar
cp HelloUDF-1.0.jar /usr/local/hive/auxjar

如果 Hive Metastore 与 HiveServer2 不在同另一台主机上,那么要在这两台机器上创建相同的目录,但是 JAR 文件需要上传到 HiveServer2 主机上。

${HIVE_HOME}/conf/hive-site.xml下配置:

<property>
    <name>hive.aux.jars.path</name>
    <value>/usr/local/hive/auxjar</value>
</property>

重启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/auxjar

hive-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

# 重新创建udf
beeline -u "jdbc:hive2://test.bigdata.com:10000" -n "song" -p ""
create function HelloUDF as 'org.example.HelloUDF';
select HelloUDF("Hive");
+----------------+
|      _c0       |
+----------------+
| HelloTwo Hive  |
+----------------+

可重载的辅助JAR方式

Variable NameDescription
hive.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 auxiliary classes in hive.aux.jars.pathfor creating UDFs or SerDes. (As of Hive 0.14.0.)

上传jar并配置

mkdir -p /usr/local/hive/auxjar
cp HelloUDF-1.0.jar /usr/local/hive/auxjar

${HIVE_HOME}/conf/hive-site.xml下配置:

<property>
    <name>hive.aux.jars.path</name>
    <value>/usr/local/hive/auxjar</value>
</property>

重启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/auxjar
chmod 755 /usr/local/hive/auxjar/HelloUDF-1.0.jar

# 更新UDF:不需要重启hiveserver2
beeline -u "jdbc:hive2://test.bigdata.com:10000" -n "song" -p ""
reload;
select HelloUDF("Hive");
+----------------+
|      _c0       |
+----------------+
| HelloTwo Hive  |
+----------------+

auxlib方式

# vim ${HIVE_HOME}/bin/hive

# adding jars from auxlib directory
for 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;
  fi
done

上面代码说明了添加到${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;

${HIVE_HOME}/lib方式

复制jar包到 ${HIVE_HOME}/lib下,后面操作跟auxlib方式相同。

总结

建议使用 直接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包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据AI

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值