Hadoop HDFS原理分析

HDFS存储理念(kiding): 以最少的钱买最烂的机器并实现最安全、难度高的分布式文件系统(高容错性低成本),从上能够看出,HDFS认为机器故障是种常态,因此在设计时充分考虑到单个机器故障,单个磁盘故障,单个文件丢失等状况。
 node

1、HDFS简介

1.  HDFS有如下几个主要特色:

     处理超大文件:存储的一个超大文件能够达到数GB级、数TB级、数PB级。安全

     集群规模动态扩展:节点动态加入到集群,能够数百数千个服务器

     流式数据读写:HDFS的设计思想“一次写入,屡次读取”,一个数据集一旦由数据源生成,就会被复制分发到不一样的存储节点中,而后响应各类各样的数据分析任务请求。网络

      运行于廉价的商用机器集群上:HDFS设计时充分考虑了可靠性、安全性及高可用性,所以Hadoop对硬件要求比较低,能够运行于廉价的商用机器集群,无需昂贵的高可用性机器分布式

2.HDFS的局限性:

    不适合低延迟数据访问: HDFS是为了处理大型数据集,主要是为了达到高的数据吞吐量而设计,这就可能以高延迟做为代价。10毫秒如下的访问能够无视hdfs,不过hbase能够弥补这个缺oop

    没法高效存储大量小文件: namenode节点在内存中存储住整个文件系统的元数据,所以文件的数量就会受到限制,每一个文件的元数据大约150字节fetch

    不支持多用户写入及任意修改文件  :不支持多用户对同一文件进行操做,并且写操做只能在文件末尾完成,即追加操做。spa

3.简介

Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。HDFS体系结构中有两类节点,一类是NameNode,又叫"元数据节点";另外一类是DataNode,又叫"数据节点"。总的设计思想:分而治之——将大文件、大批量文件,分布式存放在大量独立的服务器上,以便于采起分而治之的方式对海量数据进行运算分析。.net

HDFS是一个主/从(Mater/Slave)体系结构,从最终用户的角度来看,它就像传统的文件系统同样,能够经过目录路径对文件执行CRUD操做。但因为分布式存储的性质,HDFS集群拥有一个NameNode和一些DataNode。NameNode管理文件系统的元数据,DataNode存储实际的数据。客户端经过同NameNode和DataNodes的交互访问文件系统。客户端联系NameNode以获取文件的元数据,而真正的文件I/O操做是直接和DataNode进行交互的。
HDFS通常是用来“一次写入,屡次读取”,不适合作实时交互性很强的事情,不适合存储大量小文件(固然,若是你偏要存大量小文件的话本文末尾会有解决方案).设计

2、HDFS工做原理

1基本原理

(1)分布式文件系统,它所管理的文件是被切块存储在若干台datanode服务器上.
(2)hdfs提供了一个统一的目录树来定位hdfs中的文件,客户端访问文件时只要指定目录树的路径便可,不用关心文件的具体物理位置.
(3)每个文件的每个切块,在hdfs集群中均可以保存多个备份(默认3份),在hdfs-site.xml中,dfs.replication的value的数量就是备份的数量.
(4)hdfs中有一个关键进程服务进程:namenode,它维护了一个hdfs的目录树及hdfs目录结构与文件真实存储位置的映射关系(元数据).而datanode服务进程专门负责接收和管理"文件块"-block.默认大小为128M(可配置),(dfs.blocksize).(老版本的hadoop的默认block是64M的)

2.副本放置策略

       数据块的第一个副本优先放在写入数据块的客户端所在的节点上,可是若是这个客户端上的数据节点空间不足或者是当前负载太重,则应该从该数据节点所在的机架中选择一个合适的数据节点做为本地节点。
若是客户端上没有一个数据节点的话,则从整个集群中随机选择一个合适的数据节点做为此时这个数据块的本地节点。
HDFS的存放策略是将一个副本存放在本地机架节点上,另外两个副本放在不一样机架的不一样节点上。
这样集群可在彻底失去某一机架的状况下还能存活。同时,这种策略减小了机架间的数据传输,提升了写操做的效率,由于数据块只存放在两个不一样的机架上,减小了读取数据时须要的网络传输总带宽。这样在必定程度上兼顾了数据安全和网络传输的开销。

3.datanode down掉,容错机制

(1)若是传输过程当中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持replicas设定的数量。
(2)关闭pipeline,将ack queue中的数据块放入data queue的开始。
(3)当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后可以察觉其数据块是过期的,会被删除。
(4)失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。
(5)元数据节点则被通知此数据块是复制块数不足,未来会再建立第三份备份。
(6)客户端调用create()来建立文件
(7)DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中建立一个新的文件。
(8)元数据节点首先肯定文件原来不存在,而且客户端有建立文件的权限,而后建立新文件。
(9)DistributedFileSystem返回DFSOutputStream,客户端用于写数据。
(10)客户端开始写入数据,DFSOutputStream将数据分红块,写入data queue。
(11)Data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。
(12)Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。
(13)DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。

4.SecondaryNameNode工做原理

namenode:首先来讲对于每一个文件操做,Hadoop并不会都写到fsimage,这样是很慢的,可是每次操做在提交后运行前先写入edits编辑日志,当edits编辑日志文件大小超过64M(参数能够设定),或者时间超过1小时(参数能够设定),secondarynamenode就会作checkpoint的工做,这时namenode产生临时空文件edits.new,secondarynamenode就会读取namenode中的edits和fsimage,而后进行合并,合并成fsimage.ckpt检查点,而后经过HTTP方式将fsimage.ckpt发送到NameNode,而后NameNode把fsimage.ckpt重命名为fsimage(覆盖原有fsimage文件),同时edits.new重命名为edits(覆盖原有edits文件)。注意这里edits.new是个临时文件,只有NameNode或者SecondaryNameNode正在作checkpoint的时候存在。

namenode启动读取fsimage原理: 当从新启动namenode的时候,NameNode启动时根据checkpoint时间加载最新的fsimage和edits文件到内存里,而后建立文件edits.new临时空文件,而后合并生成fsimage.ckpt检查点,edits.new重命名为edits(覆盖原有edits文件),fsimage.ckpt重命名为fsimage(覆盖原有fsimage文件),而后更新fstime时间 和VERSION版本

 

3、常见问题分析

1.HDFS可不能够用来作网盘

答案:不能够,

网盘只存储,不用作分析,hdfs在增长节点,同时也加大了分析能力,主要是大容量存储之上的数据分析
一、容量成本过高,二、文件大小不肯定,若是存大量小文件会形成很大的浪费 三、相对于网盘来讲,文件读写的效率低  四、只适合一次写入,屡次读取的操做
五、hdfs不支持文件内容修改,可支持往文件尾部追加内容。

 

2 HDFS大量小文件存储

一、对于待上传的文件,先将小文件合并为一个大文件再上传,利用SequenceFile、MapFile、Har等方式归档小文件,这个方法的原理就是把小文件归档起来管理,HBase就是基于此的。对于这种方法,若是想找回原来的小文件内容,那就必须得知道与归档文件的映射关系。

二、若是对于已经上传了的文件,须要进行合并的话,咱们可使用Map-redure来进行归档。

三、BlueSky解决方案,以一种two-level prefetching机制以提升小文件读取效率,即索引文件预取和数据文件预取。索引文件预取是指当用户访问某个文件时,该文件所在的block对应的索引文件被加载到内存中,这样,用户访问这些文件时没必要再与namenode交互了。数据文件预取是指用户访问某个文件时,将该文件所在课件中的全部文件加载到内存中,这样,若是用户继续访问其余文件,速度会明显提升。

参考:

漫画解读HDFS存储原理: http://www.36dsj.com/archives/41391

hadoop原理和机制:  http://blog.csdn.net/qa962839575/article/details/42748541

相关文章
相关标签/搜索