我正在测试使用ToolRunner运行的第一个Job。为了运行它,我在Windows上定义了一个krb5.ini文件,如下所示:

[realms]
EXAMPLE.COM = {
kdc = kerberos.example.com
admin_server = localhost
dns_lookup_kdc = false
}

我把它放在C:\Windows\
然后,我尝试通过以下方式为我的代码指定它的位置:
  • 为主要代码添加java.security.krb5.config=C:\Windows\krb5.ini的参数
  • krb5.ini的地址添加到我的项目
  • 的已知库中
  • 以此定义OS(Windows 7)的环境变量:KRB5_CONFIG = C:\Windows\krb5.ini尽管this page曾说过“您可以通过设置环境变量KRB5_CONFIG覆盖默认位置。可以在KRB5_CONFIG中指定多个以冒号分隔的文件名;将读取所有存在的文件。”
  • 使用System.setProperty这样指定krb5.ini的位置:

  • System.setProperty("java.security.krb5.conf", "C:\\Windows\\krb5.ini");
        System.setProperty("sun.security.krb5.realm", "C:\\Windows\\krb5.ini");
    

    这些方法均不能解决我遇到的此错误:
    Exception in thread "main" java.lang.IllegalArgumentException: Can't get Kerberos realm
    at org.apache.hadoop.security.HadoopKerberosName.setConfiguration(HadoopKerberosName.java:65)   at org.apache.hadoop.security.HadoopKerberosName.setConfiguration(HadoopKerberosName.java:65)
    at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:275)
    at org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:260)
    at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:790)
    at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:760)
    at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:633)
    at org.apache.hadoop.fs.FileSystem$Cache$Key.<init>(FileSystem.java:2812)
    at org.apache.hadoop.fs.FileSystem$Cache$Key.<init>(FileSystem.java:2802)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2668)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:371)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:170)
    at org.enahang.mapreduce.utils.mrUtils.Test.run(Test.java:125)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    at org.enahang.mapreduce.utils.mrUtils.Test.main(Test.java:62)
    

    我的环境是netbeans,在尝试这些方式之前,我大概知道这些方式不起作用。我经常可以通过添加适当的jar文件作为外部库来解决此类问题。有任何想法吗?或提示?

    提前致谢

    最佳答案

    我的2美分:尝试对Kerberos配置进行改进,而不是想知道为什么它不能按原样工作。例如,尝试default_realm子句:

    [libdefaults]
    default_realm    = EXAMPLE.COM
    dns_lookup_kdc   = false
    dns_lookup_realm = false
    
    [realms]
    EXAMPLE.COM = {
      kdc = kerberos.example.com
    }
    

    您可能还需要根据Kerberos实现定义permitted_enctypesdefault_tkt_enctypesdefault_tgs_enctypesforwardable等。

    07-24 15:00