我正在测试使用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
的地址添加到我的项目KRB5_CONFIG = C:\Windows\krb5.ini
尽管this page曾说过“您可以通过设置环境变量KRB5_CONFIG覆盖默认位置。可以在KRB5_CONFIG中指定多个以冒号分隔的文件名;将读取所有存在的文件。” 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_enctypes
,default_tkt_enctypes
,default_tgs_enctypes
,forwardable
等。