hdfs一些机制的简介

一.HDFS的基本框架

hdfs一些机制的简介

如上图所示,分NameNode、SecondaryNameNode、DataNode这几个角色。

NameNode:存放的是数据的数据即元数据,其中元数据包括fsimage(元数据镜像文件)+edits(元数据的操作日志);

SecondaryNameNode:是NameNode的冷备份;合并fsimage和fsedits然后再发给namenode。

DataNode:负责存储client发来的数据块block;执行数据块的读写操作。

冷备份:SecondaryNameNode是namenode的冷备份,如果namenode坏掉。那么SecondaryNameNode不能代替SecondaryNameNode的工作,只能降低损失。

详细的工作原理就不多介绍了,在读写机制都有涉及。

二.主要介绍hdfs的写机制

hdfs一些机制的简介

有一个文件FileA,100M大小。Client将FileA写入到HDFS上。

HDFS按默认配置(block备份三个,每个block默认为64M)。

HDFS分布在三个机架上Rack1,Rack2,Rack3。

a. Client将FileA按64M分块。分成两块,block1和Block2;

b. Client向nameNode发送写数据请求,如图蓝色虚线①。

c. NameNode节点,记录block信息。并返回可用的DataNode,如粉色虚线②。

Block1: host2,host1,host3

Block2: host7,host8,host4

原理:

NameNode具有RackAware机架感知功能,这个可以配置,我们认为为默认。

若client为DataNode节点,那存储block时,规则为:副本1,同client的节点上;副本2,不同机架节点上;副本3,同第二个副本机架的另一个节点上;其他副本随机挑选。

若client不为DataNode节点,那存储block时,规则为:副本1,随机选择一个节点上;副本2,不同副本1,机架上;副本3,同副本2相同的另一个节点上;其他副本随机挑选。

d. client向DataNode发送block1;发送过程是以流式写入。

流式写入过程,

1>将64M的block1按64k的package划分;

2>然后将第一个package发送给host2;

3>host2接收完后,将第一个package发送给host1,同时client想host2发送第二个package;

4>host1接收完第一个package后,发送给host3,同时接收host2发来的第二个package。

5>以此类推,如图红线实线所示,直到将block1发送完毕。

6>host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。如图粉红颜色实线所示。

7>client收到host2发来的消息后,向namenode发送消息,说我写完了。这样就真完成了。如图黄色粗实线

8>发送完block1后,再向host7,host8,host4发送block2,如图蓝色实线所示。

9>发送完block2后,host7,host8,host4向NameNode,host7向Client发送通知,如图浅绿色实线所示。

10>client向NameNode发送消息,说我写完了,如图黄色粗实线。。。这样就完毕了。

分析,通过写过程,我们可以了解到:

①写1T文件,我们需要3T的存储,3T的存储空间。

②在执行读或写的过程中,都会对datanode进行检测,防止datanode挂掉或者什么的。

③挂掉一个节点,没关系,还有其他节点可以备份;甚至,挂掉某一个机架,也没关系;其他机架上,也有备份,容错机制在下面有介绍。

三.读机制

hdfs一些机制的简介

那么,读操作流程为:

a. client向namenode发送读请求。

b. namenode查看Metadata信息,返回fileA的block的位置。

block1:host2,host1,host3

block2:host7,host8,host4

c. block的位置是有先后顺序的,先读block1,再读block2。而且block1去host2上读取;然后block2,去host7上读取(原则优先读取本机架的datanode)。

四.hdfs的容错机制简介

a.如果结点不工作了怎么办?

解决方法:(datanode不工作)client给datanode传数据的时候每个datanode每三秒钟向namenode发送heartbeat,namenode根据heartbeat判断datanode的情况,如果十分钟接收不到datanode的heartbeat,namenode就认为此datanode无效;(namenode不工作)只有启动热备份进行工作。

b.读写容错

由于写是根据读写流的方式进行的,所以如果一个datanode出错就不能完成备份

解决方案:由于是根据流的方式(64k)写入的,所以三个datanode每接受一个64k都要向namenode发送一个信号(告诉64k接收完毕,datanode正常工作),如果那个有异常,那么namenode就绕过异常的datanode。

c.机架感应也能有效的容错,由于机架感应三个namenode不可能在同一个机架上,所以即使一个机架挂掉,其他机架上还有备份,大大提高了hdfs的容错。

五.搭hdfs的环境之后并不能马上就能用,首先要对namenode进行格式化,格式化都操作了写什么?

在NameNode节点上,有两个最重要的路径,分别被用来存储元数据信息和操作日志,而这两个路径来自于配置文件,它们对应的属性分别是dfs.name.dir和dfs.name.edits.dir,同时,它们默认的路径均是/tmp/hadoop/dfs/name。格式化时,NameNode会清空两个目录下的所有文件,之后,会在目录dfs.name.dir下创建文件:

  1. /current/fsimage

  2. /current/fstime

  3. /current/VERSION

  4. /image/fsimage

会在目录dfs.name.edits.dir下创建文件:

  1. /current/edits

  2. /current/fstime

  3. /current/VERSION

  4. /image/fsimage

那么这些文件又是用来干什么的呢?

fsimage:存储命名空间(实际上就是目录和文件)的元数据信息,文件结构如下:

edits:用来存储对命名空间操作的日志信息,实现NameNode节点的恢复;

fstime:用来存储元数据上一次check point 的时间;

VERSION:用来存储NameNode版本信息,命名空间ID(版本号)。


分享到:


相關文章: