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 的静态映射关系





实验环境准备参考 https://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