HDFS存储机制

1.hdfs是如何存储数据的呢?

众所周知,hdfs分为namenode & datanode,NN 复制集群的元数据管理,DN的管理等

hdfs存储的基本单元是block

 

2.hdfs写文件流程

1.由client 发起写请求给NN, 返回DN(经过排序)及副本数;

2.写入数据块到最近的DN;

3. 第一个DN会同步数据到其它的DN 进行数据的冗余备份;

4. 循环3 直到写完所有的数据块;

5. DN 复制完成后,会告知NN,此时更新NN的数据块表,及DN表,持久化元信息;

整个过程如下图的小图1所示:

HDFS存储机制

笔者画的process on 地址:

https://www.processon.com/view/link/5f3de2e0f346fb06decec33f

3.hdfs 读文件流程

HDfs一次写入多次读取,能支持高访问量。

读文件的过程

1.通过文件名请求NN获取文件的数据块信息;

2.NN返回数据块的信息,a列是数据块,b列是DN的位置信息;

3.遍历NN返回的数据块列表,从距离最近的DN开始读取数据;

如上图中的小图2所示

4.hdfs 容错机制

1.DN以固定周期发送心跳给NN;

2.如果超过一定时间NN未收到DN的心跳,认为该DN 已经宕机了,会从维护的数据块列表及DN列表中删掉;

3.client往DN写数据的时候会check 是否收到DN的确认码,如果确认码丢失,意味通信故障;

4.client 写入数据还是携带总和校验码,DN也会存储总和校验码,来判断该数据块是否完整;

5.DN 发送数据块存储清单给NN,判断哪些数据块丢失;

5.secondarynameNode如何辅助管理FSImage与Edits文件

HDFS存储机制

①:secnonaryNN通知NameNode切换editlog
②:secondaryNN从NameNode中获得FSImage和editlog(通过http方式)
③:secondaryNN将FSImage载入内存,然后开始合并editlog,合并之后成为新的fsimage
④:secondaryNN将新的fsimage发回给NameNode
⑤:NameNode用新的fsimage替换旧的fsimage

完成合并的是secondarynamenode,会请求namenode停止使用edits,暂时将新写操作放入一个新的文件中(edits.new)。
secondarynamenode从namenode中通过http get获得edits,因为要和fsimage合并,所以也是通过http get 的方式把fsimage加载到内存,然后逐一执行具体对文件系统的操作,与fsimage合并,生成新的fsimage,然后把fsimage发送给namenode,通过http post的方式。

namenode从secondarynamenode获得了fsimage后会把原有的fsimage替换为新的fsimage,把edits.new变成edits。同时会更新fstime。
hadoop进入安全模式时需要管理员使用dfsadmin的save namespace来创建新的检查点。
secondarynamenode在合并edits和fsimage时需要消耗的内存和namenode差不多,所以一般把namenode和secondarynamenode放在不同的机器上。

参考:

https://cloud.tencent.com/developer/article/1481758

https://blog.****.net/Fenggms/article/details/82779058