【问题标题】:KERBEROS error while running mapreduce on Hbase在 Hbase 上运行 mapreduce 时出现 KERBEROS 错误
【发布时间】:2015-08-27 16:19:48
【问题描述】:

我是 KERBEROS 的新手,遇到以下错误。

Exception in thread "main" java.io.IOException: Can't get Master Kerberos principal for use as renewer
    at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:116)
    at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:100)
    at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodes(TokenCache.java:80)
    at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:370)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1295)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1292)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:1292)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1313)
    at SampleUploader.main(SampleUploader.java:113)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:212)

当我运行以下代码时出现此错误(可在 GitHub 中找到:https://github.com/ddraj/hbase-trunk-mttr/blob/master/hbase-examples/src/main/java/org/apache/hadoop/hbase/mapreduce/SampleUploader.java

conf.set("hadoop.security.authentication", "kerberos");
conf.set("dfs.namenode.kerberos.principal","hdfs/_HOST@REALM.COM");
UserGroupInformation.setConfiguration(conf);
System.out.println(UserGroupInformation.getLoginUser()+"***********");

我正在使用 CDH5.2.6

我可以像这样获取登录用户:

System.out.println(UserGroupInformation.getLoginUser()+"***********");

【问题讨论】:

  • 产生此错误的代码是什么?
  • 它是一个TableMapReduceUtil.initTableReducerJob
  • 您能否提供一个重现错误的最小工作代码示例?
  • 请参考 GitHub 中的代码:github.com/ddraj/hbase-trunk-mttr/blob/master/hbase-examples/… 附加代码:conf.set("hadoop.security.authentication", "kerberos"); conf.set("dfs.namenode.kerberos.principal","hdfs/_HOST@REALM.COM"); UserGroupInformation.setConfiguration(conf); System.out.println(UserGroupInformation.getLoginUser()+"***********");

标签: java mapreduce hbase kerberos hadoop-yarn


【解决方案1】:

这个错误通常意味着它所说的意思(它找不到用于某些操作的特定 Kerberos 主体)。然而,解决这个错误的细节很糟糕。通常归结为以下三点:

  1. 您正在使用 .jaas 文件,但其中的主体有误,或者您在应该使用的时候没有使用 .jaas 文件。确保您在 java 调用中使用“-Djava.security.auth.login.config=[.jaas 文件]”。
  2. 某些 Hadoop 相关配置文件中的某些已定义主体错误或 Kerberos 未知。这可能是因为主体的任何部分都是错误的(验证用户、主机和领域),或者因为没有人拥有 Kerberos 票证为当前的真实用户授予票证(使用 kinit 或在您的应用程序中执行此操作。)李>
  3. 您需要在一些与 Hadoop 相关的配置文件中定义一个属性。您可能还不知道该属性,而且 - 这是可怕的部分 - 您也可能甚至不知道配置文件本身。例如,在 HBase 中导出快照0.98.x 需要一个 yarn-site.xml 文件;需要在那里定义两个主体。我不知道为什么,因为 HBase 参考中没有提到 yarn,所以我没有使用 Yarn,也没有安装 Yarn。

不幸的是,#3 至少花费了我一半的时间——浪费了——试图让 HBase 与 Kerberos 一起使用。我已经停止计算实际的小时数,因为这让我很沮丧。希望这篇文章能帮助其他人不要浪费他们的时间。

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多