最近在做关于HBase的开发,由于HBase是基于HDFS的,所以对这方面进行了学习。
下面是总结的思维导图:
一、结构
hdfs的结构主要分三块:Client,NameNode (NN),DataNode (DN)
其中namenode内存中存储的是=fsimage+edits。
fsimage:元数据镜像文件(文件系统的目录树。)
edits:元数据的操作日志(针对文件系统做的修改操作记录)
SecondaryNameNode负责定时默认1小时,从namenode上,获取fsimage和edits来进行合并,然后再发送给namenode,缓解namenode工作量。是namenode的冷备份。
二、写数据
1.用户定义数据块大小(默认为128M),定义副本数(默认为3份)
2.Client对文件进行切分
3.Client对NN进行请求,NN为每个数据块分配DN
4.Client对第一个DN发送数据块,第一个DN再把数据块传给第二个数据块,以此类推。每个DN收到数据包后都给Client一个应答,这是为了写数据容错,没有应答时Client会调整路线。
(这地方有些不确定,有的博客说发给NN确认,有的博客说第一个节点发给client确认,全部给NN确认,各有各的说法)
三、读数据
1.Client先联系NN,给NN文件名,NN查找出该文件的数据块表(记录了没给数据块对应的DN)传给Client
2.Client通过该表下载。可以通过数据块表进行读操作容错,也就是在某DN无法下载时换个节点下载。
四、故障发现
1.节点失效:心跳
2.通信故障:确认码
3.数据错误:总校验和
五、故障处理
在NN中存储着数据块表和DN列表(每个DN储存的数据块),当发生某个DN上的一个数据块错误时,更新数据块表,也就是从数据块表中删除这个数据块,如果发现DN失效时同时更新两个表。
NN周期扫描数据块表,发现没有按要求复制的数据块,分配DN对其复制。
六、备份规则
如果写入方在集群的节点上那么副本1就和其同机架,如果不是则随机。保证其他副本与副本1不同机架。
可以参考http://blog.csdn.net/mtchy/article/details/51352292 这篇转载文章用漫画解读了HDFS机制。