问题
在CDH5.13.x启用Sentry后,HiveServer2的Client(Beeline、Thrift)中不能使用add jar语句(hive cli方式还是可以的,不过这样无法控制权限Sentry就没意义了)
https://community.cloudera.com/t5/Hadoop-101-Training-Quickstart/ADD-JAR-command-from-beeline-nsufficient-privileges-to/td-p/39085
这种情况下,还有两种方式部署udf:
永久函数
// 上传udf的jar包
hdfs dfs -put xxx.jar hdfs://cluster-name/user/hive/warehouse/udf/xxx.jar
create function <db>.<function_name> as 'ClassName' using jar 'hdfs://cluster-name/user/hive/warehouse/udf/xxx.jar';
注意:如果要删除改函数,务必先删除函数,后删除jar包,否则会报这个错误
INFO : Added [/tmp/b0eb87ea-9ae0-4a4c-a30f-256587f57fc5_resources/xxx.jar] to class path
INFO : Added resources: [hdfs://cluster-name/user/hive/warehouse/udf/xxx.jar]
ERROR : Failed to register default.<function_name> using class ClassName
ERROR : FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask
INFO : Completed executing command(queryId=hive_20190725202828_b7798b25-74dd-4113-a802-96c402b60cfe); Time taken: 0.336 seconds
Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask (state=08S01,code=1)
出现错误后想恢复,需要上传与该函数创建时一致的jar包和路径,然后创建函数/删除函数
临时函数
https://www.cloudera.com/documentation/enterprise/5-13-x/topics/cm_mc_hive_udf.html
- 在HiveServer2所在的机器中添加一个存放udf的jar包的文件夹,比如/usr/lib/hive/lib/(注意,如果HMS不和Server在一台机器上,需要保证这个路径也存在)。
- 将这个路径在CDH控制台CM的hive中设置到hive.reloadable.aux.jars.path中。
- 放置jar包
- 重启机器
- Sentry中授权
GRANT ALL ON URI 'file:///usr/lib/hive/lib/<my.jar>' TO ROLE <example_role>; - 使用时基于上传的jar包建立临时函数
create temporary function xxx as 'com.name.hive.udf.XXX'; --udf类在包中路径
select xxx('hello world');