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