Hadoop

使用 Kerberos 設置 Hive 遠端元儲存

  • September 4, 2013

我是 hive 的新手,並試圖以相對安全的方式為測試環境設置它。我想使用遠端元儲存,以便 MR 作業可以訪問數據庫。我似乎幾乎可以正常工作,但是當具有憑據的使用者嘗試創建數據庫時,我得到:

hive> show databases;
OK
default
hive> create database testdb;
FAILED: Error in metadata: MetaException(message:Got exception: org.apache.hadoop.ipc.RemoteException User: hdfs/hadoopserver.sub.dom.com@SUB.DOM.COM is not allowed to impersonate myuserid@SUB.DOM.COM)
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

我可以執行“顯示數據庫”了。我以 hdfs/hadoopserver.sub.dom.com@SUB.DOM.COM 作為主體作為 hdfs 執行“hive –service metastore”。我在同一個盒子上執行 hive 作為“myuserid”。我不知道它是否相關,但如果我嘗試從另一個系統執行 hive,我會收到 GSS Initiate 錯誤,除非我對 hive 使用相同的主體 (hdfs/hadoopserver.sub.dom.com@SUB.DOM.COM) .metastore.kerberos.principal。這是預期的嗎?

當我嘗試用Google搜尋時,我看到了類似的問題,但他們關於無法模擬的消息只顯示了對我來說顯示領域的單部分使用者名。我嘗試使用 auth_to_local 屬性,但沒有幫助。Map Reduce 和 HDFS 操作執行良好。

在 core-site.xml 我有:

<property>
 <name>hadoop.proxyuser.hdfs.hosts</name>
 <value>*</value>
</property>

<property>
 <name>hadoop.proxyuser.hdfs.groups</name>
 <value>*</value>
</property>

在 hive-site.xml 我有:

<property>
 <name>javax.jdo.option.ConnectionURL</name>
 <value>jdbc:mysql://localhost/metastore</value>
 <description>the URL of the MySQL database</description>
</property>

<property>
 <name>javax.jdo.option.ConnectionDriverName</name>
 <value>com.mysql.jdbc.Driver</value>
</property>

<property>
 <name>javax.jdo.option.ConnectionUserName</name>
 <value>hive</value>
</property>

<property>
 <name>javax.jdo.option.ConnectionPassword</name>
 <value>password</value>
</property>

<property>
 <name>datanucleus.autoCreateSchema</name>
 <value>false</value>
</property>

<property>
 <name>datanucleus.fixedDatastore</name>
 <value>true</value>
</property>

<property>
 <name>hive.metastore.uris</name>
 <value>thrift://hadoopserver.sub.dom.com:9083</value>
</property>

<property>
 <name>hive.security.authorization.enabled</name>
 <value>true</value>
</property>

<property>
 <name>hive.metastore.sasl.enabled</name>
 <value>true</value>
</property>

<property>
 <name>hive.metastore.kerberos.keytab.file</name>
 <value>/etc/hadoop/hdfs.keytab</value>
</property>

<property>
 <name>hive.metastore.kerberos.principal</name>
 <value>hdfs/hadoopserver.sub.dom.com@SUB.DOM.COM</value>
</property>

<property>
   <name>hive.metastore.execute.setugi</name>
   <value>true</value>
</property>

有任何想法嗎?

顯然,它不喜歡使用 hdfs 原理。切換到專門針對 hive 的原則解決了這個問題。

引用自:https://serverfault.com/questions/535158