Hadoop 分布式文件系统

引言
    最近在研究Hadoop的HDFS分布式文件系统,在网上找了一些资料,稍微整理了下,并对HDFS分布式存储进行了简单的存储测试,跟FTP服务器存储进行了对比,测试数据在文档后面。现在先来了解下什么是Hadoop吧!

什么是Hadoop?

    Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。这个项目的地址是http://hadoop.apache.org/core/。

Hadoop框架中最核心的设计就是:MapReduce和HDFS。

MapReduce

    MapReduce的思想是由Google发表的一篇论文GFS、MapReduce所提及而被广为流传的,简单的一句话解释MapReduce就是“任务的分解与结果的汇总”。MapReduce从它名字上来看就大致可以看出个缘由,两个动词Map和Reduce,“Map(展开)”就是将一个任务分解成为多个任务,“Reduce”就是将分解后多任务处理的结果汇总起来,得出最后的分析结果。这不是什么新思想,其实在多线程,多任务的设计就可以找到这种思想的影子。不论是现实社会,还是在程序设计中,一项工作往往可以被拆分成为多个任务,任务之间的关系可以分为两种:一种是不相关的任务,可以并行执行;另一种是任务之间有相互的依赖,先后顺序不能够颠倒,这类任务是无法并行处理的。在分布式系统中,机器集群就可以看作硬件资源池,将并行的任务拆分,然后交由每一个空闲机器资源去处理,能够极大地提高计算效率,同时这种资源无关性,对于计算集群的扩展无疑提供了最好的设计保证。(廉价的机器群可以匹敌任何高性能的计算机,纵向扩展的曲线始终敌不过横向扩展的斜线)。任务分解处理以后,那就需要将处理以后的结果再汇总起来,这就是Reduce要做的工作。
    一个Map/Reduce 作业(job) 通常会把输入的数据集切分为若干独立的数据块,由 map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序,然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。 整个框架负责任务的调度和监控,以及重新执行已经失败的任务。
Map/Reduce框架由一个单独的master JobTracker 和每个集群节点一个slave TaskTracker共同组成。master负责调度构成一个作业的所有任务,这些任务分布在不同的slave上,master监控它们的执行,重新执行已经失败的任务。而slave仅负责执行由master指派的任务。
mapreduce例子:http://www.hadoop.org.cn/code/mapred.html

HDFS分布式文件系统

    HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的缩写,为分布式计算存储提供了底层支持。HDFS的设计思想:构建一个非常庞大的分布式文件系统。在集群中节点失效是正常的,节点的数量在Hadoop中不是固定的.单一的文件命名空间,保证数据的一致性,写入一次多次读取.典型的64MB的数据块大小,每一个数据块在多个 DN(DataNode)有复制.客户端通过NN(NameNode)得到数据块的位置,直接访问DN获取数据。


从这张图中可以看出,一个文件其实被分成一个或多个数据块(Block),这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录,它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求,在 Namenode的统一调度下进行数据块的创建、删除和复制。

NameNode功能
    映射一个文件到一批的块,映射数据块到DN节点上。集群配置管理,数据块的管理和复制。处理事务日志:记录文件生成,删除等。因为NameNode的全部的元数据在内存中存储,所以NN的内存大小决定整个集群的存储量。
NN内存中保存的数据:
1. 文件列表
2. 每一个文件的块列表
3. 每一个DN中块的列表
4. 文件属性:生成时间,复制参数,文件许可(ACL)

Secondary Namenode的功能

    Secondary Namenode是一个让人混淆的名字,其实Secondary Namenode是一个辅助NN处理FsImage和事务日志的Server,它从NN拷贝FsImage和事务日志到临时目录,合并FsImage和事务日志生成一个新的FsImage,上传新的FsImage到NN上,NN更新FsImage并清理原来的事务日志。

DataNode功能
    在本地文件系统存储数据块,存储数据块的元数据,用于CRC校验。响应客户端对数据块和元数据的请求。周期性的向NN报告这个DN存储的所有数据块信息。客户端要存储数据时从NN获取存储数据块的DN位置列表,客户端发送数据块到第一个DN上,第一个DN收到数据通过管道流的方式把数据块发送到另外的DN 上。当数据块被所有的节点写入后,客户端继续发送下一个数据块。DN每3秒钟发送一个心跳到NN,如果NN没有收到心跳在重新尝试后宣告这个DN失效。当 NN察觉到DN节点失效了,选择一个新的节点复制丢失的数据块。
数据块的放置位置和数据正确性:
    在典型的配置里,数据块一个放在当前的节点,一个放在远程的机架上的一个节点,一个放在相同机架上的一个节点,多于3个的数据块随意选择放置。客户端选择最近的一个节点读取数据。Hadoop使用CRC32效验数据的正确性,客户端每512个byte计算一次效验,DN负责存储效验数据。客户端从DN获取数据和效验数据,如果效验出错,客户端尝试另外节点上复制的数据。

HDFS如何存储?

    流水线复制:当客户端向HDFS文件写入数据的时候,一开始是写到本地临时文件中。假设该文件的副本系数设置为3,当本地临时文件累积到一个数据块的大小时,客户端会从Namenode获取一个Datanode列表用于存放副本。然后客户端开始向第一个Datanode传输数据,第一个Datanode一小部分一小部分(4 KB)地接收数据,将每一部分写入本地仓库,并同时传输该部分到列表中第二个Datanode节点。第二个Datanode也是这样,一小部分一小部分地接收数据,写入本地仓库,并同时传给第三个Datanode。最后,第三个Datanode接收数据并存储在本地。因此,Datanode能流水线式地从前一个节点接收数据,并在同时转发给下一个节点,数据以流水线的方式从前一个Datanode复制到下一个。

HDFS 存储测试

测试环境:

服务器:Linux
masters:192.168.4.128
slaves:192.168.4.128、192.168.4.42



结论
以上这份测试报告是对HDFS分布式文件系统的存储测试,分别对HDFS和ftp服务器进行了测试比较,从上面的测试结果可以看出:
1. 对于写入操作HDFS明显比FTP服务器要慢。
2. 在一定机器数的集群范围内,是可以提高写入速度的。
3. HDFS适合在大量计算机组成的大规模集群上应用。




相关资料:
hadoop文档:http://hadoop.apache.org/common/docs/r0.18.2/cn/index.html
ibm文章:http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop1/
http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop2/index.html
http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop3/

其他:http://www.360doc.com/relevant/08/0311/14/14474_1110355.shtml
http://www.michael-noll.com/wiki/Running_Hadoop_On_Ubuntu_Linux_(Multi-Node_Cluster)

猜你喜欢

转载自lym6520.iteye.com/blog/580813