带Kerberos的Hdfs无法从远程服务器访问

时间:2012-11-26 02:28:44

标签: hadoop kerberos hdfs

我使用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个

1 个答案:

答案 0 :(得分:3)

最后,我找到了原因:当kerberos使用AES-256加密时,你应该安装JCE。我在HDFS集群中的机器上安装了JCE,但我没有意识到集群外的客户端机器也需要JCE。这就是为什么我可以在HDFS集群内的机器上访问HDFS,但不能在HDFS集群外的机器上访问HDFS的原因。