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所示:
笔者画的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文件
①: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放在不同的机器上。