2017-02-09 10 views
0

Описание: Я создал приложение, которое извлекает файл HDFS (Hadoop Distributed File System) из удаленного кластера, на котором применяется аутентификация Kerberos. Я мог выполнить HDFS.copyToLocalFile (путь1, путь2) от Eclipse, и он работал нормально. Но когда я экспортирую проект как запущенную банку и пытаюсь запустить ее через командную строку, она выдает следующую ошибку. Примечание. Я выполнил следующие шаги: https://sourceforge.net/p/jsch/mailman/message/26939797/ и успешно выполнил проект из Eclipse. Я проверил дополнительные файлы в Eclipse, но не смог найти их. У меня есть Kerberos V5 MIT устанавливается вместе с Network Identity Manager (версия 4.0)Kerberos Authentication using Credentials Кэш работает через Eclipse, но не в командной строке

Caused by: java.io.IOException: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS] 
at org.apache.hadoop.ipc.Client$Connection$1.run(Client.java:680) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Unknown Source) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) 
at org.apache.hadoop.ipc.Client$Connection.handleSaslConnectionFailure(Client.java:643) 
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:730) 
at org.apache.hadoop.ipc.Client$Connection.access$2800(Client.java:368) 
at org.apache.hadoop.ipc.Client.getConnection(Client.java:1521) 
at org.apache.hadoop.ipc.Client.call(Client.java:1438) 
... 70 more 
Caused by: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS] 
at org.apache.hadoop.security.SaslRpcClient.selectSaslClient(SaslRpcClient.java:172) 
at org.apache.hadoop.security.SaslRpcClient.saslConnect(SaslRpcClient.java:396) 
at org.apache.hadoop.ipc.Client$Connection.setupSaslConnection(Client.java:553) 
at org.apache.hadoop.ipc.Client$Connection.access$1800(Client.java:368) 
at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:722) 
at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:718) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Unknown Source) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) 
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:717) 
... 73 more 

Примечание: Я настроил затмив соответствующие параметры в configuration.xml и в комплекте его в пути к классам.

<property> 
    <name>java.security.auth.login.config</name> 
    <value>./Configuration/login.conf</value> 
</property> 
<property> 
    <name>java.security.krb5.conf</name> 
    <value>./Configuration/krb5.conf</value> 
</property> 
<property> 
    <name>javax.security.auth.useSubjectCredsOnly</name> 
    <value>false</value> 
</property> 
+0

Рекомендуемая литература: https://steveloughran.gitbooks.io/kerberos_and_hadoop/content/ –

+0

Под _ «низкоуровневых секреты» _ у вас есть несколько советов о том, что позволяло бы Отслеживаемые трассировки Kerberos, т.е. 'export HADOOP_JAAS_DEBUG = true' и' -Dsun.security.krb5.debug = true' плюс, если вы используете интерфейс REST, '-Dsun.security.spnego.debug = true' –

+0

Я также добавлю мой личный контакт: '-Djava.security.debug = gssloginconfig, configfile, configparser, logincontext' действительно полезен для понимания проблем конфигурации. –

ответ

1

Я думаю, что проверка подлинности Kerberos не удается, потому что ваши login.conf и krb5.conf файлы не могут быть найдены во время выполнения при использовании JAR.

У меня была аналогичная проблема, когда я попытался получить доступ к файлу в моей папке assets из файла JAR. Дело в том, что пути меняются как-то при экспорте пакета как JAR. У вас есть возможность проверить пути к файлу каким-либо образом в вашем коде, например.

String resourceFile = YourClass.class.getResource("/krb5.conf").getFile(); 
// check if resourceFile is null! 

Если эта class.getResource(...) команда работает работает через IDE, но не в вашем JAR, проблема заключается разница в расположении файла.

Я думаю, что этот пост может помочь вам: How to get a path to a resource in a Java JAR file