本文固定链接:https://www.askmac.cn/archives/hdfs-nfs-gateway.html
原文地址:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsNfsGateway.html
1概述
NFS 网关支持NFSv3和允许HDFS 作为客户端文件系统的一部分被挂载。当前NFS 网关支持和以下列默认启用:
1.用户可以通过操作系统兼容的本地NFSv3客户端来阅览HDFS文件系统
2.用户可以从HDFS文件系统下载文档到本地文件系统
3.用户可以通过挂载点直接流化数据。支持文件附加,但是不支持随机写(www.askmac.cn)
NFS网关机器需要相同的HDFS客户端 例如Hadoop JAR 文件,HADOOP_CONF目录。NFS网关可以和任何主机在一起,例如:DataNode,NameNode.
2配置
NFS网关使用代理用户来代理所有用户访问NFS挂载。在非安全模式,运行网关的用户是代理用户,当在安全模式时,在Kerberos keytab中的用户是代理用户。假设代理用户(www.askmac.cn)是’nfsserver’,用户的属组是‘users-group1’和‘users-group2’ 使用NFS挂载,那么在NameNode上的core-site.xml中的下列2个属性需要设置,并且在配置变更后只需要重启NameNode(注意:替换nfsserver为你集群中的代理用户):
<property><name>hadoop.proxyuser.nfsserver.groups</name> <value>root,users-group1,users-group2</value> <description> The 'nfsserver' user is allowed to proxy all members of the 'users-group1' and 'users-group2' groups. Note that in most cases you will need to include the group "root" because the user "root" (which usually belonges to "root" group) will generally be the user that initially executes the mount on the NFS client system. Set this to '*' to allow nfsserver user to proxy any group. </description> </property> <property> <name>hadoop.proxyuser.nfsserver.hosts</name> <value>nfs-client-host1.com</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>
上面所需的配置是在非安全模式下,NFS网关的配置。对于Kerberized的hadoop 集群,以下的配置需要增加到hdfs-site.xml中(注意:替换nfsserver为包含在keytab中的代理用户名):(www.askmac.cn)
<property><name>nfs.keytab.file</name><value>/etc/hadoop/conf/nfsserver.keytab</value> <!-- path to the nfs gateway keytab --> </property> <property> <name>nfs.kerberos.principal</name> <value>nfsserver/[email protected]</value> </property>
剩下的配置对于安全或非安全模式都是可选的
1.AIX NFS有一些知道的问题,不能让默认的HDFS NFS网关正常工作。如果你想在AIX上访问HDFS NFS 网关,你需要设置下列配置来为这些问题启用工作区:(www.askmac.cn)
<property><name>nfs.aix.compatibility.mode.enabled</name><value>true</value> </property>
主要这个规律,非AIX客户端不应该启用AIX兼容模式。AIX兼容性关闭了安全性来确保通过NFS返回的一致性结果,所有发生懂NFS服务器的数据能保证是已经提交的。
2.SHDFS超级用户是那些作为NameNode进程的用户,超级用户可以做任何事情,并且权限校验不会失败。如果下了属性被配置,在NFS客户端上的超级用户可以访问HDFS上的任何文件。默认情况下,在网关上超级用户没有配置。注意,即使超级用户被配置,’ nfs.exports.allowed.hosts’仍然有效。例如,如果NFS客户端主机不允许写访问nfs.exports.allowed.hosts,那么超级用户不能通过网关写访问HDFS文件。
<property><name>nfs.superuser</name><value>the_name_of_hdfs_superuser</value> </property>
建议基于用户场景,一个新的配置进行更新。下列配置可以在hdfs-site.xml中更新或添加(www.askmac.cn)
1.如果客户端允许挂载访问时间更新,确保以下配置在配置文件中没有被禁用。在这些属性变更后,只用重启NameNode。在一些UNIX西永的,用户可以通过挂载export noatime来禁止访问时间更新。如果export 被”noatime”挂载,用户不用变更下列属性,也不用重启namenode.
<property><name>dfs.namenode.accesstime.precision</name><value>3600000</value> <description>The access time for HDFS file is precise upto this value. The default value is 1 hour. Setting a value of 0 disables access times for HDFS. </description> </property>
2.用户被期望更新文件转储目录。NFS客户端进程重排序写,特别是当export没有使用sync选项挂载时。连续写入可能以随机的顺序到达NFS网关。这个目录是用来临时保存在写入HDFS之前的乱序的写。对于每个文件,在内存中乱序写超过一定阈值(例如1MB)后被转储。要确保目录中足够的空间。例如如果应用程序上传10个文件,每个文件100MN,建议这个目录应该有1GB,防止最坏的情况下每个文件都是错误排序写。在这个属性更新后,只需要重启NFS网关。(www.askmac.cn)
<property><name>nfs.dump.dir</name><value>/tmp/.hdfs-nfs</value> </property>
3.默认清下,export可以被任何客户端挂载。为了更好的控制访问,用户可以更新下列属性。值字符串包含了机器名称和访问权限,用空格分隔。机器名称格式可以是单个的主机名,“*”或者一个java正则表达式,或者一个IPv4地址。访问权限使用rw或ro来指定机器export的可读写或只读。如果访问权限没指定,默认是只读。条目的分隔符是”;”。例如:“192.168.0.0/22 rw;\\w*\\.example\\.com;host.test.org ro;”在属性更新之后,只有NFS网关需要重启。注意,java正则表达式于一般LINUX NFS export 表的正则不同,例如,使用“\\w*\\.examp\\.com”代替“*.example.com”,”192\\.168\\.0\\.(11|22)”代替”192.168.0.[11|12]”。
<property><name>nfs.exports.allowed.hosts</name><value>* rw</value> </property>
4.SHDFS超级用户是那些作为NameNode进程的用户,超级用户可以做任何事情,并且权限校验不会失败。如果下了属性被配置,在NFS客户端上的超级用户可以访问HDFS上的任何文件。默认情况下,在网关上超级用户没有配置。注意,即使超级用户被配置,’ nfs.exports.allowed.hosts’仍然有效。例如,如果NFS客户端主机不允许写访问nfs.exports.allowed.hosts,那么超级用户不能通过网关写访问HDFS文件。(www.askmac.cn)
<property><name>nfs.superuser</name><value>the_name_of_hdfs_superuser</value> </property>
5.度量。和其他HDFS类似,网关暴露运行时的度量。其可以作为一个JSON文档在http://gateway-ip:50079/jmx上可用。NFS出来相关指标是被暴露在名称为” Nfs3Metrics” 下的。延迟直方图可以通过添加hdfs-site.xml文件中的以下属性启用。
<property><name>nfs.metrics.percentiles.intervals</name><value>100</value><description>Enable the latency histograms for read, write and commit requests. The time unit is 100 seconds in this example. </description> </property>
6.JVM和日志设置。你可以在HADOOP_NFS3_OPTS中exportJVM配置(例如,堆大小和GC log)。更多的NFS相关配置可以在hadoop-env.sh中发现。获得NFS debug跟踪文件,可以编辑 log4j.property文件来增加下列值。注意,debug跟踪,特别是ONCRPC,可以非常的详细。
改变日志等级:(www.askmac.cn)
log4j.logger.org.apache.hadoop.hdfs.nfs=DEBUG |
获得更多ONCRPC详细的需求:
log4j.logger.org.apache.hadoop.oncrpc=DEBUG |
3.启动和停止NFS网关服务
3个进程被需要来提供NFS服务:rpcbind(或者portmap),mountd 和nfsd。NFS网关进程是nfsd和mountd。其共享HDFS root ‘/’作为export。建议使用protmap包含NFS网关的包。即使NFS网关和大多数版本提供的protmap/rpcbinf一起工作,有一些被portmap包含的包在Liunx系统例如 RHEL 6.2和SLES 11 中所需求。更详细的讨论可以在HDFS-4763中发现。
1.停止 nfsv3 和平台提供的rpcbind/portmap 服务(由于linux 平台的不同,命令可能不一样):(www.askmac.cn)
[root]> service nfs stop[root]> service rpcbind stop
2.启动 hadoop的portmap(需要root权限):
[root]> $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs start portmap
3.启动mountd和nfsd
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs start nfs3
这个命令不需要root权限。在非安全模式中,NFS网关需要通过代理用户启动。在安全模式中,任何在nfs.keytab.file定义的可以访问Kerberos keytab的用户可以启动NFS网关。
4.关闭NFS网关服务(www.askmac.cn)
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs stop nfs3[root]> $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs stop portmap
通常情况下,你可以放弃使用hadoop提供的portmap后台进程,而用系统提供的portmap后台进程代替,如果你使用root启动NFS网关。使用root启动NFS网关进程是一般的情况,但是要确保没权限的用户设置了HADOOP_PRIVILEGED_NFS_USER环境变量。在这个用root用户启动NFS 网关将注册到系统的portmap,并且将权限传递到HADOOP_PRIVILEGED_NFS_USER中指定的用户。注意,如果你选择了这个方式,你可以跳过步骤1和2
4.验证 NFS相关服务的有效性
1.使用下列命令来验证所有的服务已经启动并正在运行:
[root]> rpcinfo -p $nfs_server_ip
你应该看到类似于下列的输出:(www.askmac.cn)
program vers proto port100005 1 tcp 4242 mountd100005 2 udp 4242 mountd100005 2 tcp 4242 mountd100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100005 3 udp 4242 mountd
100005 1 udp 4242 mountd
100003 3 tcp 2049 nfs
100005 3 tcp 4242 mountd |
2.验证HDFS命名空间是否被export和可以被挂载
[root]> showmount -e $nfs_server_ip
你应该看到和下列类似的输出:
Exports list on $nfs_server_ip :/ (everyone) |
5. 挂载export “/”
当前的NFS v3只使用TCP作为传输协议。NLM不被支持,所以mount选项”nolock”是必须的。Mount 选项“sync”也是强烈建议的,其可以减少或避免无序写。不指定sync选项在导出大文件时,可能引起不可用的行为。建议使用hard 挂载。这是因为,即使在客户端发生所有数据到NFS网关之后,其可能需要一些额外的时间来让NFS网关传输数据到HDFS,当通过NFS客户端内核的写是无序时。(www.askmac.cn)
用户可以福按照HDFS命名空间例如:
[root]>mount -t nfs -o vers=3,proto=tcp,nolock,noacl,sync $server:/ $mount_point |
这样用户可以作为本地文件系统的一部分访问HDFS,硬链接和随机写还不支持。对于大文件I/O的优化,可以在mount的时候增加NFS传输的大小(rsize和wsize)。在默认清下,NFS网关支持1MB作为最大的传输大小。更大的数据传输大小,需要在hdfs-site.xml中更新“nfs.rtmax” 和“nfs.rtmax”。
6.允许从无权限的客户端挂载
在客户机上的环境中root访问通常是不可用的。一些安全措辞可以确保只有来着NFS客户端的特权端口可以连接到NFS服务器。这个特性被称为“端口监控”。这个功能默认在HDFS NFS网关中没有启用,当时可以通过以下在NFS网关机器上的hdfs-sit.xml中的配置来启用:(www.askmac.cn)
<property><name>nfs.port.monitoring.disabled</name><value>false</value></property>
7.用户认证和映射关系
在这个版本中的NFS网关使用AUTH_UNIX风格的认证。当用户在HFS客户端访问挂载点时,NFS客户端传递UID到NFS网关。NFS网关进行循环查询UID的用户名,并且传递用户名到HDFS,伴随着HDFS请求。例如,如果NFS客户端当前用户是“admin”,当用户访问挂载目录时,NFS网关将作为用户“admin”访问HDFS。为了作为“hdfs”用户访问HDFS,那么在客户端系统上,当访问挂载目录时,需要将当前用户切换为“hdfs”。(www.askmac.cn)
系统管理员必须确保在NFS客户端的用户和在HDFS网关主机上的用户有相同的名称和UID。不同主机上创建的用户需要修改UID(例如使用“usermod -u 123 myusername”),在NFS客户端或者NFS网关主机来进行。(www.askmac.cn)
通常情况下,系统管理可以配置自定义的映射文件,在希望访问HDFS NFS网关时系统有不同的UIDs/GIDs。默认的文件是/etc/nfs.map,自定的位置可以在static.id.mapping.file属性中指定静态映射文件的路径。静态文件的格式,通常如下:
# Mapping for clients accessing the NFS gatewayuid 10 100 # Map the remote UID 10 the local UID 100gid 11 101 # Map the remote GID 11 to the local GID 101 |
Leave a Reply