在有Sentry控制下的CDH中部署Hive的UDF

问题

在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 . 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. 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

  1. 在HiveServer2所在的机器中添加一个存放udf的jar包的文件夹,比如/usr/lib/hive/lib/(注意,如果HMS不和Server在一台机器上,需要保证这个路径也存在)。
  2. 将这个路径在CDH控制台CM的hive中设置到hive.reloadable.aux.jars.path中。
  3. 放置jar包
  4. 重启机器
  5. Sentry中授权
    GRANT ALL ON URI 'file:///usr/lib/hive/lib/' TO ROLE ;
  6. 使用时基于上传的jar包建立临时函数
create temporary function xxx as 'com.name.hive.udf.XXX'; --udf类在包中路径
select xxx('hello world');

你可能感兴趣的:(在有Sentry控制下的CDH中部署Hive的UDF)