HDFS - NFS网关配置 - 获取NFS3的异常

时间:2014-06-10 06:08:21

标签: hdfs

我正在尝试配置NFS网关以访问HDFS数据,并遵循http://hadoop.apache.org/docs/r2.4.0/hadoop-project-dist/hadoop-hdfs/HdfsNfsGateway.html ..

简而言之,从上面的链接,我遵循了以下步骤:

sudo service rpcbind start //这将启动portmapper和NFS守护进程。

sudo netstat -taupen | grep 111 //这确认propgram正在侦听端口111

rpcinfo -p ubuntu //告诉所有程序都在监听RPC客户端。

sudo service nfs-kernel-server start //这将启动mountd

rpcinfo -p ubuntu //这应该显示mountd

sudo service rpcbind stop //这将启动系统的portmapper

sudo netstat -taupen | grep 111 //确保没有其他程序正在运行此端口111.如果是,则使用“kill -9 portnum”

sudo ./hadoop-daemon.sh start portmap //使用hadoop程序启动portmap

sudo ./hadoop-daemon.sh start nfs3

sudo mount -t nfs -o vers = 3,proto = tcp,nolock 192.168.125.156:/ / var / hdnfs

mount.nfs:不支持请求的NFS版本或传输协议

以上错误消失(确保停止系统NFS调用服务nfs-kernel-server停止),现在我的NSF3异常低于:

org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: srini is not allowed to impersonate root
        at org.apache.hadoop.ipc.Client.call(Client.java:1410)
        at org.apache.hadoop.ipc.Client.call(Client.java:1363)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:206)
        at com.sun.proxy.$Proxy14.getFileLinkInfo(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:622)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:190)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:103)
        at com.sun.proxy.$Proxy14.getFileLinkInfo(Unknown Source)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileLinkInfo(ClientNamenodeProtocolTranslatorPB.java:712)
        at org.apache.hadoop.hdfs.DFSClient.getFileLinkInfo(DFSClient.java:1796)
        at org.apache.hadoop.hdfs.nfs.nfs3.Nfs3Utils.getFileStatus(Nfs3Utils.java:58)
        at org.apache.hadoop.hdfs.nfs.nfs3.Nfs3Utils.getFileAttr(Nfs3Utils.java:79)
        at org.apache.hadoop.hdfs.nfs.nfs3.RpcProgramNfs3.fsinfo(RpcProgramNfs3.java:1723)
        at org.apache.hadoop.hdfs.nfs.nfs3.RpcProgramNfs3.handleInternal(RpcProgramNfs3.java:1963)
        at org.apache.hadoop.oncrpc.RpcProgram.messageReceived(RpcProgram.java:162)
        at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
        at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560)
        at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:787)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:281)
        at org.apache.hadoop.oncrpc.RpcUtil$RpcMessageParserStage.messageReceived(RpcUtil.java:132)
        at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
        at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560)
        at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:787)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
        at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:462)
        at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:443)
        at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303)
        at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
        at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560)
        at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:555)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
        at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
        at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:107)
        at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312)
        at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:88)
        at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
        at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
 at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:701)
2014-06-11 13:51:14,035 WARN org.apache.hadoop.hdfs.nfs.nfs3.RpcProgramNfs3: Exception
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: srini is not allowed to impersonate root

2 个答案:

答案 0 :(得分:1)

我认为这是为响应https://issues.apache.org/jira/browse/HDFS-5804

而添加的修补程序的结果

具体来说,请注意Daryn Sharp在14/1月27日发表的关于希望摆脱基于isSecurityEnabled()的不同代码路径的评论。我认为这意味着删除了旧的默认行为,现在新行为需要一定量的配置。基本上修复了代码以支持安全性,旧的默认不安全行为所需的配置/文档从未更新以反映更改。开源,但关闭了文档。

我认为有两个新的额外信息需要使其工作 - 请注意您在第一步添加" nfsserver proxyuser" core-site.xml的详细信息(注意,我认为在hadoop服务器端需要这个 - 特别是名称节点 - 在你运行nfsserver的客户端上没有那么多,尽管到时候我让它工作,我把它设置到处都是)。我按照这一步骤,但将两个设置的值更改为*(星号),以便" nfsserver"在尝试从任何地方连接时都可以冒充任何人。特别是,nfsserver需要能够冒充ROOT来解决我们遇到的问题。

<property>
  <name>hadoop.proxyuser.nfsserver.groups</name>
  <value>*</value>
  <description>
         The 'nfsserver' user is allowed to proxy all members of the 'nfs-users1' and 
         'nfs-users2' groups. Set this to '*' to allow nfsserver user to proxy any group.
  </description>
</property>

<property>
  <name>hadoop.proxyuser.nfsserver.hosts</name>
  <value>*</value>
  <description>
         This is the host where the nfs gateway is running. Set this to '*' to allow
         requests from any hosts to be proxied.
  </description>
</property>

这引导我找到解决此问题所需的第二个关键信息 - 你必须将nfs3服务器作为用户ID&#34; nfsserver&#34; - 而不是像文档那样更容易解释hdfs:

  
      
  1. 启动mountd和nfsd。
  2.         

    此命令不需要root权限。但是,请确保   用户启动Hadoop集群和用户启动NFS   网关是一样的。

     hadoop nfs3
    
     OR
    
     hadoop-daemon.sh start nfs3
    
         

    注意,如果hadoop-daemon.sh脚本启动NFS网关,则为其日志   可以在hadoop日志文件夹中找到。

我相信这是作为jira 5804的一部分引入的第二个变化。很可能,在过去你应该将nfs3作为hdfs运行,并且在不安全的集群中,没有模仿继续进行。现在,模拟似乎是默认模式,并且您可以配置为进行模拟的唯一用户实际上是&#34; nfsserver&#34; - 这意味着您需要配置用户&#34; nfsserver&#34;。

最后,在添加上述配置后,您需要配置nfsserver用户:

#create a system user named nfsserver with hadoop as default group
sudo useradd -r -g hadoop nfsserver

最后以该用户身份启动nfs3服务(除了已经启动了端口映射)

sudo -u nfsserver hadoop-daemon.sh start nfs3

答案 1 :(得分:1)

感谢您找到文档中的不一致之处。 使用https://issues.apache.org/jira/browse/HDFS-5804,用户不必以启动HDFS的同一用户身份启动NFS网关。 (我会很快修复用户指南)。

无论HDFS群集是否安全,您都应始终指定以下两个属性: hadoop.proxyuser.nfsserver.groups和hadoop.proxyuser.nfsserver.hosts。正如用户指南中指出的那样,&#34; nfsserver&#34;应该由启动NFS网关的用户替换。

对于安全的HDFS集群,谁启动NFS网关并不重要。这完全取决于密钥表中的用户。在上面的两个属性中,&#34; nfsserver&#34;应该由keytab中的用户替换。

顺便说一句,如果您也在apache用户电子邮件列表中发布问题,可能会更快地得到答复。

我创建了一个JIRA来跟踪文档修复:https://issues.apache.org/jira/browse/HDFS-6732 请查看并评论JIRA新文档是否仍然具有误导性。谢谢!