hive 集成oracle,hive集成kerberos问题1
在hdfs+mapred+impala+kerberos運(yùn)行正常后,開(kāi)始測(cè)試hive+kerberos。hive0.11之后開(kāi)始支持kerberos的驗(yàn)證,hive主要有兩種訪問(wèn)方式,一種方法是shell運(yùn)行,即直接運(yùn)行hive命令,另一種方法時(shí)啟動(dòng)hiveserver,然后通過(guò)jdbc或odbc進(jìn)行驗(yàn)證,其中第二種方法可以通過(guò)hive0.11的beeline進(jìn)行測(cè)試。
在使用hive shell運(yùn)行時(shí),主要遇到下面幾個(gè)問(wèn)題:
1.權(quán)限驗(yàn)證問(wèn)題。
在hive操作hdfs數(shù)據(jù)的時(shí)候,權(quán)限是分為兩層的,一個(gè)是hive層面的權(quán)限控制,主要是控制表的權(quán)限,一個(gè)是hdfs文件的權(quán)限控制,控制用戶(hù)的讀寫(xiě)操作。
表的相關(guān)權(quán)限主要是寫(xiě)在hive的元數(shù)據(jù)庫(kù)中,主要是TBL_PRIVS表(控制表的權(quán)限)和DB_PRIVS 表(控制庫(kù)的權(quán)限)。
在開(kāi)啟kerberos之后,傳入hive的用戶(hù)名是principal的全名,比如hdfs/gxxxx@KERBEROS_HADOOP,而hive權(quán)限表中的PRINCIPAL_NAME 字段是hdfs,會(huì)導(dǎo)致沒(méi)有表的權(quán)限,雖然可以通過(guò)update表來(lái)更改相應(yīng)的PRINCIPAL_NAME 的值,但是實(shí)際使用中缺乏可運(yùn)維性。在hdfs層面,有一個(gè)user mapping的功能(由hadoop.security.auth_to_local參數(shù)控制),默認(rèn)會(huì)把principal的全名進(jìn)行map,轉(zhuǎn)換為unix的用戶(hù)名形式。
2.hook的問(wèn)題。
由于hive有g(shù)rant的bug,因此線上使用了hook來(lái)做用戶(hù)驗(yàn)證,即執(zhí)行g(shù)rant語(yǔ)法是會(huì)判斷當(dāng)前用戶(hù)是否是hdfs用戶(hù),如果不是則報(bào)錯(cuò),主要的代碼如下(老畢提供):
其中獲取當(dāng)前傳入的用戶(hù)名是通過(guò) SessionState.get().getAuthenticator().getUserName();
集成了kerberos之后,在實(shí)際使用中會(huì)報(bào)
FAILED: SemanticException User:hdfs/xxxxx@KERBEROS_HADOOP isn't ADMIN, please ask for hdfs.的錯(cuò)誤。
這兩個(gè)問(wèn)題的解決,借鑒了點(diǎn)評(píng)的patch:
即把ql/src/java/org/apache/hadoop/hive/ql/security/HadoopDefaultAuthenticator.java
中的this.userName = ugi.getUserName();改為
this.userName = ShimLoader.getHadoopShims().getShortUserName(ugi);
本文轉(zhuǎn)自菜菜光 51CTO博客,原文鏈接:http://blog.51cto.com/caiguangguang/1381334,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的hive 集成oracle,hive集成kerberos问题1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle表空间大小规划,关于orac
- 下一篇: oracle+sid+未清除,管理信息化