四大并行文件系统对比(HDFS,KFS,CEPH,PANASAS)

什么是Hadoop

Hadoop是apache下面的一个分布式并行计算框架,是从lunece中抽取出来的一个框架。Hadoop的核心设计思想是:MapReduce和HDFS,MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。概念”Map(映射)”和”Reduce(化简)”,和他们的主要思想,都是从函数式编程语言借来的,还有从矢量编程语言借来的特性;HDFS是Hadoop Distributed File System的缩写,即:Hadoop分布式文件系统,为分布式计算存储提供底层支持。注:MapReduce (google mapreduce 论文点击这里),GFS(Google File System)和bigtable是google的三大核心技术。

HadoopMapReduce介绍

Map(映射)和reduce(化简)是分开处理的,map是将一个任务分解为多个任务执行,reduce是将多个任务汇总起来得到想要的结果。把一个list拆解为多个放到线程池中启动多个线程计算list中值,然后把多个任务返回的结果合并为一个总的结果其实就是一个简单的MapReduce的应用。

在Hadoop官方文档(单击这里)介绍了HadoopMapReduce的三个步骤,map(主要是分解并行的任务),combine(主要是为了提高reduce的效率),reduce(把处理后的结果再汇总起来)

 

 

1、HDFS

即Hadoop Distributed File System (Hadoop分布式文件系统)
HDFS 具有高容错性,并且可以被部署在低价的硬件设备之上。HDFS很适合那些有大数据集的应用,并且提供了对数据读写的高吞吐率。HDFS是一个 master/slave的结构,就通常的部署来说,在master上只运行一个Namenode,而在每一个slave上运行一个Datanode。
HDFS 支持传统的层次文件组织结构,同现有的一些文件系统在操作上很类似,比如你可以创建和删除一个文件,把一个文件从一个目录移到另一个目录,重命名等等操作。Namenode管理着整个分布式文件系统,对文件系统的操作(如建立、删除文件和文件夹)都是通过Namenode来控制。
下面是HDFS的结构:

从上面的图中可以看 出,Namenode,Datanode,Client之间的通信都是建立在TCP/IP的基础之上的。当Client要执行一个写入的操作的时候,命令 不是马上就发送到Namenode,Client首先在本机上临时文件夹中缓存这些数据,当临时文件夹中的数据块达到了设定的Block的值(默认是 64M)时,Client便会通知Namenode,Namenode便响应Client的RPC请求,将文件名插入文件系统层次中并且在 Datanode中找到一块存放该数据的block,同时将该Datanode及对应的数据块信息告诉Client,Client便这些本地临时文件夹中 的数据块写入指定的数据节点。
HDFS采取了副本策略,其目的是为了提高系统的可靠性,可用性。HDFS的副本放置策略是三个副本, 一个放在本节点上,一个放在同一机架中的另一个节点上,还有一个副本放在另一个不同的机架中的一个节点上。当前版本的hadoop0.12.0中还没有实 现,但是正在进行中,相信不久就可以出来了。

KFSKOSMOS DISTRIBUTED FILE SYSTEM),一个类似GFSHadoopHDFS 的一个开源的分布式文件系统。

 

PS: google的三大基石 gfs,bigtable,map-reduce 相对应的开源产品 gfs:kfs(据传google创史人的同窗所创)hdfs(hadoop的子项目) bigtable:hbase(hadoop的子项目)Hypertable(从hbase项目组分离出去的,用c++实现) map-reduce:hadoopapache的项目,java实现,目前创史人在yahoo全力打造,已有2000个以上的节点并行计算的规模)

 

 

Google两个共同创始人的两个大学同窗(印度人)Anand RajaramanVenky Harinarayan,创立的一个新的搜索引擎Kosmix最近捐献了一个克隆GFS的文件系统KFS项目。HadoopHypertable这两个项目也开始支持KFS来做底层的存储。KFS是用C++写的,但是其client支持C++JavaPython。那么KFS到底有什么特性呢?

 

支持存储扩充(添加新的chunckserver,系统自动感知)

有效性(复制机制保证文件有效性)

负载平衡(系统周期地检查chunkservers的磁盘利用,并重新平衡chunkservers的磁盘利用,HDFS现在还没有支持)

数据完整性(当要读取数据时检查数据的完整性,如果检验出错使用另外的备份覆盖当前的数据)

支持FUSEHDFS也有工具支持FUSE

使用契约(保证Client缓存的数据和文件系统中的文件保持一致性)

HDFS未支持的高级特性:

 

支持同一文件多次写入和Append,不像HDFS支持一次写入多次读取和不支持Append(最近要增加Append,但是遇到许多问题)。

文件及时有效,当应用程序创建一个文件时,文件名在系统马上有效。不像HDFS文件只当输入流关闭时才在系统中有效,因此,如果应用程序在关闭前出现异常导致没有关闭输入流,数据将会丢失。

resin + nginx

download the upstream jvm route from http://code.google.com/p/nginx-upstream-jvm-route/

[root@web1 nginx-1.2.0]# tar -zxf nginx-upstream-jvm-route-0.1.tar.gz

[root@web1 nginx-1.2.0]# patch -p0 ./nginx_upstream_jvm_route/jvm_route.patch

[root@web1 nginx-1.2.0]# ./configure –sbin-path=/usr/sbin/ –conf-path=/etc/nginx/nginx.conf –with-http_stub_status_module –with-http_ssl_module –add-module=./nginx_upstream_jvm_route

 

edit /etc/nginx/nginx.conf

add

upstream resin_proxy {

server 127.0.0.1:85 srun_id=app-by1 max_fails=2 fail_timeout=10s weight=200; //负载均衡
server web3:85 srun_id=app-by2 max_fails=2 fail_timeout=10s weight=200;      //负载均衡
jvm_route $cookie_JSESSIONID|sessionid;
}

server {
listen 80;
server_name default yourhosts;
location / {
proxy_pass http://resin_proxy;
include proxy.conf;
index index.jsp index.html index.htm;
}
}

create proxy.conf

proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;