hadoop - 使用 Kerberos 的 Hive 远程 Metastore

标签 hadoop hive

我是 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/

相关文章:

mysql - sql中歌曲的性别

java - java.io.FileNotFoundException:HIVE_PLAN没有这样的文件或目录

hadoop - 我必须实现hadoop,这样它才能处理调用详细记录的数据?

hadoop - 在 cloudera 5.13.0 服务没有启动

hadoop - Hadoop名称节点未启动

hadoop - 无法使用水槽流推特数据

xml - Hadoop Job API支持StreamInputFormat吗?

sql - Hive 必须使用 UNION ALL 指定实际数据源(FROM)

apache-spark - Spark Connect Hive 到 HDFS vs Spark 直接连接 HDFS 和 Hive 在它上面?

hadoop - 将文件文件配置单元以序列文件格式导出到hdfs