简述
本文旨在讲解开发好的hive udf如何上线到服务器并使用,关于如何开发hive udf不在本文讨论范畴内。
创建永久函数
对于长期使用的udf,推荐创建永久函数,这样就不用每次使用函数前都创建临时函数,下面这个命令需要先提前将jar包添加到classpath,关于如何添加jar到classpath查看下一章节。
CREATE FUNCTION [db_name.]function_name AS class_name;
如果没有加到classpath里可以使用命令:
CREATE FUNCTION [db_name.]function_name AS class_name [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
添加jar到classpath
-
使用命令add jar
-
描述:
hive> add jar /home/hadoop/xxxx.jar;
,可以用list jars;
命令查看是否添加成功,一般在创建临时函数时才会用到该方法。 -
时效性:临时的。
-
服务:只针对当前session,重启hive-shell后失效,重启与HiveServer2的链接后失效。
-
-
将jar放入hive目录下的auxlib目录或者lib目录下
-
描述:lib是hive的依赖目录,auxlib目录是hive默认的插件目录(如果没有则手动创建)。
-
时效性:永久的。
-
服务:hive-shell重启后生效,HiveServer2重启后生效。
-
-
修改hive-env.sh中的HIVE.AUX.JARS.PATH配置
-
时效性:永久的。
-
服务:hive-shell重启后生效,HiveServer2重启后生效。
-
-
修改和hive-site.xml中的hive.aux.jars.path配置
-
时效性:永久的。
-
服务:对hive-shell无效,HiveServer2重启后生效。
-
更新函数
在实际应用场景里,我们会遇到Hive udf逻辑更新迭代的情况,这时就需要更新udf的jar包,然后让HiveServer2重新加载这个jar包里的类。
经过试验,HiveServer2一旦加载了udf的jar包就不会轻易卸载。
因此一般情况下,我推荐hive udf的jar包不要带上版本号,这样在更新了jar包后,只需要重启HiveServer2就可以,而并不需要删除/重新创建函数。
(至于如何分辨jar包的版本号,可以查看我的另一篇文章)
借助zookeeper实现高可用的HiveServer2如何使用Hive udf
如果使用的HiveServer2借助zookeeper实现了高可用,那么每次与HiveServer2建立链接时,都只是与其中一个HiveServer2通信,如果该HiveServer2已经将目标jar添加到classpath里了,那就可以创建函数。
在一个HiveServer2上添加函数后,另外的HiveServer2节点并不能马上意识到已经创建了函数,使用show functions like '*function_name*';
会找不到创建的函数,将该节点重启后才能发现该函数。
尽管HiveServer2重启后能够发现该函数,但如果该HiveServer2节点没有将jar添加到classpath里,那么依然无法使用函数。
因此,在创建函数时,要确保所有的HiveServer2都已经将jar添加到classpath里。
但是,如果按照前面《添加jar到classpath》章节里提到的方式,那么每个HiveServer2节点都需要部署jar包,这样会导致管理不方便,而且版本更新的时候也十分麻烦。
因此对于借助zookeeper实现了高可用的HiveServer2,我更加推荐使用命令CREATE FUNCTION [db_name.]function_name AS class_name USING JAR 'hdfs://file_uri'
来创建udf函数,这样在版本更新时,我们就不再需要每一个节点去操作更新jar包,而只需要替换hdfs上的jar包,然后滚动重启每一个HiveServer2即可。
删除函数
DROP FUNCTION [IF EXISTS] function_name;