HDFS进阶应用 配置NFS 网关
• NFS 网关用途
– 1.用户可以通过操作系统兼容的本地NFSv3客户端来阅览HDFS文件系统
– 2.用户可以从HDFS文件系统下载文档到本地文件系统
– 3.用户可以通过挂载点直接流化数据。支持文件附加,但是不支持随机写
– NFS 网关支持NFSv3和允许HDFS 作为客户端文件系统的一部分被挂载
• 特性与注意事项
– 不支持随机写
– 在非安全模式,运行网关的用户是代理用户
– 在安全模式时,Kerberos keytab中的用户是代理用户
– AIX NFS有一些知道的问题,不能让默认的HDFS NFS网关正常工作,如果想在 AIX 访问 NFS 网关需要配置下面的参数
<property>
<name>nfs.aix.compatibility.mode.enabled</name>
<value>true</value>
</property>
• 特性与注意事项
– HDFS超级用户是与NameNode进程本身具有相同标识的用户,超级用户可以执行任何操作,因为权限检查永远不会为超级用户失败。
<property>
<name>nfs.superuser</name>
<value>the_name_of_hdfs_superuser</value>
</property>
– 如果客户端安装允许访问时间更新,在某些Unix系统上,用户可以通过使用“noatime”安装来禁用访问时间更新
<property>
<name>dfs.namenode.accesstime.precision</name>
<value>0</value>
</property>
– nfs.dump.dir
– 用户需要更新文件转储目录参数。NFS客户端经常重新安排写操作,顺序的写操作会以随机到达NFS网关。这个目录常用于临时存储无序的写操作。对于每个文件,无序的写操作会在他们积累在内存中超过一定阈值(如。1 mb)被转储。需要确保有足够的空间的目录。例如,如果应用上传10个100M,那么这个转储目录推荐有1GB左右的空间,以便每个文件都发生最坏的情况。只有NFS网关需要在设置该属性后重启。
– nfs.exports.allowed.hosts
– 默认情况下,export可以被任何客户端挂载。为了更好的控制访问,可以设置属性。值字符串为机器名和访问策略,通过空格来分割。机器名的格式可以是单一的主机,Java的正则表达式或者IPv4地址。访问权限使用rw或ro来指定导出目录的读/写或机器只读访问。如果访问策略没被提供,默认为只读的。每个条目使用“;”来分割。
• 调试与日志排错
– 在配置 NFS 网关过程中经常会碰到各种各样的错误,如果出现了错误,打开调试日志是一个不错的选择
• log4j.property
– log4j.logger.org.apache.hadoop.hdfs.nfs=DEBUG
– log4j.logger.org.apache.hadoop.oncrpc=DEBUG
• core-site.xml
– hadoop.proxyuser.{nfsuser}.groups
– hadoop.proxyuser.{nfsuser}.hosts
– 这里的 nfsuser 是你机器上真实运行 nfsgw 的用户
– 在非安全模式,运行nfs网关的用户为代理用户
– groups 为挂载点用户所使用的组
– hosts 为挂载点主机地址
• hdfs-site.xml
– nfs.exports.allowed.hosts
– 设置允许访问 NFS 主机列与权限,默认 “ro”
<property>
<name>nfs.exports.allowed.hosts</name>
<value>* rw</value>
</property>
– dfs.namenode.accesstime.precision
– 关闭 access time
<property>
<name>dfs.namenode.accesstime.precision</name>
<value>3600000</value>
</property>
– nfs.dump.dir
– 设置转储目录
<property>
<name>nfs.dump.dir</name>
<value>/tmp/.hdfs-nfs</value>
</property>
– nfs.rtmax & nfs.wtmax
– 用户可以像访问本地文件系统的一部分一样访问HDFS,但硬链接和随机写还不支持。对于大文件I/O的优化,可以在mount的时候增加NFS传输的大小(rsize和wsize)。在默认情况下,NFS网关支持1MB作为最大的传输大小。更大的数据传输大小,需要在hdfs-site.xml中设置“nfs.rtmax” 和“nfs.wtmax”
– nfs.rtmax & nfs.wtmax
<property>
<name>nfs.rtmax</name>
<value>4194304</value>
</property>
<property>
<name>nfs.wtmax</name>
<value>1048576</value>
</property>
– nfs.port.monitoring.disabled
– 允许从没有权限的客户端挂载 nfs
<property>
<name>nfs.port.monitoring.disabled</name>
<value>false</value>
</property>
• nfs.map
– 系统管理员必须确保在NFS客户端的用户和在HDFS网关主机上的用户有相同的名称和UID。不同主机上创建的用户需要修改UID(例如使用“usermod -u 123myusername”),在NFS客户端或者NFS网关主机来进行。如果客户端的用户和NFS网关的用户 uid 不能保持一致需要我们配置 nfs.map 的静态映射关系
实验环境准备参考 http://blog.51cto.com/13558754/2066708
配置 NFS 网关
# cd /usr/local/hadoop/
# ./sbin/stop-all.sh
# jps
6598 Jps
# vim /etc/hosts
192.168.4.1 master
192.168.4.2 node1
192.168.4.3 node2
192.168.4.4 node3
192.168.4.5 nfsgw //添加新的主机
# for i in {1..5}
> do
> rsync -a /etc/hosts 192.168.4.${i}:/etc/hosts
> done
# scp /etc/yum.repos.d/yum.repo nfsgw:/etc/yum.repos.d/
yum.repo 100% 61 0.1KB/s 00:00
# ssh nfsgw
Last login: Wed Jan 31 08:20:55 2018 from master
# sed -ri "s/^(SELINUX=).*/\1disabled/" /etc/selinux/config ; yum -y remove firewalld
# reboot
// 添加用户
[root@nfsgw ~]# adduser -g 10 -u 1001 nfsuser
[root@nfsgw ~]# id nfsuser
uid=1001(nfsuser) gid=10(wheel) 组=10(wheel)
[root@master ~]# adduser -g 10 -u 1001 nfsuser
[root@master ~]# id nfsuser
[root@master ~]# cd /usr/local/hadoop/
[root@master hadoop]# cd etc/hadoop/
[root@master hadoop]# vim core-site.xml
<property>
<name>hadoop.proxyuser.nfsuser.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.nfsuser.hosts</name>
<value>*</value>
</property>
[root@master hadoop]# for i in node{1..3}
> do
> rsync -a /usr/local/hadoop/etc/hadoop/ ${i}:/usr/local/hadoop/etc/hadoop/ -e "ssh"
> done
[root@master ~]# ssh nfsgw
[root@nfsgw ~]# yum -y install java-1.8.0-openjdk-devel.x86_64
[root@nfsgw ~]# cd /usr/local/
[root@nfsgw ~]# rsync -azSH --delete master:/usr/local/hadoop ./ -e "ssh" //同步hadoop
[root@nfsgw ~]# yum -y remove rpcbind nfs-util
[root@master ~]# cd /usr/local/hadoop/
[root@master hadoop]# ./sbin/start-dfs.sh //启动集群
[root@master hadoop]# jps
6755 NameNode
7062 Jps
6953 SecondaryNameNode
[root@master hadoop]# ./bin/hdfs dfsadmin -report //检查节点
[root@master hadoop]# ssh nfsgw
Last login: Wed Jan 31 08:26:48 2018 from master
[root@nfsgw ~]# cd /usr/local/hadoop/
[root@nfsgw hadoop]# cd etc/hadoop/
[root@nfsgw hadoop]# vim hdfs-site.xml
...
<property>
<name>nfs.exports.allowed.hosts</name>
<value>* rw</value> //允许那些主机访问权限
</property>
<property>
<name>dfs.namenode.accesstime.precision</name>
<value>3600000</value> //accesstime 更新时间
</property>
<property>
<name>nfs.dump.dir</name>
<value>/var/nfstemp</value> //转储目录
</property>
<property>
<name>nfs.rtmax</name>
<value>4194304</value> // 读文件 传输大小
</property>
<property>
<name>nfs.wtmax</name>
<value>1048576</value> //写文件 传输大小
</property>
<property>
<name>nfs.port.monitoring.disabled</name>
<value>false</value> // 允许客户端挂载
</property>
...
[root@nfsgw ~]# mkdir /var/nfstemp
[root@nfsgw ~]# chown 1001.10 /var/nfstemp/
[root@nfsgw ~]# setfacl -m u:nfsuser:rwx /usr/local/hadoop/logs/
[root@nfsgw ~]# cd /usr/local/hadoop/
– 启动 portmap 服务
[root@nfsgw hadoop]# ./sbin/hadoop-daemon.sh --script ./bin/hdfs start portmap
starting portmap, logging to /usr/local/hadoop/logs/hadoop-root-portmap-nfsgw.out
[root@nfsgw hadoop]# su nfsuser
– 启动 nfs3
[nfsuser@nfsgw hadoop]$ ./sbin/hadoop-daemon.sh --script ./bin/hdfs start nfs3
starting nfs3, logging to /usr/local/hadoop/logs/hadoop-nfsuser-nfs3-nfsgw.out
[nfsuser@nfsgw hadoop]$ jps
2728 Jps
2671 Nfs3
[nfsuser@nfsgw hadoop]$ exit
exit
[root@nfsgw hadoop]# jps
2738 Jps
2588 Portmap
2671 -- process information unavailable
– 这里要特别注意:
– 启动 portmap 需要使用 root 用户
– 启动 nfs3 需要使用 core-site 里面设置的用户
挂载 nfs
– 目前NFS v3仅使用TCP作为传输协议。 不支持NLM,因此需要安装选项“nolock”。 强烈建议使用安装选项“sync”,因为它可以最小化或避免重新排序写入,这将导致更可预测的吞吐量。 未指定同步选项可能会导致上传大文件时出现不可靠的行为
– 如果必须使用软安装,用户应该给它一个相对较长的超时(至少不小于主机上的默认超时)
# mount -t nfs -o vers=3,proto=tcp,nolock,sync,noatime,noacl 192.168.4.5:/ /mnt/
# ls /mnt/
input output tmp