我是 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”。我在同一个盒子上以“myuserid”的身份运行配置单元。我不知道它是否相关,但如果我尝试从另一个系统运行配置单元,我会收到 GSS 启动错误,除非我为配置单元使用相同的主体 (hdfs/hadoopserver.sub.dom.com@SUB.DOM.COM) .metastore.kerberos.principal。这是预期的吗?
当我尝试用谷歌搜索时,我看到了类似的问题,但他们的消息是关于无法模拟的,只显示了单个部分的用户名,而对我来说,它显示的是领域。我尝试使用 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>
有什么想法吗?
最佳答案
以用户“hive”(hive/domain@Realm) 运行 hive metastore,然后将 hadoop.proxyuser.hive.hosts 和 hadoop.proxyuser.hive.groups 配置为“*”。 这行得通。
关于hadoop - 使用 Kerberos 的 Hive 远程 Metastore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18517656/