HDFS NFS Gateway

HDFS NFS Gateway

Overview

NFS Gateway支持NFSv3,允许HDFS作为客户端本地文件系统的一部分挂载在本地文件系统。目前,NFS Gateway支持和启用了下面的使用模式:

1.      用户可以在基于NFSv3客户端兼容的操作系统上的本地文件系统上浏览HDFS文件系统。

2.      用户可以从挂载到本地文件系统的HDFS文件系统上下载文件。

3.      用户可以从本地文件系统直接上传文件到HDFS文件系统。

4.      用户可以通过挂载点直接将数据流写入HDFS。目前支持文件append,随机写还不支持。

NFS Gateway机器需要跟运行HDFS Client一样的环境,像Jar包文件,HADOOP_CONF目录等。NFSGateway可以放在跟DataNode,NameNode或者任何一台HDFS Client机器上。

Configuration

运行NFS-Gateway的用户必须能够代理所有使用NFS挂载点的用户。例如,如果用户“nfsserver” 正在运行Gateway,属于用户组“nfs-users1”和“nfs-users2”的用户使用NFS挂载点,然后,在NameNode的core-site.xml文件,必须配置下面的配置(注意,用在你的集群中启动Gateway服务的用户名代替“nfsserver”):
  
  
  
  
[html] view plain copy
  1. <property>  
  2.   <name>hadoop.proxyuser.nfsserver.groups</name>  
  3.   <value>nfs-users1,nfs-users2</value>  
  4.   <description>  
  5.          The 'nfsserver' user is allowed to proxy all members of the 'nfs-users1' and   
  6.          'nfs-users2' groups. Set this to '*' to allow nfsserver user to proxy any group.  
  7.   </description>  
  8. </property>  
  9. <property>  
  10.   <name>hadoop.proxyuser.nfsserver.hosts</name>  
  11.   <value>nfs-client-host1.com</value>  
  12.   <description>  
  13.          This is the host where the nfs gateway is running. Set this to '*' to allow  
  14.          requests from any hosts to be proxied.  
  15.   </description>  
  16. </property>  

上面仅仅是NFS Gateway在不安全的情况下必要的配置。对于使用Kerberos认证的Hadoop集群,下面的配置需要被增加到hdfs-site.xml配置文件中:

  
  
  
  
[html] view plain copy
  1. <property>  
  2.     <name>dfs.nfsgateway.keytab.file</name>  
  3.     <value>/etc/hadoop/conf/nfsserver.keytab</value> <!-- path to the nfs gateway keytab -->  
  4.   </property>  
  5.   <property>  
  6.     <name>dfs.nfsgateway.kerberos.principal</name>  
  7.     <value>nfsserver/[email protected]</value>  
  8.   </property>  

强烈建议用户基于他们的用例更新部分配置属性。所有相关的属性都可被增加到hdfs-site.xml文件中:

1.      如果客户端在存取时间允许时挂载,确认下面的属性没有在配置文件中被禁用。这个属性更改之后,只有NameNode需要重启。在系统的Unix操作系统上,用户可以通过用noatime挂载来禁用存取时间。如果export用noatime挂载,用户不需要改变下面的属性,因此不需要重启NameNode。

  
  
  
  
[html] view plain copy
  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>  

2.      用户希望更新文件转储目录。NFS客户端经常重新排序写进程。连续的写操作可能一随即顺序到达NFS Gateway。这个目录被用来在写入到HDFS之前临时的保存乱序的写操作。对于每一个文件,乱序的写操作在超过一定的阀值(例如 1MB内存)后被转储。你需要确认目录有足够的空间。例如,如果程序上传10个文件,每一个100MB,建议这个目录有大约1GB的空间,以防最坏的情况,重新排序的写操作发生在每一个目录。这个属性被更新后,只有NFS Gateway需要重新启动。

  
  
  
  
[html] view plain copy
  1. <property>      
  2.         <name>dfs.nfs3.dump.dir</name>  
  3.         <value>/tmp/.hdfs-nfs</value>  
  4. lt;/property>  
3.       为了优化性能,建议rtmax被更新为1MB。但是,注意,这个1MB是一个客户端的分配,不是来自共享内存,因此,一个较大的值可能对读操作有不利影响,消耗很多内存。这个属性的最大值是1MB。
  
  
  
  
[html] view plain copy
  1. <property>  
  2.   <name>dfs.nfs.rtmax</name>  
  3.   <value>1048576</value>  
  4.   <description>This is the maximum size in bytes of a READ request  
  5.     supported by the NFS gateway. If you change this, make sure you  
  6.     also update the nfs mount's rsize(add rsize= # of bytes to the   
  7.     mount directive).  
  8.   </description>  
  9. </property>  
  10. <property>  
  11.   <name>dfs.nfs.wtmax</name>  
  12.   <value>65536</value>  
  13.   <description>This is the maximum size in bytes of a WRITE request  
  14.     supported by the NFS gateway. If you change this, make sure you  
  15.     also update the nfs mount's wsize(add wsize= # of bytes to the   
  16.     mount directive).  
  17.   </description>  
  18. </property>  

4.      默认地,export可以被任何客户端挂载。为了更好的控制访问,用户可以更新下面的属性。配置的value包括机器的名字和访问权限,用空格分开。机器名字格式可以是一台主机,通配符,或者IPv4网卡地址。访问权限用rw或者指定机器的访问权限readwrite或者readonly。如果访问权限没有被提供,默认的是只读。条目用“;”分隔。例如“192.168.0.0/22 rw ; host*.example.com ;host1.test.org ro;”。这个属性被更新后,只有NFSGateway需要重新启动。

  
  
  
  
[html] view plain copy
  1. <property>  
  2.   <name>dfs.nfs.exports.allowed.hosts</name>  
  3.   <value>* rw</value>  
  4. </property>  

5.      自定义日志设置。为了得到NFS的debug 堆栈,用户可以编辑 log4j.property文件增加下面的内容。注意,debugtrace,特别是ONCRPC,可以非常冗长。

改变日志级别:

  
  
  
  
[html] view plain copy
  1. log4j.logger.org.apache.hadoop.hdfs.nfs=DEBUG  

获取更多ONCRPC请求的细节:

  
  
  
  
[html] view plain copy
  1. log4j.logger.org.apache.hadoop.oncrpc=DEBUG  

Start and Stop NFS gateway service

需要启动3个守护进程提供NFS服务:rpcbind(或者portmap),mountd还有nfsd。NFS Gateway进程有nfsd和mountd进程。它共享HDFS根目录“/”为唯一的export。建议使用包含在NFS Gateway包里的portmap。即使NFS Gateway与portmap/rpcbind一起在大多数linux发行版中被提供,包含portmap的包也需要在一些linux系统像REHL6.2安装,因为rpcbind的bug。更多的细节可以在HDFS-4763中被找到。

1.      停止系统中的nfs/rpcbind/portmap服务(不同的Unix平台可能命令不同):

  
  
  
  
[html] view plain copy
  1. service nfs stop  
  2. service rpcbind stop  

2.      启动包含portmap的包(需要root权限):

  
  
  
  
[html] view plain copy
  1. hadoop portmap  
  2.  OR  
  3. hadoop-daemon.sh start portmap  

3.      开启mountd和nfsd

这个命令不需要root权限,但是,请确保启动Hadoop集群的用户与启动NFS Gateway的用户相同。

  
  
  
  
[html] view plain copy
  1. hadoop nfs3  
  2.      OR  
  3. hadoop-daemon.sh start nfs3  

注意:如果hadoop-daemon.sh脚本启动NFS Gateway,它的log可以在Hadoop的日志文件夹中被找到。

4.      停止NFS Gateway 服务。

  
  
  
  
[html] view plain copy
  1. hadoop-daemon.sh stop nfs3  
  2. hadoop-daemon.sh stop portmap  

Verify validity of NFS relatedservices

1.      执行下面的命令来验证服务是否正在运行:

  
  
  
  
[html] view plain copy
  1. rpcinfo -p $nfs_server_ip  

你应该可以考到类似下面的输出:

  
  
  
  
[html] view plain copy
  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命名空间是否可被export和挂载

  
  
  
  
[html] view plain copy
  1. showmount -e $nfs_server_ip  
你应该可以看到类似下面的输出:
  
  
  
  
[html] view plain copy
  1. Exports list on $nfs_server_ip :  
  2.         / (everyone)  

Mount the export “/”

目前NFS V3只用TCP作为传输协议。不支持NLM,所以需要挂载选项“nolock”。建议使用hard mount。这是因为,当写进程被记录到NFS客户端的内核之后,即使在客户端发送所有的数据到NFS Gateway之后,它还是可能花费NFS Gateway一些额外的时间来传输数据到HDFS。

如果必须使用soft mount,用户应该给他一个相对长的timeout(至少不少于主机上默认的timeout)。

用户可以像下面这样mount HDFS的命名空间:

  
  
  
  
[html] view plain copy
  1. mount -t nfs -o vers=3,proto=tcp,nolock $server:/  $mount_point  

人后用户可以将HDFS作为本地文件系统的一部分访问,除了hard link和random write不支持。

User Authentication and mapping

本Hadoop发行版中的NFS Gateway使用的AUTH_UNIX风格的认证。当NFS客户端的用户访问挂载点时,NFS客户端将UID传给NFS Gateway。NFS Gateway做一个检查,以从UID中需找用户名,然后将用户名与HDFS请求一起传给HDFS。例如,如果NFS客户端的当前用户是admin。为了使用用户hdfs访问HDFS,当访问挂载目录时,你需要在客户端操作系统上切换当前用户到hdfs。

系统管理员必须确定NFS客户端主机上的用户有相同的用户名和UID。如果是用同一个用户管理系统(例如LDAP/NIS)来创建和分发用户到HDFS节点和NFS客户端节点的话,这通常不是一个问题。在用户账户在不同主机上被手工创建的情况下,你可能需要修改NFS客户端和NFS Gateway主机上的UID(例如,"usermod -u 123 myusername")以使两边系统。更多RPCAUTH_UNIX的技术细节可在RPC Specification中被找到。20.HDFS NFS Gateway

你可能感兴趣的:(HDFS NFS Gateway)