分享

HDFS NFS网关



问题导读:
1.如何启停NFS网关服务?
2.如何有效挂载NFS?






概述

NFS网关支持NFSv3,并允许HFDS被当作客户端本地的文件系统一样被挂载。目前NFS网关支持/允许下面的使用模式:
-> 用户可以通过兼容操作系统的NFSv3客户端作为本地文件系统来浏览HDFS文件系统。
-> 用户可以从HDFS文件系统中下载文件到他们的本地文件系统。
-> 用户可以直接将他们本地文件系统的文件上传到HDFS文件系统。
-> 用户可以通过挂载点直接向HDFS输出流数据。文件追加操作被支持,但是不允许随机写。
NFS网关机器需要包含HDFS客户端(包括Hadoop Jar文件,HADOOP_CONF目录)。NFS网关在DataNode,NameNode和任意HDFS客户端上。
配置

NFS网关使用代理用户来代理所有访问NFS挂载点的用户。在非安全模式下,运行网关的用户即代理用户,而安全模式下,Kerberos keytab中的用户是代理用户。假定代理用户是nfsserver,并且使用NFS挂载点的用户属于组 ‘users-group1’和’users-group2’的用户。在NameNode 的core-site.xml中,必须设置下面两个属性后重启NameNode(DataNode不需要)。注意:替换nfsserver为你集群的代理用户。
  1. <property>
  2.   <name>hadoop.proxyuser.nfsserver.groups</name>
  3.   <value>root,users-group1,users-group2</value>
  4.   <description>
  5.          The 'nfsserver' user is allowed to proxy all members of the 'users-group1' and
  6.          'users-group2' groups. Note that in most cases you will need to include the
  7.          group "root" because the user "root" (which usually belonges to "root" group) will
  8.          generally be the user that initially executes the mount on the NFS client system.
  9.          Set this to '*' to allow nfsserver user to proxy any group.
  10.   </description>
  11. </property>
  12. <property>
  13.   <name>hadoop.proxyuser.nfsserver.hosts</name>
  14.   <value>nfs-client-host1.com</value>
  15.   <description>
  16.          This is the host where the nfs gateway is running. Set this to '*' to allow
  17.          requests from any hosts to be proxied.
  18.   </description>
  19. </property>
复制代码


在非安全模式下,上面是NFS网关唯一要配置的。而Kerberos化的hadoop集群中,需要为网关添加下面的配置到hdfs-site.xml中。注意:替换nfsserver为代理用户并确保在Kerberos keytab中的用户是相同的代理用户。

  1. <property>
  2.    <name>nfs.keytab.file</name>
  3.     <value>/etc/hadoop/conf/nfsserver.keytab</value> <!-- path to the nfs gateway keytab -->
  4.   </property>
  5.   <property>
  6.     <name>nfs.kerberos.principal</name>
  7.     <value>nfsserver/_HOST@YOUR-REALM.COM</value>
  8.   </property>
复制代码


下面的NFS网关配置对于安全模式和非安全模式都是可选的。
AIX NFS客户端有一些已经的问题,可能导致HDFS NFS网关不能正常工作。如果你想要在AIX上访问HDFS NFS网关,你需要设置下面的选项来进行变通。
  1. <property>
  2.   <name>nfs.aix.compatibility.mode.enabled</name>
  3.   <value>true</value>
  4. </property>
复制代码

注意,正常的非AIX客户端不应该启用AIX兼容模式。这个由AIX兼容模式的变通实现有效的禁用了下面的保障:确保通过NFS返回一致性的目录信息列表,以及所有的发送给NFS服务器的数据都能确保被提交。
强烈建议用户根据他们的实际用例来更新一些配置属性。下面所有的配置属性都可以添加到hdfs-site.xml中。
{·} 如果客户端以允许更新访问时间(access time)的模式挂载了NFS导出目录(export),确保下面的属性在配置文件中未被禁用。修改下面参数后只重启NameNode即可,在一些Unix系统中,用户可以通过以”noatime”的方式挂载来禁用访问时间更新。如果导出目录(export)被以”noatime”的方式挂载,用户就不用改变下面的参数并重启NameNode。
  1. <property>
  2.   <name>dfs.namenode.accesstime.precision</name>
  3.   <value>3600000</value>
  4.   <description>The access time for HDFS file is precise upto this value.
  5.     The default value is 1 hour. Setting a value of 0 disables
  6.     access times for HDFS.
  7.   </description>
  8. </property>
复制代码

{·} 用户需要更新文件转储目录参数。NFS客户端经常重新安排写操作,顺序的写操作会以随机到达NFS网关。这个目录常用于临时存储无序的写操作。对于每个文件,无序的写操作会在他们积累在内存中超过一定阈值(如。1 mb)被转储。需要确保有足够的空间的目录。例如,如果应用上传10个100M,那么这个转储目录推荐有1GB左右的空间,以便每个文件都发生最坏的情况。只有NFS网关需要在设置该属性后重启。

  1. <property>   
  2.     <name>nfs.dump.dir</name>
  3.     <value>/tmp/.hdfs-nfs</value>
  4. </property>
复制代码

{·} 默认情况下,export可以被任何客户端挂载。为了更好的控制访问,永固可以更新下面的属性。值字符串为机器名和访问策略,通过空格来分割。机器名的格式可以是单一的主机,Java的正则表达式或者IPv4地址。访问权限使用rw或ro来指定导出目录的读/写或机器只读访问。如果访问策略没被提供,默认为只读的。每个条目使用“;”来分割。例如:”192.168.0.0/22 rw ; host.*\.example\.com ; host1.test.org ro;”。在修改完该选项后,只重启NFS网关即可。

  1. <property>
  2.   <name>nfs.exports.allowed.hosts</name>
  3.   <value>* rw</value>
  4. </property>
复制代码

{·} JVM和日志设置。你可以在HADOOP_NFS3_OPTS中输出JVM设置(例如堆内存大小和GC日志)。更多NFS相关的设置可以在hadoop-env.sh中找到,你可以在log4j.property文件中添加下面的选项,来获得NFS的调试跟踪信息。注意,调试跟踪信息,特别是ONCRPC,会非常详尽。
-> 改变日志级别:
  1. log4j.logger.org.apache.hadoop.hdfs.nfs=DEBUG
复制代码
-> 获得ONCRPC请求的更多信息:
  1. log4j.logger.org.apache.hadoop.oncrpc=DEBUG
复制代码



启停NFS网关服务

NFS服务需要通过三个后台进程提供:rpcbind(or portmap),mountd和nfsd。NFS网关进程有nfsd和mountd,它只将HDFS root目录”/”作为导出目录。虽然大多数Linux发行版中提供的portmap/rpcbind也能和NFS网关一起工作,还是推荐使用NFS网关中包含的portmap包,例如在RHEL6.2的portmap就有一些BUG。

1. 停止Linux发行版中的nfs/rpcbind/portmap服务(该命令可能由Unix平台而不同)
  1. service nfs stop
  2. service rpcbind stop
复制代码

2. 启动包含portmap的包(需要root权限)
  1. hdfs portmap
复制代码

  1. hadoop-daemon.sh start portmap
复制代码

3. 启动mountd和nfsd
执行这个命令不需要root权限。在非安全模式下,NFS网关应该由前面提到的代理用户启动。而在安全模式下,任何可以读在”nfs.keytab.file”中定义的Kerberos keytab文件的用户都可以启动NFS网关。
  1. hdfs nfs3
复制代码

  1. hadoop-daemon.sh start nfs3
复制代码
注意:如果hadoop-daemon.sh脚本启动了NFS网关,它的日志可以在Hadoop日志目录下找到。
4. 停止NFS服务
  1. hadoop-daemon.sh stop nfs3
  2. hadoop-daemon.sh stop portmap
复制代码

可选操作:你以root来启动NFS网关时,你可以放弃运行Hadoop-provided portmap守护进程,而在所有操作系统上使用系统的portmap NFS守护进程。这将允许HDFS NFS网关解决上述缺陷,仍然使用系统portmap守护进程来注册。如果这样做,就像平时一样网关启动NFS守护进程,但一定要以“root”用户启动,并为非特权用户设置“HADOOP_PRIVILEGED_NFS_USER”环境变量。在这种模式下NFS网关会以root用户启动系统portmap来完成它的初始注册,然后会在之后NFS网关的生存周期内回退特权用户(root)到HADOOP_PRIVILEGED_NFS_USER中指定的用户上。如果使用这个方法,则跳过上面的1和2步骤。
验证NFS相关服务的有效性

1. 执行下面命令来验证所有的服务运行状态
  1. rpcinfo -p $nfs_server_ip
复制代码

你可以看到类似下面的输出:


  1.     program vers proto   port
  2.        100005    1   tcp   4242  mountd
  3.        100005    2   udp   4242  mountd
  4.        100005    2   tcp   4242  mountd
  5.        100000    2   tcp    111  portmapper
  6.        100000    2   udp    111  portmapper
  7.        100005    3   udp   4242  mountd
  8.        100005    1   udp   4242  mountd
  9.        100003    3   tcp   2049  nfs
  10.        100005    3   tcp   4242  mountd
复制代码
2. 验证是否HDFS命名空间被导出并可用于挂载

  1. showmount -e $nfs_server_ip
复制代码
你可以看到类似下面的输出:
  1. Exports list on $nfs_server_ip :
  2. / (everyone)
复制代码



挂载导出目录 “/”

当前NFSv3只使用TCP来作为传输协议。NLM不被支持,所以需要挂载选项”nolock”。建议使用硬挂载(hard moun),因为即使客户机将所有数据发送给NFS网关,这会导致在写操作被NFS客户端内核保存后,NFS网关需要额外的时间来传输数据给HDFS。如果软挂载被使用,用户需要给一个相对比较上的timeout(最少不能少于主机上默认的timeout)。
用户可以通过下面的命令来挂载HDFS命名空间:
  1. mount -t nfs -o vers=3,proto=tcp,nolock,noacl $server:/ $mount_point
复制代码
接下来用户可以将HDFS作为本地文件系统的一部分来访问,除此之外,硬链接和随机写操作不支持。为了优化大文件I / O的性能,可以在挂载时增加NFS传输大小(rsize和wsize)。默认情况下,NFS网关支持1MB作为最大传输大小。可以通过修改hdfs-site.xml中的nfs.rtmax和nfs.rtmax来获得更大的数据传输大小。

允许非特权客户端的挂载

在客户端的root访问情形下通常不可用,一些安全措施,诸如可以通过确保只有来自特权端口的NFS客户端可以连接到NFS服务器上。这一特性称为“端口监控。”这个特性在默认情况下不启用在HDFS NFS网关,但是可以选择性地在NFS网关机器的hdfs-site.xml启用以下配置。
  1. <property>
  2.   <name>nfs.port.monitoring.disabled</name>
  3.   <value>false</value>
  4. </property>
复制代码



用户验证和映射
在当前版本的NFS网关使用AUTH_UNIX风格的验证。当NFS客户端上的用户访问挂载点时,NFS客户端将传递UID给NFS网关。NFS网关会通过UID来查找用户名,并通过HDFS请求将用户名传输到HDFS中。例如,如果NFS客户端当前用户“admin”,当该用户访问挂载目录时,NFS网关会以“admin”来访问HDFS。如果要以hfds用户来访问HDFS,就需要在客户端系统上将当前用户切换到”HDFS” 来访问挂载目录。
系统管理员必须保证NFS客户端和NFS网关主机上拥有相同的名称和UID。这在使用用户管理系统(例如:LDAP/NIS)来部署HDFS节点和NFS客户端节点时通常很好实现。
如果用户帐号在不同的主机上手工创建,可能要在NFS客户端或者NFS网关主机上需要修改UID(例如,执行&#8203; “usermod -u 123 myusername”),来确保两边一致。更多的RPC AUTH_UNIX技术细节可以在RPC specification中找到。
可选操作:如果希望在一个完全独立的UID/GID集的环境下访问HDFS NFS网关,系统管理员可以配置一个自定义的静态映射文件。默认这个文件位于”/etc/nfs.map”,也可以通过设置”static.id.mapping.file”配置属性来配置一个静态映射文件的自定义路径,静态映射文件的格式类似于exports(5) 手册页(Linux Manual),大概如下:
  1. # Mapping for clients accessing the NFS gateway
  2. uid 10 100 # Map the remote UID 10 the local UID 100
  3. gid 11 101 # Map the remote GID 11 to the local GID 101
复制代码





原文:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsNfsGateway.html
译文:http://debugo.com/hdfs-nfs/



欢迎加入about云群90371779322273151432264021 ,云计算爱好者群,亦可关注about云腾讯认证空间||关注本站微信

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条