大多数企业在使用CDH集群时,考虑数据的安全性会在集群中启用Sentry服务,这样就会导致之前正常使用的UDF函数无法正常使用。本文主要讲述如何在Sentry环境下使用自定义UDF函数。
文章概述
测试环境
前置条件
1.将开发好的UDF JAR包上传至HServer2及Metastore服务所在服务器统一目录
[root@dloss1 ~]# sudo mkdir /usr/lib/hive-udf-jars [root@dloss1 hive-udf-jars]# sudo chown -R hive:hive apog-udf-1.0.jar [root@dloss1 hive-udf-jars]# ll
(后续换了jar包)
注意:/usr/lib/hive-udf-jars目录及目录下文件的属主为hive,确保hive用户能访问
2.将开发好的UDF JAR上传至HDFS
[root@dloss1 hive-udf-jars]# hadoop fs -mkdir /user/hive/udfjars [root@dloss1 hive-udf-jars]# hadoop fs -ls /user/hive/udfjars [root@dloss1 hive-udf-jars]# hadoop fs -put apog-udf-1.0.jar/user/hive/udfjars [root@dloss1 hive-udf-jars]# hadoop fs -ls /user/hive/udfjars Found 1 items -rw-r--r-- 3 hive hive 94869756 2021-04-14 16:45 /user/hive/udfjars/apog-udf-1.0.jar [root@dloss1 hive-udf-jars]#
注意:/user/hive/udfjars和jar文件的所属用户必须为hive
1.登录CM管理控制台,进入Hive服务
点击配置,选择高级配置,在hive-site.xml文件中增加如下配置
<property> <name>hive.reloadable.aux.jars.path</name> #引入jar包 <value>/usr/lib/hive-udf-jars</value> </property>
注意:hive.reloadable.aux.jars.path路径为本地的/usr/lib/hive-udf-jars目录
2.保存配置,回到CM主页根据提示重启Hive服务
1.用hive用户通过beeline登录HiveServer2测试
(修改<name>hive.reloadable.aux.jars.path</name>配置只对 Beeline 适用,Hive CLI 方式无法识别 Jar 包)
(因已经开启了Kerberos认证需要先登录Hive/dloss1@FAYON.COM账号再进行beeline连接)
beeline !connect jdbc:hive2://dloss1:10000/;principal=hive/dloss1@FAYSON.COM
创建临时函数
create function TEST0415 as 'com.ceb.ccrp.apog.udf.TransferLocationUDTF' using jar 'hdfs://nameservice1/user/hive/udfjar/apog-udf-1.0.jar'; #此中'com.ceb.ccrp.apog.udf.TransferLocationUDTF'是调用java方法的路径、'hdfs://nameservice1/user/hive/udfjar/apog-udf-1.0.jar'是hue授权后jar包的路径
使用函数
select TEST0415(113.15150738786386,40.97701708193782);
为用户授权JAR文件的GRANT ALL ON URI特权,则用户就可以在他们拥有写权限的数据库上创建Function
问题总结:
1、设置
值时要注意jar包要在每个节点的相同本地路径存在、否则hive相关服务会启动失败、启动失败会报java版本不一样的错误
2、修改完hive配置文件重启服务后要重新连接beeline
3、多次测试在beeline中的add权限问题后还是不能使用,最后使用在hue授予权限后的DHFS中的jar包路径解决问题
4、java.net.SocketException: Broken pipe报错可能的原因
防火墙和网络上的问题,或者服务器发生了crash
应用系统的数据库连接池导致,忘记数据库连接的关闭
5、add jar权限问题(未解决)
6、Unknown HS2 problem when communicating with Thrift server