我用kerberos身份验证配置了hdfs,我可以使用自己的keytab文件访问hdfs集群中任何机器上的hdfs。但是,当我使用同一个keytab访问hdfs集群之外的远程服务器上的hdfs时,我无法访问。我收到了以下错误消息,顺便说一下,我已经将服务器的配置文件krb5.conf复制到hadoop集群外部的远程机器上。
java.io.ioexception:本地异常失败:java.io.ioexception:javax.security.sasl.saslexception:gss initiate failed[由gssexception引起:未提供有效凭据(机制级别:找不到任何kerberos tgt)];主机详细信息:本地主机为:“ubuntu/10.235.6.156”;目的主机为:“node0”:21200;在org.apache.hadoop.net.netutils.wrapexception(netutils。java:759)在org.apache.hadoop.ipc.client.call(client。java:1164)在org.apache.hadoop.ipc.protobufrpceengine$invoker.invoke(protobufrpceengine。java:202)在$proxy9.getfileinfo(未知源)处org.apache.hadoop.hdfs.protocolpb.clientnamenodeprotocoltranslatorpb.getfileinfo(clientnamenodeprotocoltranslatorpb。java:628)在sun.reflect.nativemethodaccessorimpl.invoke0(本机方法)在sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl)。java:39)在sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl。java:25)在java.lang.reflect.method.invoke(方法。java:597)在org.apache.hadoop.io.retry.retryinvocationhandler.invokemethod(retryinvocationhandler。java:164)在org.apache.hadoop.io.retry.retryinvocationhandler.invoke(retryinvocationhandler。java:83)在$proxy10.getfileinfo(未知源),位于org.apache.hadoop.hdfs.dfsclient.getfileinfo(dfsclient)。java:1507)在org.apache.hadoop.hdfs.distributedfilesystem.getfilestatus(distributedfilesystem)。java:783)在org.apache.hadoop.fs.filesystem.getfilestatus(filesystem。java:2106)在org.apache.hadoop.fs.filesystem.globstatusinternal(filesystem。java:1524)在org.apache.hadoop.fs.filesystem.globstatus(文件系统)。java:1503)在org.apache.hadoop.fs.filesystem.globstatus(filesystem。java:1481)在org.apache.hadoop.fs.shell.pathdata.expandasglob(路径数据)。java:271)在org.apache.hadoop.fs.shell.command.expandargument(command。java:224)在org.apache.hadoop.fs.shell.command.expandarguments(command。java:207)在org.apache.hadoop.fs.shell.command.processrawarguments(命令。java:190)在org.apache.hadoop.fs.shell.command.run(command。java:154)在org.apache.hadoop.fs.fsshell.run(fsshell。java:254)在org.apache.hadoop.util.toolrunner.run(toolrunner。java:70)在org.apache.hadoop.util.toolrunner.run(toolrunner。java:84)在org.apache.hadoop.fs.fsshell.main(fsshell。java:304)原因:java.io.ioexception:javax.security.sasl.saslexception:gss initiate failed[原因:gssexception:未提供有效凭据(机制级别:找不到任何kerberos tgt)],位于org.apache.hadoop.ipc.client$connection$1.run(client)。java:548)在javax.security.auth.subject.doas(主题)中的java.security.accesscontroller.doprivileged(本机方法)。java:396)在org.apache.hadoop.security.usergroupinformation.doas(usergroupinformation。java:1332)在org.apache.hadoop.ipc.client$connection.handlesaslconnectionfailure(client。java:512)在org.apache.hadoop.ipc.client$connection.setupiostreams(客户端。java:596)在org.apache.hadoop.ipc.client$connection.access$1700(client。java:220)在org.apache.hadoop.ipc.client.getconnection(client。java:1213)在org.apache.hadoop.ipc.client.call(client。java:1140) ... 25更多原因:javax.security.sasl.saslexception:gss initiate failed[原因:gssexception:未提供有效凭据(机制级别:找不到任何kerberos tgt)],位于com.sun.security.sasl.gsskerb.gsskrb5client.evaluatechallenge(gsskrb5client)。java:194)在org.apache.hadoop.security.saslrpclient.saslconnect(saslrpclient。java:137) 在org.apache.hadoop.ipc.client$connection.setupsaslconnection(client。java:423)在org.apache.hadoop.ipc.client$connection.access$1300(client。java:220)在org.apache.hadoop.ipc.client$connection$2.run(client。java:589)在org.apache.hadoop.ipc.client$connection$2.run(client。java:586)位于java.security.accesscontroller.doprivileged(本机方法)javax.security.auth.subject.doas(主题。java:396)在org.apache.hadoop.security.usergroupinformation.doas(usergroupinformation。java:1332)在org.apache.hadoop.ipc.client$connection.setupiostreams(client。java:585) ... 28其他原因:gssexception:未在sun.security.jgss.krb5.krb5initcredential.getinstance(krb5initcredential)提供有效凭据(机制级别:找不到任何kerberos tgt)。java:130)在sun.security.jgss.krb5.krb5mechfactory.getcredentialelement(krb5mechfactory。java:106)在sun.security.jgss.krb5.krb5mechfactory.getmechanismcontext(krb5mechfactory)。java:172)在sun.security.jgss.gssmanagerimpl.getmechanismcontext(gssmanagerimpl。java:209)位于sun.security.jgss.gsscontextimpl.initseccontext(gsscontextimpl。java:195)位于sun.security.jgss.gsscontextimpl.initseccontext(gsscontextimpl。java:162)在com.sun.security.sasl.gsskerb.gsskrb5client.evaluatechallenge(gsskrb5client。java:175) ... 还有37个
1条答案
按热度按时间laximzn51#
最后,我找到了原因:当kerberos使用aes-256加密时,应该安装jce。我已经在hdfs集群内的机器上安装了jce,但是我没有意识到集群外的客户机也需要jce。这就是为什么我可以在hdfs集群内的机器上访问hdfs,但不能在hdfs集群外的机器上访问。