HDFS NFS Gateway – 陈振阳(Net) – 博客频道 – CSDN.NET

NFS Gateway支持NFSv3允许HDFS作为客户端本地文件系统的一部分挂载在本地文件系统。

目前NFS Gateway支持和启用了下面的使用模式:

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

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

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

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

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

Configuration

运行<b style="color:black;background-color:#A0FFFF">NFS</b><b style="color:black;background-color:#ff9999">-</b><b style="color:black;background-color:#99ff99">Gateway</b>的用户必须能够代理所有使用<b style="color:black;background-color:#A0FFFF">NFS</b>挂载点的用户。例如<b style="color:white;background-color:#886800">,</b>如果用户“nfsserver” 正在运行<b style="color:black;background-color:#99ff99">Gateway</b><b style="color:white;background-color:#886800">,</b>属于用户组“<b style="color:black;background-color:#A0FFFF">nfs</b><b style="color:black;background-color:#ff9999">-</b>users1”和“<b style="color:black;background-color:#A0FFFF">nfs</b><b style="color:black;background-color:#ff9999">-</b>users2”的用户使用<b style="color:black;background-color:#A0FFFF">NFS</b>挂载点<b style="color:white;background-color:#886800">,</b>然后<b style="color:white;background-color:#886800">,</b>在NameNode的core<b style="color:black;background-color:#ff9999">-</b>site.xml文件<b style="color:white;background-color:#886800">,</b>必须配置下面的配置(注意<b style="color:white;background-color:#886800">,</b>用在你的集群<span style="color:#333333">中启动<b style="color:black;background-color:#99ff99">Gateway</b></span>服务的用户名代替“nfsserver”):

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_1_7799710" name="code" class="html">&lt;property&gt;</p><p>  &lt;name&gt;hadoop.proxyuser.nfsserver.groups&lt;/name&gt;</p><p>  &lt;value&gt;<b style="color:black;background-color:#A0FFFF">nfs</b><b style="color:black;background-color:#ff9999">-</b>users1<b style="color:white;background-color:#886800">,</b><b style="color:black;background-color:#A0FFFF">nfs</b><b style="color:black;background-color:#ff9999">-</b>users2&lt;/value&gt;</p><p>  &lt;description&gt;</p><p>         The 'nfsserver' user is allowed to proxy all members of the '<b style="color:black;background-color:#A0FFFF">nfs</b><b style="color:black;background-color:#ff9999">-</b>users1' and </p><p>         '<b style="color:black;background-color:#A0FFFF">nfs</b><b style="color:black;background-color:#ff9999">-</b>users2' groups. Set this to '*' to allow nfsserver user to proxy any group.</p><p>  &lt;/description&gt;</p><p>&lt;/property&gt;</p><p>&lt;property&gt;</p><p>  &lt;name&gt;hadoop.proxyuser.nfsserver.hosts&lt;/name&gt;</p><p>  &lt;value&gt;<b style="color:black;background-color:#A0FFFF">nfs</b><b style="color:black;background-color:#ff9999">-</b>client<b style="color:black;background-color:#ff9999">-</b>host1.com&lt;/value&gt;</p><p>  &lt;description&gt;</p><p>         This is the host where the <b style="color:black;background-color:#A0FFFF">nfs</b> <b style="color:black;background-color:#99ff99">gateway</b> is running. Set this to '*' to allow</p><p>         requests from any hosts to be proxied.</p><p>  &lt;/description&gt;</p><p>&lt;/property&gt;

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

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_2_8465584" name="code" class="html">&lt;property&gt;</p><p>    &lt;name&gt;dfs.nfsgateway.keytab.file&lt;/name&gt;</p><p>    &lt;value&gt;/etc/hadoop/conf/nfsserver.keytab&lt;/value&gt; &lt;!<b style="color:black;background-color:#ff9999">-</b><b style="color:black;background-color:#ff9999">-</b> path to the <b style="color:black;background-color:#A0FFFF">nfs</b> <b style="color:black;background-color:#99ff99">gateway</b> keytab <b style="color:black;background-color:#ff9999">-</b><b style="color:black;background-color:#ff9999">-</b>&gt;</p><p>  &lt;/property&gt;</p><p>  &lt;property&gt;</p><p>    &lt;name&gt;dfs.nfsgateway.kerberos.principal&lt;/name&gt;</p><p>    &lt;value&gt;nfsserver/_HOST@YOUR<b style="color:black;background-color:#ff9999">-</b>REALM.COM&lt;/value&gt;</p><p>  &lt;/property&gt;

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

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

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_3_6099033" name="code" class="html">&lt;property&gt;</p><p>  &lt;name&gt;dfs.namenode.accesstime.precision&lt;/name&gt;</p><p>  &lt;value&gt;3600000&lt;/value&gt;</p><p>  &lt;description&gt;The access time for <b style="color:black;background-color:#ffff66">HDFS</b> file is precise upto this value.</p><p>    The default value is 1 hour. Setting a value of 0 disables</p><p>    access times for <b style="color:black;background-color:#ffff66">HDFS</b>.</p><p>  &lt;/description&gt;</p><p>&lt;/property&gt;

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

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_4_7843920" name="code" class="html"> &lt;property&gt;    </p><p>         &lt;name&gt;dfs.<b style="color:black;background-color:#A0FFFF">nfs</b>3.dump.dir&lt;/name&gt;</p><p>         &lt;value&gt;/tmp/.<b style="color:black;background-color:#ffff66">hdfs</b><b style="color:black;background-color:#ff9999">-</b><b style="color:black;background-color:#A0FFFF">nfs</b>&lt;/value&gt;</p><p>&lt;/property&gt;

3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了优化性能<b style="color:white;background-color:#886800">,</b>建议rtmax被更新为1MB。但是<b style="color:white;background-color:#886800">,</b>注意<b style="color:white;background-color:#886800">,</b>这个1MB是一个客户端的分配<b style="color:white;background-color:#886800">,</b>不是来自共享内存<b style="color:white;background-color:#886800">,</b>因此<b style="color:white;background-color:#886800">,</b>一个较大的值可能对读操作有不利影响<b style="color:white;background-color:#886800">,</b>消耗很多内存。这个属性的最大值是1MB。

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_5_9065419" name="code" class="html">&lt;property&gt;</p><p>  &lt;name&gt;dfs.<b style="color:black;background-color:#A0FFFF">nfs</b>.rtmax&lt;/name&gt;</p><p>  &lt;value&gt;1048576&lt;/value&gt;</p><p>  &lt;description&gt;This is the maximum size in bytes of a READ request</p><p>    supported by the <b style="color:black;background-color:#A0FFFF">NFS</b> <b style="color:black;background-color:#99ff99">gateway</b>. If you change this<b style="color:white;background-color:#886800">,</b> make sure you</p><p>    also update the <b style="color:black;background-color:#A0FFFF">nfs</b> mount's rsize(add rsize= # of bytes to the </p><p>    mount directive).</p><p>  &lt;/description&gt;</p><p>&lt;/property&gt;</p><p>&lt;property&gt;</p><p>  &lt;name&gt;dfs.<b style="color:black;background-color:#A0FFFF">nfs</b>.wtmax&lt;/name&gt;</p><p>  &lt;value&gt;65536&lt;/value&gt;</p><p>  &lt;description&gt;This is the maximum size in bytes of a WRITE request</p><p>    supported by the <b style="color:black;background-color:#A0FFFF">NFS</b> <b style="color:black;background-color:#99ff99">gateway</b>. If you change this<b style="color:white;background-color:#886800">,</b> make sure you</p><p>    also update the <b style="color:black;background-color:#A0FFFF">nfs</b> mount's wsize(add wsize= # of bytes to the </p><p>    mount directive).</p><p>  &lt;/description&gt;</p><p>&lt;/property&gt;

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

;host1.test.org ro;”。这个属性被更新后只有NFSGateway需要重新启动。

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_6_9414866" name="code" class="html">&lt;property&gt;</p><p>  &lt;name&gt;dfs.<b style="color:black;background-color:#A0FFFF">nfs</b>.exports.allowed.hosts&lt;/name&gt;</p><p>  &lt;value&gt;* rw&lt;/value&gt;</p><p>&lt;/property&gt;

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

改变日志级别:

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_7_9174886" name="code" class="html">log4j.logger.org.apache.hadoop.<b style="color:black;background-color:#ffff66">hdfs</b>.<b style="color:black;background-color:#A0FFFF">nfs</b>=DEBUG

获取更多ONCRPC请求的细节:

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_8_6111006" name="code" class="html">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。更多的细节可以在HDFS4763中被找到。

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

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_9_9284353" name="code" class="html">   service <b style="color:black;background-color:#A0FFFF">nfs</b> stop</p><p>   service rpcbind stop

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

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_10_4409547" name="code" class="html">    hadoop portmap</p><p>     OR</p><p>    hadoop<b style="color:black;background-color:#ff9999">-</b>daemon.sh start portmap

3.      开启mountd和nfsd

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

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_11_5805770" name="code" class="html">hadoop <b style="color:black;background-color:#A0FFFF">nfs</b>3</p><p>     OR</p><p>hadoop<b style="color:black;background-color:#ff9999">-</b>daemon.sh start <b style="color:black;background-color:#A0FFFF">nfs</b>3

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

4.      停止NFS Gateway 服务。

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_12_8663471" name="code" class="html">   hadoop<b style="color:black;background-color:#ff9999">-</b>daemon.sh stop <b style="color:black;background-color:#A0FFFF">nfs</b>3</p><p>   hadoop<b style="color:black;background-color:#ff9999">-</b>daemon.sh stop portmap

Verify validity of NFS relatedservices

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

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_13_2708871" name="code" class="html">rpcinfo <b style="color:black;background-color:#ff9999">-</b>p $<b style="color:black;background-color:#A0FFFF">nfs</b>_server_ip

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

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_14_6089960" name="code" class="html">program vers proto   port</p><p>       100005    1   tcp   4242  mountd</p><p>       100005    2   udp   4242  mountd</p><p>       100005    2   tcp   4242  mountd</p><p>       100000    2   tcp    111  portmapper</p><p>       100000    2   udp    111  portmapper</p><p>       100005    3   udp   4242  mountd</p><p>       100005    1   udp   4242  mountd</p><p>       100003    3   tcp   2049  <b style="color:black;background-color:#A0FFFF">nfs</b></p><p>       100005    3   tcp   4242  mountd

2.      验证HDFS命名空间是否可被export和挂载

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_15_1738542" name="code" class="html">showmount <b style="color:black;background-color:#ff9999">-</b>e $<b style="color:black;background-color:#A0FFFF">nfs</b>_server_ip

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

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_16_3691172" name="code" class="html">Exports list on $<b style="color:black;background-color:#A0FFFF">nfs</b>_server_ip :</p><p>        / (everyone)

Mount the export “/”

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

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

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

<pre code_snippet_id="455624" snippet_file_name="blog_20140821_17_6515854" name="code" class="html">mount <b style="color:black;background-color:#ff9999">-</b>t <b style="color:black;background-color:#A0FFFF">nfs</b> <b style="color:black;background-color:#ff9999">-</b>o vers=3<b style="color:white;background-color:#886800">,</b>proto=tcp<b style="color:white;background-color:#886800">,</b>nolock $server:/  $mount_point

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

User Authentication and mapping

本Hadoop发行版中的NFS Gateway使用的AUTH_UNIX风格的认证。当NFS客户端的用户访问挂载点时NFS客户端将UID传给NFS GatewayNFS 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

来源URL:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c422460b1c37b9ec7b7757578fd82f2747f41802bded602571507be9dad58940d8ba922f2e8d33712d5cd04e48854deedc46549d74d14de9de4cb4fca777c0e5c5d3ae4353bc44050b97808a4d7114dd6e800347e4b1ed4b022913ad993672ff282b7ed93440c750f991256f7796f6ab4b4cb23da06106e4a422c04a05c465b31e6b3335a45bc10f465637f73e25e8454d13929d4ae75b280175ea5fb2c9d6b69c5f8dacb666de&p=882a964fdd9919bc0be29637450ec9&newp=83759a46dcc810e70be2963c170788231610db2151d4d3172e9c&user=baidu&fm=sc&query=HDFS+NFS+Gateway+%2D+%B3%C2%D5%F1%D1%F4%28Net%29+%2D+%B2%A9%BF%CD%C6%B5%B5%C0%2D+CSDN%2ENET&qid=dc1f7f18000139fd&p1=1