HDFS的角色
一个Master: NameNode
NameNode负责存储元数据,以树形结构储存目录,但是block块位置不会长久保存,每次开机需要重新获取block块位置(由DataNode汇报给NameNode)
多个Slave: DataNode
负责储存数据,一个大文件会被切分成多个block块,每块128M,并且会有三份副本,保证数据安全
SecondaryNameNode:
负责辅助NameNode处理元数据
HDFS的元数据管理
由于HDFS中元数据全部存储在一个NameNode的内存中,一旦发生单点故障整个集群的元数据就会丢失,导致集群无法使用,所以有 fsimage(保存元数据信息,在磁盘中)和edits(保存数据操作信息,在磁盘中)来保证元数据不会丢失,断电后只需将edits和fsimage合并即可得到元数据,为了保证该过程的效率,引入了secondaryNameNode,以下为该过程(checkpoint)流程:
1.进行元数据操作时,会将操作记录在edits中,当edits存储操作条数达到一百万或者checkpoint过程间隔达到一小时则会将edits发送给SecondaryNameNode,并且将新产生的操作数据写入新的edits
2.SecondaryNameNode收到edits后将自身储存的fsimage和发送过来的edits加载到内存中进行合并,合并后产生新的fsimage覆盖原本储存的fsimage,并将新产生的fsimage发送给NameNode
3.NameNode收到新的fsimage后将旧的覆盖
因为checkpoint过程的存在如果发生断电,NameNode只需要将自身的edits和fsimage合并即可得到完整的元数据信息
HDFS写流程
1.client端向NameNode发送写入请求
2.NameNode检查文件是否存在,用户是否有操作限权,通过检查后返回第一个block块的储存位置列表
3.client端收到储存位置列表后形成pipeline,将bleock块分成64k的packet进行传输,client端发送给第一个DataNode,第一个DataNode链接并发送给第二个DataNode,第二个链接并发送给第三个DataNode
4.重复以上步骤直到第一个block块传输完成,重复申请写操作直到文件传输完成
HDFS读操作
1.client端向NameNode请求读取数据
2.NameNode检查文件是否存在,用户是否有操作限权,检查通过后将第一个block块存储位置发送给client端
3.client端根据拓扑原理从距离最近的DataNode读取block块数据
4.重复以上操作直到文件传输完成,最后将所有block块合并成一个完整文件