問(wèn)題
在CDH5.13.x啟用Sentry后,HiveServer2的Client(Beeline、Thrift)中不能使用add jar語(yǔ)句(hive cli方式還是可以的,不過(guò)這樣無(wú)法控制權(quán)限Sentry就沒(méi)意義了)
https://community.cloudera.com/t5/Hadoop-101-Training-Quickstart/ADD-JAR-command-from-beeline-nsufficient-privileges-to/td-p/39085
這種情況下,還有兩種方式部署udf:
永久函數(shù)
// 上傳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';
注意:如果要?jiǎng)h除改函數(shù),務(wù)必先刪除函數(shù),后刪除jar包,否則會(huì)報(bào)這個(gè)錯(cuò)誤
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)
出現(xiàn)錯(cuò)誤后想恢復(fù),需要上傳與該函數(shù)創(chuàng)建時(shí)一致的jar包和路徑,然后創(chuàng)建函數(shù)/刪除函數(shù)
臨時(shí)函數(shù)
https://www.cloudera.com/documentation/enterprise/5-13-x/topics/cm_mc_hive_udf.html
- 在HiveServer2所在的機(jī)器中添加一個(gè)存放udf的jar包的文件夾,比如/usr/lib/hive/lib/(注意,如果HMS不和Server在一臺(tái)機(jī)器上,需要保證這個(gè)路徑也存在)。
- 將這個(gè)路徑在CDH控制臺(tái)CM的hive中設(shè)置到hive.reloadable.aux.jars.path中。
- 放置jar包
- 重啟機(jī)器
- Sentry中授權(quán)
GRANT ALL ON URI 'file:///usr/lib/hive/lib/<my.jar>' TO ROLE <example_role>; - 使用時(shí)基于上傳的jar包建立臨時(shí)函數(shù)
create temporary function xxx as 'com.name.hive.udf.XXX'; --udf類在包中路徑
select xxx('hello world');