我是 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/[email protected] is not allowed to impersonate [email protected])
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask
我可以正常运行“显示数据库”。我已使用 hdfs/ 将“hive --service metastore”作为 hdfs 运行[电子邮件保护]作为主体。我在同一个框中以“myuserid”的身份运行 hive。我不知道这是否相关,但如果我尝试从另一个系统运行 hive,除非我使用相同的主体(hdfs/[电子邮件保护]) 用于 hive.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/[email protected]</value>
</property>
<property>
<name>hive.metastore.execute.setugi</name>
<value>true</value>
</property>
有任何想法吗?
答案1
显然,它不喜欢使用 hdfs 原理。切换到专门针对 hive 的原理解决了这个问题。