我使用kerberos authencication配置了HDFS,我可以使用自己的keytab文件访问HDFS集群中任何一台机器上的HDFS。但是当我使用相同的keytab访问HDFS集群外部的远程服务器上的HDFS时,我无法访问。顺便说一句,我收到了以下错误消息,我已将服务器的配置文件krb5.conf复制到hadoop集群外的远程机器上。
java.io.IOException:本地异常失败:java.io.IOException: javax.security.sasl.SaslException:GSS启动失败[引起 GSSException:未提供有效凭据(机制级别:失败 找到任何Kerberos tgt)];主机详细信息:本地主机是: "的ubuntu / 10.235.6.156&#34 ;;目标主机是:" node0":21200;在 org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:759)at at org.apache.hadoop.ipc.Client.call(Client.java:1164)at org.apache.hadoop.ipc.ProtobufRpcEngine $ Invoker.invoke(ProtobufRpcEngine.java:202) 在$ Proxy9.getFileInfo(未知来源)at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:628) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.lang.reflect.Method.invoke(Method.java:597)at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:164) 在 org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:83) 在$ Proxy10.getFileInfo(未知来源)at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:1507)at at 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(FileSystem.java:1503) 在org.apache.hadoop.fs.FileSystem.globStatus(FileSystem.java:1481) 在 org.apache.hadoop.fs.shell.PathData.expandAsGlob(PathData.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(Command.java:190) 在org.apache.hadoop.fs.shell.Command.run(Command.java:154)at org.apache.hadoop.fs.FsShell.run(FsShell.java:254)at at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)at org.apache.hadoop.fs.FsShell.main(FsShell.java:304)引起: java.io.IOException:javax.security.sasl.SaslException:GSS启动 失败[由GSSException引起:未提供有效凭据 (机制级别:无法找到任何Kerberos tgt)] org.apache.hadoop.ipc.Client $ Connection $ 1.run(Client.java:548)at at java.security.AccessController.doPrivileged(Native Method)at javax.security.auth.Subject.doAs(Subject.java:396)at 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(Client.java:596) 在 org.apache.hadoop.ipc.Client $ Connection.access $ 1700(Client.java:220) 在org.apache.hadoop.ipc.Client.getConnection(Client.java:1213)at org.apache.hadoop.ipc.Client.call(Client.java:1140)......还有25个 引起:javax.security.sasl.SaslException:GSS启动失败 [由GSSException引起:未提供有效凭据(机制 级别:找不到任何Kerberos tgt)] com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:194) 在 org.apache.hadoop.security.SaslRpcClient.saslConnect(SaslRpcClient.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)at at org.apache.hadoop.ipc.Client $ Connection $ 2.run(Client.java:586)at at java.security.AccessController.doPrivileged(Native Method)at javax.security.auth.Subject.doAs(Subject.java:396)at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1332) 在 org.apache.hadoop.ipc.Client $ Connection.setupIOstreams(Client.java:585) ... 28更多引起:GSSException:未提供有效凭据 (机制级别:无法找到任何Kerberos tgt) sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.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个
答案 0 :(得分:3)
最后,我找到了原因:当kerberos使用AES-256加密时,你应该安装JCE。我在HDFS集群中的机器上安装了JCE,但我没有意识到集群外的客户端机器也需要JCE。这就是为什么我可以在HDFS集群内的机器上访问HDFS,但不能在HDFS集群外的机器上访问HDFS的原因。