您好,登錄后才能下訂單哦!
這篇文章主要講解了“Hive在SQL標(biāo)準(zhǔn)權(quán)限模式下創(chuàng)建UDF失敗的問(wèn)題”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Hive在SQL標(biāo)準(zhǔn)權(quán)限模式下創(chuàng)建UDF失敗的問(wèn)題”吧!
環(huán)境:
CDH 5.16
Hive 1.1.0
已開(kāi)啟Kerberos
Hive 授權(quán)使用SQL StandardsBased Authorization模式(以下簡(jiǎn)稱(chēng)SSBA模式)
癥狀表現(xiàn):
在編譯好UDF的jar包之后,上傳到HDFS目錄。
hdfs dfs -mkdir /udfhdfs dfs -put -f my_udf.jar /udf
以管理員用戶hive,進(jìn)入beeline客戶端。
切換到管理員角色,執(zhí)行:
set role admin;
提示成功切換角色后,執(zhí)行創(chuàng)建自定義函數(shù)語(yǔ)句:
create function default.ch_cnv as 'com.my.hive.udf.ChsUDF' using jar 'hdfs:///udf/my_udf.jar';
創(chuàng)建自定義函數(shù)報(bào)錯(cuò),提示對(duì)應(yīng)用在CREATE FUNCTION上的DFS_URI對(duì)象沒(méi)有“管理權(quán)限”:
Error: Error while compiling statement:FAILED: HiveAccessControlException Permission denied: Principal [name=hive,type=USER] does not have following privileges for operation CREATEFUNCTION [[ADMINPRIVILEGE] on Object [type=DFS_URI, name=hdfs://nameservice1/udf/my_udf.jar]](state=42000,code=40000)
嘗試帶temporary創(chuàng)建臨時(shí)函數(shù),也是報(bào)同樣的錯(cuò)誤:
create temporary function default.ch_cnv as'com.my.hive.udf.ChsUDF' using jar 'hdfs:///udf/my_udf.jar';
分析思路:
在SSBA模式下,執(zhí)行某一些語(yǔ)句會(huì)要求對(duì)應(yīng)的HDFS URI必須為rwx+所有者的權(quán)限,非常繁瑣(所以從Hive 3.0.0開(kāi)始,基于SSBA的方式進(jìn)行授權(quán)時(shí),對(duì)URI權(quán)限要求,進(jìn)行了大幅度的修改。例如建立外表時(shí),不再要求用戶必須是HDFS目錄的所有者,只需要擁有rw權(quán)限即可)。會(huì)不會(huì)是這里出了問(wèn)題?
先查閱官方文檔:
https://cwiki.apache.org/confluence/display/Hive/SQL+Standard+Based+Hive+Authorization
官方文檔上清楚的顯示CREATE FUNCTION操作是和HDFS URI權(quán)限完全無(wú)關(guān)的。
難道是官方文檔寫(xiě)錯(cuò)了???
嘗試將jar權(quán)限改為777,所屬用戶和組都修改為hive。
重試create function語(yǔ)句,沒(méi)有效果,依然報(bào)同樣的錯(cuò)誤。
這條路走不通,那就試試看能不能從別的信息入手。
重新以hive身份進(jìn)入beeline,不執(zhí)行set role admin,就以普通的public角色身份,執(zhí)行create function語(yǔ)句,提示:
Error: Error while compiling statement:FAILED: HiveAccessControlException Permission denied: Principal [name=hive,type=USER] does not have following privileges for operation CREATEFUNCTION [[ADMINPRIVILEGE] on Object [type=DATABASE, name=default], [ADMIN PRIVILEGE] on Object[type=DFS_URI, name=hdfs://nameservice1/udf/my_udf.jar], [ADMIN PRIVILEGE] onObject [type=FUNCTION, name=default.ch_cnv]](state=42000, code=40000)
這時(shí)可以看到,對(duì)于執(zhí)行create function,要求了三個(gè)權(quán)限:
1、 數(shù)據(jù)庫(kù)的admin權(quán)限
2、 HDFS URI的admin權(quán)限
3、 函數(shù)對(duì)象的admin權(quán)限
其中1和3與官方文檔的描述是完全一致的。而我們set role admin之后,1和3都被滿足。只有2卻依然不滿足,這說(shuō)明并不是我們的管理員角色配置,或是管理員角色切換出現(xiàn)了問(wèn)題。
那只剩下一種可能性,Hive的這個(gè)功能有BUG....
搜索的時(shí)候,發(fā)現(xiàn)了一名網(wǎng)友遇到了同樣的問(wèn)題:
http://lxw1234.com/archives/2016/01/600.htm
雖然并沒(méi)有人解答這個(gè)問(wèn)題,但至少說(shuō)明這并非奇特的個(gè)案。
來(lái)到Apache的官方JIRA,進(jìn)行搜索。果然有相關(guān)的BUG報(bào)告:
https://issues.apache.org/jira/browse/HIVE-11175
從描述和提交的補(bǔ)丁來(lái)看,是Hive在SSBA模式下進(jìn)行create function的語(yǔ)義分析時(shí),錯(cuò)誤的將一個(gè)輸入型資源(UDF的JAR包),當(dāng)作了輸出型資源。要求對(duì)該路徑施加寫(xiě)的管理員權(quán)限(實(shí)際應(yīng)當(dāng)為要求讀的權(quán)限),一個(gè)已經(jīng)存在的輸入型資源是只讀的,于是導(dǎo)致永遠(yuǎn)卡死在這個(gè)驗(yàn)證上。
解決方法:
由于已經(jīng)對(duì)Hive集群實(shí)施了SSBA模式,所以我們肯定是不可能為了裝載一個(gè)UDF函數(shù),就去臨時(shí)將集群的驗(yàn)證關(guān)閉的。徹底關(guān)閉會(huì)有一段時(shí)間暴漏在安全風(fēng)險(xiǎn)中,并且還需要重啟服務(wù),臨時(shí)關(guān)閉需要重啟一次,開(kāi)啟又要重啟一次,這會(huì)非常麻煩。
另外一種方式就是去應(yīng)用前面社區(qū)中提交的補(bǔ)丁到源碼重新編譯,然后替換有問(wèn)題的JAR包。這個(gè)補(bǔ)丁目前還沒(méi)被集成到Hive的主線中,這么做存在一定風(fēng)險(xiǎn)。而且目前這個(gè)集群是客戶購(gòu)買(mǎi)的商業(yè)版的CDH,也不太建議自己去弄。
怎么辦?這個(gè)時(shí)候就要請(qǐng)最老舊的Hive CLI上場(chǎng)了!
Hive CLI正是由于不兼容完備的授權(quán)模式(Sentry/Ranger/SSBA),可以繞過(guò)這些安全限制,所以被官方用beeline給代替了,只在Hive3之前的版本,作為一個(gè)兼容性功能保留。
所以一旦開(kāi)啟了Hive授權(quán),都是建議對(duì)普通用戶禁用Hive CLI的(除非你有Spark多租戶的需求,否則都會(huì)進(jìn)行下面的HMS代理禁用)。最常見(jiàn)的禁用手段,就是通過(guò)配置Hive的hadoop.proxyuser.hive.groups(Hive Metastore 訪問(wèn)控制和代理用戶組覆蓋),指定值由 * 改為具體的管理員組,使得普通用戶就算進(jìn)入Hive CLI,也無(wú)法操作,但是管理員組用戶依然可以進(jìn)入Hive CLI操作。
所以我們可以使用hive管理員用戶,直接進(jìn)入Hive CLI,繞過(guò)SSBA的驗(yàn)證過(guò)程,來(lái)創(chuàng)建UDF函數(shù):
kinit -k -t hive.keytab hive@XXX.COMhive
進(jìn)入Hive CLI后,執(zhí)行:
create function default.ch_cnv as 'com.my.hive.udf.ChsUDF' using jar 'hdfs:///udf/my_udf.jar';
提示創(chuàng)建成功!
切換到beeline,試用帶UDF函數(shù)的HQL語(yǔ)句,沒(méi)有問(wèn)題。搞定!
感謝各位的閱讀,以上就是“Hive在SQL標(biāo)準(zhǔn)權(quán)限模式下創(chuàng)建UDF失敗的問(wèn)題”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Hive在SQL標(biāo)準(zhǔn)權(quán)限模式下創(chuàng)建UDF失敗的問(wèn)題這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。