Hadoop 2.2中正式启用了hdfs nfs功能,使得hdfs的通用性迈进了一大步。在公司让小朋友搭建了一下,然后我自己进行了一点简单的试验,有一点收获,记录在此。

理论

使用hdfs nfs功能的话,数据访问路径如上图:用户或程序通过Linux自带的nfs client访问hdfs nfs服务,然后再由nfs网关作为hdfs的客户端访问hdfs。

这张图中,中间的节点就是nfs代理服务器(hdfs nfs proxy)或nfs网关(hdfs nfs gateway)。蓝色代表该模块是一个进程或服务,绿色代表该模块是一个库。图中还画了两条虚线,下、上线分别表示操作系统级别和分布式操作系统(hadpp)级别的内核态与用户态分界。

部署

在nfs网关上部署hdfs nfs服务所需要的程序包,按hadoop 2.2的部署方式,应该存在这两个文件:

share/hadoop/common/hadoop-nfs-2.2.0.jar

share/hadoop/hdfs/hadoop-hdfs-nfs-2.2.0.jar

配置文件不需要改,使用默认即可;默认的几个配置分别是nfs的服务端口(标准的2049)、mount的监听端口(4242),还有一个dump目录(/tmp/.hdfs-nfs)与写逻辑有关,暂不明原理。

部署完成后,启用服务,需要依次启动portmap和nfs两个服务;

$ hadoop-daemon.sh start portmap

$ hadoop-daemon.sh start nfs3

注意,portmap需要用root用户启动(因为portmap标准端口111,小于1024,是超级资源),而nfs服务应该用hdfs的超级用户启动。如果出现冲突,应该将操作系统本身的nfs服务停掉。

启动完成后,检查确认是否可用,其中nfs_server_ip是nfs网关的地址:

$ rpcinfo -p $nfs_server_ip

program vers proto   port
tcp mountd
udp portmapper
tcp mountd
udp mountd
tcp nfs
tcp portmapper
udp mountd
udp mountd
tcp mountd
$ showmount -e $nfs_server_ip

Export list for SY-:
/ *

挂载NFS服务

创建挂载的目录

$ mkdir /mnt/hdfs

安装mount.nfs

$ sudo apt-get install nfs-common

开始挂载

$ mount.nfs $nfs_server_ip:/ /mnt/hdfs

试用及分析

尝试访问/mnt/hdfs,试用了简单的ls、cp、rm等操作,也进行了md5sum,都可以正常使用,而且响应速度明显快于通过FsShell进行操作,这应该是得益于nfs的wcc缓存及hdfs nfs的实现中对连接的缓存;

但hdfs nfs是否是一个完全兼容标准文件系统接口的实现呢,为此我测试了一下最难处理的随机写和复写,代码如下,简单的说,就是做三次写,第一次写在文件头(字符1),第二次写在文件尾(字符2),第三次写在文件中间(字符3):

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> void usage(char* argv[]) {
fprintf(stdout, "%s <file_length>\n", argv[]);
fprintf(stdout, "NOTE:\n");
fprintf(stdout, " file_length >= 3\n");
} bool open_and_check(FILE** fpp, int op_seq) {
(*fpp) = fopen("testfile", "r+"); if ((*fpp) == NULL) {
fprintf(stderr, "%d.Can not open test file.\n", op_seq);
return false;
} return true;
} int main(int args, char* argv[]) {
if (args != ) {
usage(argv);
return -;
} int length = atoi(argv[]);
if (length < ) {
fprintf(stdout, "file_length must be at least 3\n");
return -;
} fclose(fopen("testfile", "w+")); FILE* fp;
int op_seq = ; if (!open_and_check(&fp, op_seq))
return op_seq;
putc(''+op_seq, fp); // '1'
fclose(fp);
op_seq++; if (!open_and_check(&fp, op_seq))
return op_seq;
fseek(fp, length, SEEK_SET);
putc(''+op_seq, fp); // '2'
fclose(fp);
op_seq++; if (!open_and_check(&fp, op_seq))
return op_seq;
fseek(fp, length/, SEEK_SET);
putc(''+op_seq, fp); // '3'
fclose(fp);
//op_seq++; return ;
}

test_rrw.c

注:参数n是第二次写之前做的偏移量,因而实际文件长度会是n+1

1. 首先用一个小文件做测试,如下:

root@xxx:/mnt/hdfs/tmp# ./a.out
root@xxx:/mnt/hdfs/tmp# ls -l testfile
-rw-r--r-- root root Nov : testfile
root@xxx:/mnt/hdfs/tmp# cat testfile

结果都符合预期;

2. 如果再重复执行一次呢?

root@xxx:/mnt/hdfs/tmp# ./a.out
Segmentation fault (core dumped)

从hdfs nfs网关的日志中可以找到出错的原因:

2013-11-27 18:11:53,695 ERROR org.apache.hadoop.hdfs.nfs.nfs3.RpcProgramNfs3: Setting file size is not supported when setattr, fileId: 20779

不支持重置文件大小,也就是不支持truncate,至少还“正确地”返回了失败;

3. 改变文件大小测试一下

root@SY-:/mnt/hdfs/tmp# ./a.out  && ls -lh --full-time testfile && sleep  && ls -lh --full-time testfile
-rw-r--r-- root root 2.1K -- ::40.572000000 + testfile
-rw-r--r-- root root -- ::40.572000000 + testfile
root@SY-:/mnt/hdfs/tmp# rm testfile
root@SY-:/mnt/hdfs/tmp# ./a.out && ls -lh --full-time testfile && sleep && ls -lh --full-time testfile
-rw-r--r-- root root 4.0K -- ::17.606000000 + testfile
-rw-r--r-- root root 4.0K -- ::17.606000000 + testfile

可以发现从4K开始,向上的文件已经无法正常完成这个测试了,文件会隐性的丢失数据。这应该与hdfs nfs对随机写和复写的实现有关,我没有具体研究代码。

从这个简单测试可以得出结论,hdfs nfs可以进行简单的文件读写、使用常用的shell命令操作,但决不可以直接当本地文件系统、通过程序进行访问。

[测试] 试用Hadoop 2.2中的HDFS NFS的更多相关文章

  1. Hadoop在eclipse中的配置

    在安装完linux下的hadoop框架,实现完所现有的wordCount程序,能够完美输出结果之后,我们开始来搭建在window下的eclipse的环境,进行相关程序的编写. 在网上有很多未编译版本, ...

  2. Hadoop第4周练习—HDFS读写文件操作

    1    运行环境说明... 3 :编译并运行<权威指南>中的例3.2. 3 内容... 3 2.3.1   创建代码目录... 4 2.3.2   建立例子文件上传到hdfs中... 4 ...

  3. Hadoop学习笔记一(HDFS架构)

    介绍 Hadoop分布式文件系统(HDFS)设计的运行环境是商用的硬件系统.他和现存的其他分布式文件系统存在很多相似点.不过HDFS和其他分布式文件系统的区别才是他的最大亮点,HDFS具有高容错的特性 ...

  4. Apache Hadoop 2.9.2 的HDFS High Available模式部署

    Apache Hadoop 2.9.2 的HDFS High Available 模式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们知道,当NameNode进程挂掉后,可 ...

  5. Hadoop生态集群之HDFS

    一.HDFS是什么 HDFS是hadoop集群中的一个分布式的我文件存储系统.他将多台集群组建成一个集群,进行海量数据的存储.为超大数据集的应用处理带来了很多便利. 和其他的分布式文件存储系统相比他有 ...

  6. 第九章 搭建Hadoop 2.2.0版本HDFS的HA配置

    Hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作.在hadoop1时代,只有一个NameNode.如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了.这是 ...

  7. Hadoop学习---Ubuntu中hadoop完全分布式安装教程

    软件版本 Hadoop版本号:hadoop-2.6.0-cdh5.7.0: VMWare版本号:VMware 9或10 Linux系统:CentOS 6.4-6.5 或Ubuntu版本号:ubuntu ...

  8. hadoop学习第二天-了解HDFS的基本概念&&分布式集群的搭建&&HDFS基本命令的使用

    一.HDFS的相关基本概念 1.数据块 1.在HDFS中,文件诶切分成固定大小的数据块,默认大小为64MB(hadoop2.x以后是128M),也可以自己配置. 2.为何数据块如此大,因为数据传输时间 ...

  9. HBase 中读 HDFS 调优

    HDFS Read调优 在基于 HDFS 存储的 HBase 中,主要有两种调优方式: 绕过RPC的选项,称为short circuit reads 开启让HDFS推测性地从多个datanode读数据 ...

随机推荐

  1. 2014 Asia AnShan Regional Contest --- HDU 5073 Galaxy

    Galaxy Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=5073 Mean: 在一条数轴上,有n颗卫星,现在你可以改变k颗 ...

  2. 重构第25天 引入契约设计(Introduce Design By Contract checks)

    理解:本文中的”引入契约式设计”是指我们应该对应该对输入和输出进行验证,以确保系统不会出现我们所想象不到的异常和得不到我们想要的结果. 详解:契约式设计规定方法应该对输入和输出进行验证,这样你便可以保 ...

  3. ASP.NET 使用AJAX让GridView的数据行显示提示框(ToolTip)

    介绍ASP.NET AJAX可以使你的web应用程序具有更丰富的功能和更多的用户响应. 本文中,我将演示如何通过ASP.NET AJAX的帮助,给像GridView这样的数据绑定控件的数据行增加pop ...

  4. asp.net学习之Repeater控件

    asp.net学习之Repeater控件 文章摘自:http://www.cnblogs.com/shipfi/archive/2009/10/19/1585703.html Repeater控件和D ...

  5. 以对象的方式来访问xml数据表(二)

    为什么要以对象的方式来访问xml数据表? 还记得,自己是在一次完成师兄布置的任务时接触到了xml,那时候需要用xml来作为数据文件,保存一个简单的图书管理系统的数据.于是就知道了,可以用xml文件来保 ...

  6. Studio for ASP.NET Wijmo:使用 C1Pager 对 DataList 控件分页

    Studio for ASP.NET Wijmo 控件值得称赞的一点是它不仅仅单独为 C1 控件而开发.还可以配合其他控件使用,也正体现了C1控件为提高开发人员工作效率而设计的宗旨.简单的举一个例子, ...

  7. 泛函编程(6)-数据结构-List基础

    List是一种最普通的泛函数据结构,比较直观,有良好的示范基础.List就像一个管子,里面可以装载一长条任何类型的东西.如需要对管子里的东西进行处理,则必须在管子内按直线顺序一个一个的来,这符合泛函编 ...

  8. Windows程序==>>使用ListView控件展示数据

    使用ListView控件展示数据 01.ImageList控件 1.了解了解         属性 说明 Images 储存在图像列表中的所有图像 ImageSize 图像列表中图像的大小 Trans ...

  9. SFTP和FTS协议的区别

    都是为FTP连接加密,协议非常相似.一个是借助SSL协议加密,一个时借助SSH协议加密.SSL是为HTTP/SMTP等加密设计的:SSH是为TELNET/FTP等加密.建立传输通道而设计的.其实SSH ...

  10. 1秒30000QPS,前后端设计思路

    Q:现在有这样一个需求,在一秒中有3万的支付订单请求,有什么比较好的解决方案吗? PS:我们数据库用的是oracle 程序是java spring mybatis dubbo mq等技术,现在有这样一 ...