HDFS NFS数据挂载功能

**目的:**利用NFS,将HDFS底层文件共享到本地操作系统

本篇文章主要介绍HDFS 的NFS网关配置及配置之后读写性能问题,网上有比较多的参考资料,也都很有用。但我在配置过程中,遇到许多其他隐藏的坑,例如,首先我不知道NFS是什么,我就开始配,导致简单的配置出错我都弄了很久。为了让跟我一样的小伙伴们避免踩同样的坑,我从Linux NFS到HDFS NFS配置,再到配置好之后,数据读写性能问题进行了详细描述,希望对大家有用。

NFS(Network File System,网络文件系统)是当前主流异构平台共享文件系统之一,NFS可用于不同类型计算机、操作系统、网络架构和传输协议运行环境中的网络文件远程访问和共享。对于NFS的详细介绍,可参考曹世宏的:https://blog.csdn.net/qq_38265137/article/details/83146421

本人在实现过程中,使用Hadoop自带得NFS 网关。

简介
NFS Gateway支持NFSv3,允许将HDFS路径挂载到本地客户端文件系统,目前NFS Gateway支持如下使用模式:
用户可以通过本地文件系统(与NFSv3兼容)浏览Hadoop底层HDFS文件系统;
用户可以在其本地文件系统下载位于HDFS文件系统的文件;
用户可以直接将其本地文件系统中的文件上传到HDFS文件系统中;
用户可以通过挂载点将数据直接流到HDFS。支持文件追加,但不支持随机写入。(Users can stream data directly to HDFS through the mount point. File append is supported but random write is not supported.)
NFS gateway机器需要运行相应Hadoop JAR 文件及进行相应配置。NFS可以运行在DataNode节点、NameNode节点,及任何HDFS客户端。

配置
NFS-gateway使用代理用户代理所有访问NFS挂载点的用户。
在非安全模式,运行gateway的用户是代理用户,而安全模式下,代理用户是在Kerberos keytab下的用户。
假定代理用户是“nfsserver”,且所属组为“user-group1”和“user-group2”的用户使用NFS挂载,则Namenode下的配置文件core-site.xml需要增加如下内容,且当配置文件改变后只需要重启NameNode节点(NOTE:将字符串“nfsserver”替换为你的集群中的代理用户名)。
1. 添加配置
(1)在core-site.xml文件中添加如下内容

<!--*******set for HDFS NFS Gateway********-->
  <property>
    <name>hadoop.proxyuser.wusong.groups</name>
    <value>*</value>
    <description>The 'wusong' is changed by me ,is the user which allowd to proxy all members of the 'user-groups1' and
    'user-groups2' groups.
    The value '*' means to allow nfsserver user to proxy any group.
    </description>
  </property>
  <property>
    <name>hadoop.proxyuser.wusong.hosts</name>
    <value>*</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>

(2)在 hdfs-site.xml文件中添加如下内容

  <!--*******set for HDFS NFS Gateway********-->
   <property>
     <name>nfs.export.point</name>
     <value>/Data</value>
     <description>  此路径特别重要,用来设置被共享的HDFS目录路径,若想将HDFS底层文件系统都通过NFS挂载,可设置为/。本人只想将Data目录下的数据进行共享,所以设置为/Data。</description>
   </property>
   <property>
     <name>nfs.dump.dir</name>
     <value>/tmp/.hdfs-nfs</value>
   </property>

2. 配置好相应文件之后,需要关闭和启动相应服务。
1). root用户下,停止portmap(centos6以上则为rpcbind)和nfs。
/bin/systemctl stop rpcbind
/bin/systemctl stop nfs
并查看是否停止成功
/bin/systemctl status rpcbind
/bin/systemctl status nfs
错误1:
在执行停止rpcbind过程中,/bin/systemctl stop rpcbind,出现:
Warning: Stopping rpcbind.service, but it can still be activated by:
rpcbind.socket
因为 rpcbind.socket正在运行,运行如下语句停止该服务:/bin/systemctl stop rpcbind.socket

2). 启动hadoop的portmap与nfs3
(1) root用户下,执行:/homehadoop2.7.2/sbin/hadoop-daemon.sh --script /home/hadoop2.7.2/bin/hdfs start portmap
一直起不来,查看日志,是端口111占用。
lsof -i:111查看占用端口,用kill -9 PID 杀掉进程
(2)Hadoop用户下,执行: /home/hadoop2.7.2/sbin/hadoop-daemon.sh --script /home/hadoop2.7.2/bin/hdfs start nfs3
验证:用jps查看portmap与nfs3服务是否启动成功
3. 验证
[root@nn0 logs]# rpcinfo -p nn0
输出;

program vers proto   port  service
    100005    3   udp   4242  mountd
    100005    1   tcp   4242  mountd
    100000    2   udp    111  portmapper
    100000    2   tcp    111  portmapper
    100005    3   tcp   4242  mountd
    100005    2   tcp   4242  mountd
    100003    3   tcp   2049  nfs
    100005    2   udp   4242  mountd
    100005    1   udp   4242  mountd

[root@nn0 logs]# showmount -e nn0
输出:

  Export list for nn0:
   /Data *

4.数据挂载
mount -t nfs -o vers=3,proto=tcp,nolock,noacl,sync nn0:/ /hdfs/tmp
测试:首先往HDFS存放测试数据
创建目录:./hdfs dfs -mkdir /nfsTest
放入数据:./hdfs dfs -put /home/db_code_hbase/ed_originaldata/ed_original_data/2012.zip /nfsTest
查看是否导入成功: ./hadoop fs -ls /nfsTest

注意:之前出错,NFS客户端节点卡死,df -h都很慢,后来发现是NFS服务断开;解决方法是重启NFS服务;

原因:事实上,默认挂载方式为hard-mount,即当客户端加载NFS不成功时,一直重试,直到NFS服务器有响应。而若改成soft-mount,当客户端加载NFS不成功时,重试retrans设定的次数.如果retrans次都不成功,则放弃此操作,返回错误信息 “Connect time out”。NFS客户端挂载命令有多个选项,根据实际情况选择。
5. 结束nfs3服务
Hadoop用户下,执行:/home/hadoop2.7.2/sbin/hadoop-daemon.sh --script /home/hadoop2.7.2/bin/hdfs stop nfs3
注意,关闭的用户必须与开启的一致。
6. 关于出现的权限问题错误
在root用户的挂载路径,新增文件,显示permission denied。
后来发现是配置nfsserver为wusong,相当于wusong是所有组NFS的代理者,在此处,wusong权限比root 还大。
7. 测试性能:

  1. 将本地写入hdfs的底层目录:cp ~/2020.zip 2020.zip (2.1GB),耗时4分20秒;
    将hdfs的底层目录下2020.zip拷贝到本地:cp 2020.zip ~/2011.zip 39秒
    30MB:4秒27
    hdparm -Tt /dev/sda
    得到结果如下:
    /dev/sda:
    Timing cached reads: 18614 MB in 2.00 seconds = 9321.82 MB/sec
    Timing buffered disk reads: 900 MB in 3.00 seconds = 299.55 MB/sec
  2. (直接在本地文件系统上)利用dd测试磁盘的IO写速度,命令为: time dd if=/dev/sda of=test1.dbf bs=8k count=300000 oflag=direct
    结果为:
    [root@nn0 HdfsMountdata]# time dd if=/dev/sda of=test.dbf bs=8k count=300000 oflag=direct
    300000+0 records in
    300000+0 records out
    2457600000 bytes (2.5 GB) copied, 23.2341 s, 106 MB/s

real 0m23.236s
user 0m0.129s
sys 0m8.531s
(直接在本地文件系统上)利用dd测试磁盘的IO读速度,命令为: dd if=test1.dbf bs=8k count=300000 of=/dev/null
结果为:
[root@nn0 HdfsMountdata]# dd if=test.dbf bs=8k count=300000 of=/dev/null
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 11.644 s, 211 MB/s

(本地挂载路径/hdfs/tmp上)
[root@nn0 tmp]# time dd if=/dev/sda of=/hdfs/test.dbf bs=8k count=300000 oflag=direct
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 19.9944 s, 123 MB/s

real 0m20.015s
user 0m0.120s
sys 0m6.547s
(本地挂载路径/hdfs/tmp上)
[root@nn0 tmp]# dd if=/hdfs/test.dbf bs=8k count=300000 of=/dev/null
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 11.555 s, 213 MB/s‘’

错误:
error org.apache.hadoop.hdfs.nfs.nfs3.RpcProgramNfs3:Exception org.apache.hadoop.security.AccessControlException:Permission denied:user=root,accecc=WRITE,inode=“/2012.zip”:wusong:supergroup:drwxr-xr-x

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值