码迷,mamicode.com
首页 > 其他好文 > 详细

HDFS架构剖析

时间:2014-06-30 22:01:26      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   使用   strong   

HDFS架构核心内容:

  一、NameNode/DataNode

  二、数据存储副本

  三、元数据持久化

  四、数据模型

  五、故障容错

具体讲解:

一、NameNode/DataNode

  HDFS采用Master/Slave架构,其集群由一个NameNode和多个DataNodes组成。

  NameNode是中心服务器,负责管理文件系统的名字空间(namespace)以及客户端的访问。DataNode负责管理它所在节点上的存储。用户能够通过HDFS文件系统的名字空间以文件的形式在上面存储数据。

  对于内部存储,一个文件被切分为一个或多个块,存储在一组DataNode上。NameNode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体DataNode节点的映射。

 

二、数据存储副本

  HDFS文件的所有数据块都会有副本。每个文件的数据块大小和副本系数都是可配置的。HDFS中的文件都是一次性写入的,并且在任何时候只能有一个写入者

  NameNode全权管理数据块的复制,它周期性地从集群中的每个DataNode接收心跳信号和块状态报告(Block Report)。块状态报告包含了一个该DataNode上所有数据块的列表。

  2.1副本的存储策略

  副本的放置策略是区分文件系统的重要特性之一,也是HDFS性能和可靠性的关键,HDFS采用了机架感知(rack-aware)的策略来存储副本。

  在大多数情况下,副本系数是3,HDFS的存放策略是将一个副本存放在本地机架的节点上一个副本放在同一机架的另一个节点上最后一个副本放在不同机架的节点上。这种策略减少了机架间的数据传输,这就提高了写操作的效率。整个机架的错误远远比单个节点的错误少,所以这个策略不会影响到数据的可靠性和可用性。于此同时,因为数据块只放在两个不同的机架上,所以此策略减少了读取数据时需要的网络传输总带宽。在这种策略下,副本并不是均匀分布在不同的机架上。三分之一的副本在一个节点上三分之二的副本在一个机架上,如果大于3个副本,其他副本均匀分布在剩下的机架中,这一策略在不损害数据可靠性和读取性能的情况下改进了写的性能。

  2.2机架感知

  一个大型集群大多会被分为多个机架(Rack),一个机架包含多个节点,一般来说,机架内部机器的通信速度要高于机架之间的通信速度,而且往往机架之间的通信受到上层交换机等的带宽限制。

  HDFS中,对机架的感知并非是自适应的,即机架的配置是由配置文件决定,并且是人工指定的,这些rackid信息可以通过topology.script.file.name配置,通过IP到机架id的映射指定哪些节点属于哪个机架,在NameNode启动时将配置信息读取到内存中,保存在一个map中

  通过机架感知,NameNode就可以画出DataNode以及交换机等节点的网络拓扑图,通过拓扑图就可以计算出任意两个DataNode之间的距离,得到最优的存放策略,优化整个集群的网络带宽均衡以及数据最优分配

  2.3安全模式

  安全模式是指NameNode的一种特殊状态。处于安全模式的NameNode是不进行数据块的复制的。NameNode从所有的 DataNode接收心跳信号和块状态报告。当Namenode检测确认某个数据块的副本数目达到该数据块的最小副本数,那么该数据块会被认为是副本安全(safely replicated)的。Namenode退出安全模式状态后,它会确定哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他DataNode上。

 

三、元数据持久化

  HDFS通过dfs.name.dir这个参数设置HDFS的元数据信息存放在NameNode本地操作系统的目录,目录里通常包括以下文件:edits 、FsImage、 FsTime、VERSION

  1> Namenode用edits文件来保存对元数据进行的每次操作,比如创建文件,删除 文件,修改文件的副本系数。类似于mysql中的binlog机制。

  2> SecondNamenode其实只是一个简单的元数据备份进程,它会定期(缺省是1小时)把edits文件的内容合并到fsimage文件,同时保存最新的元数据副本在SecondNamenode进程所在机器的文件系统里。

  3> 整个文件系统的名字空间,包括数据块到文件的映射、文件的属性等,都存储在FsImage的文件中,FsImage结合edits才能准确表示内存中的元数据信息。当NameNode启动时,它从硬盘中读取Editlog和FsImage,将所有Editlog中的事务作用合并到内存中的FsImage上,并将这个新版本的FsImage从内存中保存到本地磁盘上,然后删除旧的Editlog,因为这个旧的Editlog的事务都已经作用在FsImage上了。这个过程称为一个检查点(checkpoint),在当前实现中,检查点只发生在NameNode启动时,在不久的将来将实现支持周期性的检查点,此时这个时候系统处于安全模式,NameNode等待DataNode上报各自的block 数据块信息。

  4> hadoop namenode -format命令用来初始化HDFS系统,事实就是初始化dfs.name.dir目录中的四个文件edits,FsImage,FsTime ,VERSION。

 

四、数据模型

 

  4.1数据分段

 

  创建文件时以及写数据时,客户端的请求其实并没有立即发送给NameNode,事实上,HDFS客户端会先将文件数据缓存到本地的一个临时文件。写操作被透明地重定向到这个临时文件,当临时文件的数据量超过一个数据块的大小,客户端才会联系NameNodeNameNode将文件名插入文件系统的层次结构中,并且分配一个数据块给它。然后返回DataNode的标识符和目标数据块给客户端。客户端再将数据从本地临时文件上传到指定的DataNode上。

  当文件关闭时,在临时文件中没有上传的数据也会传输到指定的DataNode上,客户端会告诉NameNode文件已经关闭。此时NameNode才将文件创建操作提交到日志里进行存储。如果NameNode在文件关闭前宕机了,则该文件将丢失。

  上述方法是对在HDFS上运行的目标应用进行认真考虑后得到的结果。这些应用需要进行文件的流式写入。如果不采用客户端缓存,由于网络速度和网络堵塞会对吞估量造成比较大的影响。

 

  4.2流水线复制

 

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

 

  4.3简单一致性模型

 

  HDFS主要应用于大规模的数据处理,一个数据集通常由数据源生成或复制,在此基础上进行各种分析。每个分析至少都会涉及数据集中的大部分数据 (甚至全部),因此读取整个数据集的时间比读取第一条记录的延迟更为重要。因此HDFS对文件操作需要的是一次写入,多次读取的。一个文件一旦创建、写入、关闭之后就不需要修改了。这个假定简化了数据一致的问题和高吞吐量的数据访问。文件的修改、写操作只能append,在文件的末尾增加不支持在文件的任意位置修改

 

五、故障容错

 

  5.1DataNode数据复制

 

  每个DataNode周期性地向NameNode发送心跳。网络割裂可能导致部分DataNodeNameNode失去联系。NameNode将近期不发送心跳信号DataNode标记为宕机不会再将新的IO请求发给它们NameNode通过复制操作将新的副本复制到有效的DataNode

 

  在下列情况下,可能需要重新复制:某个DataNode节点失效,某个副本遭到损坏,DataNode上的硬盘错误,或者文件的副本系数增大。

  5.2集群均衡

 

  HDFS的架构支持数据均衡策略。如果某个DataNode节点上的空闲空间低于特定的临界点,系统就会自动地将数据从该DataNode移动到其他DataNode。当对某个文件的请求突然增加,那么也可能启动一个计划创建该文件新的副本,并且同时重新平衡集群中的其他数据。这些均衡策略目前还没有实现。

 

  5.3数据完整性

 

  HDFS客户端实现了对HDFS文件内容的校验和(checksum)检查。当客户端创建一个新的HDFS文件,会计算这个文件每个数据块的校验和,并将校验和作为一个单独的隐藏文件保存在同一个HDFS名字空间下。当客户端获取文件内容后,它会校验文件的完整性,如果数据错误,客户端可以选择从其他DataNode获取该数据块的副本。

  5.4元数据错误

 

  FsImageEditlogHDFS核心数据结构,如果损坏了,整个HDFS都将失效。因而,NameNode可以配置成支持维护多个FsImageEditlog的副本。任何对FsImage或者Editlog的修改,都将同步到它们的副本上。这种多副本的同步操作可能会降低NameNode每秒处理的名字空间事务数量。然而这个代价是可以接受的,因为即使HDFS的应用是数据密集的,它们也非元数据密集的。当NameNode重启的时候,它会选取最近的完整的FsImageEditlog来使用

 

  NameNodeHDFS集群中的单点故障(single point of failure)所在。如果NameNode机器故障,是需要手工干预的。目前,自动重启或在另一台机器上做NameNode故障转移的功能还没实现。

  5.5快照

  快照支持某一特定时刻的数据的复制备份。利用快照,可以让HDFS在数据损坏时恢复到过去一个已知正确的时间点HDFS目前还不支持快照功能,但计划在将来的版本进行支持。

 

  本文章参考其他blog编写而成,如有雷同,纯属巧合。共同目标:分享学习成果,共同进步!

HDFS架构剖析,布布扣,bubuko.com

HDFS架构剖析

标签:des   style   blog   color   使用   strong   

原文地址:http://www.cnblogs.com/Ivcode/p/3816161.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!