通过NFSv3挂载HDFS到本地目录 -- 1安装配置NFS
1. 背景
HDFS 几乎成了 分布式计算的标配, 但是,大部分的程序,或者程序袁使用的还是POSIX或者类POSIX接口。
因此,如何适配就是个问题。
MapR 的产品,使用HDFS作为持久化的基础,但是app使用起来,还是很方便,其中一个原因是 透过NFS 使用HDFS,
上层应用看到的就是POSIX接口,只是URI可以看到是nfs的。
读写的速度也很快,我们在实际应用中,比对了其他产品,得出的基本结论是,应该使用了内存进行了缓冲。
基本的架构,就是这样的。
app <-(本地)-> NFS (client) <-(远程)-> NFS (server) <-(本地)-> HDFS
2. 试验的环境
2.1 OS版本
使用的是AWS的虚拟机。
Linux内核版本是4.1,镜像的标签是 AMI 系列。
基本特性 和 RedHat Enterprise 6 / CentOS 6 系列很像。
[root@ip-172-30-0-129 hadoop-2.7.1]# uname -a
Linux ip-172-30-0-129 4.1.10-17.31.amzn1.x86_64 #1 SMP Sat Oct 24 01:31:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@ip-172-30-0-129 hadoop-2.7.1]# cat /etc/issue
Amazon Linux AMI release 2015.09
Kernel \r on an \m
2.2 文件系统
文件系统是ext4格式。
如果您使用的是其他版本,请参考。
2.3 网络
我的这台虚拟机的ip地址是 172.30.0.243。
2.4 Hadoop/hdfs
安装的Hadoop的版本是 hadoop-2.7.1, 配置在目录 /home/hdfs 下。
2.5 安全性
一般 分布式文件系统, 是由机房内的一些app访问的,基本可控,大部分情况下使用的,都是"不安全"的。
3. 透过NFS挂载EXT文件系统
3.1 安装NFS
[root@ip-172-30-0-129 hadoop-2.7.1]# yum info nfs*
Loaded plugins: priorities, update-motd, upgrade-helper
Installed Packages
Name : nfs-utils
Arch : x86_64
Epoch : 1
Version : 1.3.0
Release : 0.21.amzn1
Size : 1.0 M
Repo : installed
Summary : NFS utilities and supporting clients and daemons for the kernel NFS server
URL : (....)
[root@ip-172-30-0-129 hadoop-2.7.1]# service nfs status
rpc.svcgssd is stopped
rpc.mountd is stopped
nfsd is stopped
rpc.rquotad is stopped
[root@ip-172-30-0-129 hadoop-2.7.1]#
如果没有,可以使用以下命令安装
[root@yarn ~]# yum install -y nfs-utils
一般会自动安装依赖项 rpcbind, 也可以手动安装: yum install -y rpcbind
3.2 在源服务器端启动 nfs 和 rpcbind 服务
重启后,
[root@yarn ~]# service rpcbind start
Starting rpcbind: [ OK ]
[root@yarn ~]# service nfs start
Initializing kernel nfsd: [ OK ]
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
[root@yarn ~]# service rpcbind status
rpcbind (pid 1940) is running...
[root@yarn ~]# service nfs status
rpc.svcgssd is stopped
rpc.mountd (pid 2344) is running...
nfsd (pid 2361 2360 2359 2358 2357 2356 2355 2354) is running...
rpc.rquotad (pid 2340) is running...
3.3 在源服务器编辑配置文件/etc/exports
如: /home/share 192.168.102.15(rw,sync) *(ro)
说明: 对192.168.102.15赋予读写权限,其他机器仅有只读权限。
/tmp 172.30.0.243(rw,no_root_squash)
含义:共享/tmp目录给IP地址为172.30.0.243
这句话有三部分:
/data 服务器共享的目录
10.0.0.6 允许这个ip访问该目录
rwxxxxxxx 读取权限
####################################################
[共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]
下面是一些NFS共享的常用参数:
ro 只读访问
rw 读写访问
sync 所有数据在请求时写入共享
async NFS在写入数据前可以相应请求
secure NFS通过1024以下的安全TCP/IP端口发送
insecure NFS通过1024以上的端口发送
wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide 在NFS共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squas root用户具有根目录的完全管理访问权限
anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID
####################################################
3.4 配置生效 或者 重启nfs服务
使用以下命令:
[root@yarn ~]# exportfs -rv
exporting 172.30.0.243:/tmp
或者:
[root@yarn ~]# service nfs restart
Shutting down NFS daemon: [ OK ]
Shutting down NFS mountd: [ OK ]
Shutting down NFS quotas: [ OK ]
Shutting down NFS services: [ OK ]
Shutting down RPC idmapd: [ OK ]
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
启动nfs后又修改了/etc/exportfs,可以不用重启该服务,使用exportfs命令即可:
exports [-aruv]
-a 全部mount或umount文件/etc/exports中的内容
-r 重新mount文件/etc/exports中的共享内容
-u umount目录
-v 在export的时候,将详细的信息输出到屏幕上
例:
[root@localhost ~]#/usr/sbin/exportfs –rv 全部重新export一次
[root@localhost ~]#/usr/sbin/exportfs –au 全部卸载
3.5 客户端临时挂载
使用如下命令:
[root@yarn ~]# mount -t nfs -o rw 172.30.0.243:/tmp /mnt
[root@yarn ~]# ls /tmp -lht
total 0
-rw-r--r-- 1 root root 0 Jan 21 10:58 file
[root@yarn ~]# ls /mnt -lht
total 0
-rw-r--r-- 1 root root 0 Jan 21 10:58 file
[root@yarn ~]#
可直接执行mount命令:mount servername(or IP): 共享目录 本地挂载目录
3.6 自动挂载
客户机启动就自动挂载服务器的共享目录,则需修改客户机上的/etc/fstab文件
添加如下的一行:
172.30.0.243:/tmp /nfs nfs rw,tcp,rsize=8192,wsize=8192,timeo=14,intr 0 0
使用如下命令重新加载:mount -a ;如果不报错,就是加载成功了。
使用mount命令,对应节点的详细输出(一行)如下:
172.30.0.243:/tmp on /nfs type nfs4 (rw,relatime,vers=4.0,rsize=8192,wsize=8192,namlen=255,hard,proto=tcp,port=0,timeo=14,retrans=2,sec=sys,clientaddr=172.30.0.243,local_lock=none,addr=172.30.0.243)
挂载点/nfs, 在客户端机器上必须存在.
fstab中每一行的,最后两个可选项是文件系统工具‘dumpe2fs’、‘fsck’用到的标志。
‘dumpe2fs’域可设成‘1’(启用)和‘0’(禁用)。由于备份 ext2/ext3 文件系统的程序要用到‘dump’,因此文件系统为 ext2/ext3 的条目要设成‘1’,所有其他条目都为‘0’。
‘fsck’ 域可设成‘0’(不检查文件系统)、‘1’(先检查)、‘2’(检查)。所有非 Linux 文件系统、可移动的和网络介质、虚拟文件系统都要设成‘0’;由于根分区要先被挂载(接着检查),‘/’条目要设成‘1’;而所有其他不可移动的及 Linux 文件系统的本地介质都要设成‘2’。
3.6.1 fstab行中的第4列是fs_options选项
配置变化较多,介绍如下:
fs_options: 指定加载该设备的文件系统是需要使用的特定参数选项,多个参数是由逗号分隔开来,这些选项列表包括了装载类型以及对于该文件系统合适的其它装载选项。
对于非NFS系统可用的装载选项可以参看mount命令的说明,对于nfs系统的选项可以查看关于nfs的文档。
对于所有文件系统都适用的选项有noauto,user,owner(允许设备所有人装载),_netdev(设备需要网络),后两个选项是linux系统所特有的。
对于大多数系统使用"defaults"就可以满足需要。
其他常见的选项包括:
选项 含义
ro 以只读模式加载该文件系统
sync 同步写,不对该设备的写操作进行缓冲处理,这可以防止在非正常关机时情况下破坏文件系统,但是却降低了计算机速度
quota 强制在该文件系统上进行磁盘定额限制
user 允许普通用户加载该文件系统
noauto 不再使用mount -a命令(例如系统启动时)加载该文件系统
hard:
NFS CLIENT会不断的尝试与SERVER的连接(在后台,不会给出任何提示信息,在LINUX下有的版本仍然会给出一些提示),直到MOUNT上。
soft:
会在前台尝试与SERVER的连接,是默认的连接方式。当收到错误信息后终止mount尝试,并给出相关信息。
例如:mount -F nfs -o hard 192.168.0.10:/nfs /nfs
rsize和wsize:
文件传输尺寸设定:wsize 来进行设定。这两个参数的设定对于NFS的执行效能有较大的影响
bg:
在执行mount时如果无法顺利mount上时,系统会将mount的操作转移到后台并继续尝试mount,直到mount成功为止。
通常在设定/etc/fstab文件时都应该使用bg,以避免可能的mount不上而影响启动速度。
fg:
和bg正好相反,是默认的参数
nfsvers=n:
设定要使用的NFS版本,默认是使用2,这个选项的设定还要取决于server端是否支持NFS VER3
mountport:
设定mount的端口
port:
根据server端export出的端口设定,例如如果server使用5555端口输出NFS,那客户端就需要使用这个参数进行同样的设定
timeo=n:
设置超时时间,当数据传输遇到问题时,会根据这个参数尝试进行重新传输。默认值是7/10妙(0.7秒)。
如果网络连接不是很稳定的话就要加大这个数值,并且推荐使用HARD MOUNT方式,同时最好也加上INTR参数,这样你就可以终止任何挂起的文件访问。
intr:
允许通知中断一个NFS调用。当服务器没有应答需要放弃的时候有用处。
nointr :
udp:
使用udp作为nfs的传输协议(NFS V2只支持UDP)
tcp:
使用tcp作为nfs的传输协议
namlen=n:
设定远程服务器所允许的最长文件名。这个值的默认是255
acregmin=n:
设定最小的在文件更新之前cache时间,默认是3
acregmax=n:
设定最大的在文件更新之前cache时间,默认是60
acdirmin=n:
设定最小的在目录更新之前cache时间,默认是30
acdirmax=n:
设定最大的在目录更新之前cache时间,默认是60
actimeo=n:
将acregmin、acregmax、acdirmin、acdirmax设定为同一个数值,默认是没有启用。
retry=n:
设定当网络传输出现故障的时候,尝试重新连接多少时间后不再尝试。默认的数值是10000 minutes
noac:
关闭cache机制。
同时使用多个参数的命令示例如下:mount -t nfs -o timeo=3,udp,hard 172.30.0.243:/tmp /nfs
请注意,NFS客户机和服务器的选项并不一定完全相同,而且有的时候会有冲突。比如说服务器以只读的方式导出,客户端却以可写的方式 mount,虽然可以成功mount上,但尝试写入的时候就会发生错误。
一般服务器和客户端配置冲突的时候,会以服务器的配置为准。
3.7 其他说明
a.服务端和客户端都需要开启portmap/rpcbind服务。RCP是nfs mount和umount时通信的方式。
b.假如客户端portmap/rpcbind没有启动,mount时,会非常慢,最终会失败。umount时,即使本地的portmap/rpcbind是关闭的,也能umount成功。
c.挂载完成后,服务端的portmap/rpcbind停止后,nfs仍然工作正常,但是umout财会提示: not found / mounted or server not reachable。重启服务器的portmap/rpcbind也无济于事。
d.假如服务端的portmap/rpcbind重启了,那么nfs也要跟着重启,否则nfs工作仍然是不正常的。
e.假如服务端nfs关闭(IP是通的),这时客户端会无法umount,这时使用umount -f /nfs一般能成功,当服务端死机时,umount -f /nfs 有可能会失败,这时可以使用 umount -l /nfs 。
最终建议:
f.使用NFS,就要使用portmap/rpcbind,NFS严重依赖于portmap/rpcbind,所以不要试图去停止它(portmap/rpcbind)。
g.当不能umount /nfs 分区时, umount -l是最终级的umount。