一.HDFS的基本框架
如上图所示,分NameNode、SecondaryNameNode、DataNode这几个角色。
NameNode:存放的是数据的数据即元数据,其中元数据包括fsimage(元数据镜像文件)+edits(元数据的操作日志);
SecondaryNameNode:是NameNode的冷备份;合并fsimage和fsedits然后再发给namenode。
DataNode:负责存储client发来的数据块block;执行数据块的读写操作。
冷备份:SecondaryNameNode是namenode的冷备份,如果namenode坏掉。那么SecondaryNameNode不能代替SecondaryNameNode的工作,只能降低损失。
详细的工作原理就不多介绍了,在读写机制都有涉及。
二.主要介绍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挂掉或者什么的。
③挂掉一个节点,没关系,还有其他节点可以备份;甚至,挂掉某一个机架,也没关系;其他机架上,也有备份,容错机制在下面有介绍。
三.读机制
那么,读操作流程为:
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下创建文件:
/current/fsimage
/current/fstime
/current/VERSION
/image/fsimage
会在目录dfs.name.edits.dir下创建文件:
/current/edits
/current/fstime
/current/VERSION
/image/fsimage
那么这些文件又是用来干什么的呢?
fsimage:存储命名空间(实际上就是目录和文件)的元数据信息,文件结构如下:
edits:用来存储对命名空间操作的日志信息,实现NameNode节点的恢复;
fstime:用来存储元数据上一次check point 的时间;
VERSION:用来存储NameNode版本信息,命名空间ID(版本号)。
閱讀更多 有理想的代碼dog 的文章