我正在尝试配置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
答案 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:
- 启动mountd和nfsd。
醇>此命令不需要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新文档是否仍然具有误导性。谢谢!