NameNode
Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。应用程序可以设置HDFS保存的文件的副本数目。
文件副本的数目称为文件的副本系数,这个信息也是由Namenode保存的。
Namenode全权管理数据块的复制,它周期性地从集群中的每个Datanode接收心跳信号和块状态报告(Blockreport)。接收到心跳信号意味着该Datanode节点工作正常。
块状态报告包含了一个该Datanode上所有数据块的列表。
NameNode的HA(High Available)
NameNode管理着所有的元数据,通常元数据都保存在内存里,这样对元数据的访问能够高效。但是有个隐患,就是如果NameNode节点宕机了,那么所有的元数据就一去不复返了。
如果我们能够把元数据在内存里保存一份,同时在硬盘上也保存一份,那么即使掉电也能将数据再恢复过来。checkpoint机制就是将元数据实时在硬盘上保存一份的机制。
先介绍几个相关的概念
- 元数据:元数据存储在NameNode的内存中,主要包括两个部分
- 目录树,目录树管理着HDFS中存储的所有的文件信息
- 块数据和datanode的对应关系
- edits:日志文件,记录对元数据的各种操作
- fsimage:元数据的镜像文件,可以理解为元数据保存在磁盘上的一个副本
现在来介绍一下checkpoint机制的流程
- secondary namenode请求namenode暂时停止使用edits,把日志记录在edits.new文件中
- secondary namenode从namenode复制fsimage、edits到本地
- secondary namenode合并fsimage、edits为fsimage.ckpt
- secondary namenode发送fsimage.ckpt到namenode
- namenode用新的fsimage覆盖旧的fsimage,用新的edits覆盖旧的edits
- 更新checkpoint时间
Namenode安全模式
NameNode的安全模式本质上是HDFS集群的一种只读模式,此时集群不允许任何对文件系统或者数据块修改的操作 Namenode启动后会进入一个称为安全模式的特殊状态。
处于安全模式的Namenode是不会进行数据块的复制的。Namenode从所有的 Datanode接收心跳信号和块状态报告。
块状态报告包括了某个Datanode所有的数据块列表(前面提到过)。每个数据块都有一个指定的最小副本数。当Namenode检测确认某个数据块的副本数目达到这个最小值,
那么该数据块就会被认为是副本安全(safely replicated)的;在一定百分比(这个参数可配置)的数据块被Namenode检测确认是安全之后(加上一个额外的30秒等待时间),
Namenode将退出安全模式状态。接下来它会确定还有哪些数据块的副本没有达到指定数目,并下发指令将这些数据块复制到其他Datanode上。
Datanode
集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上,
HDFS中的文件总是按照128M(老版本是64M)被切分成不同的块,一个文件被切出来的各个块尽可能地存储于不同的Datanode中。
文件名 | 副本系数 | 块id |
---|---|---|
/users/sameerp/data/part-0 | 2 | 1,3 |
/users/sameerp/data/part-1 | 3 | 2,4,5 |
此处共使用了8个Datanode来存放文件data
数据复制
客户端创建文件的请求其实并没有立即发送给Namenode,事实上,在刚开始阶段HDFS客户端会先将文件数据缓存到本地的一个临时文件。
应用程序的写操作被透明地重定向到这个临时文件。当这个临时文件累积的数据量超过一个数据块的大小,客户端才会联系Namenode。
假设该文件的副本系数设置为3,当本地临时文件累积到一个数据块的大小时,客户端会从Namenode获取一个Datanode列表用于存放副本。
然后客户端开始向第一个Datanode传输数据,第一个Datanode一小部分一小部分(4 KB)地接收数据,将每一部分写入本地仓库,并同时传输该部分到列表中第二个Datanode节点。
第二个Datanode也是这样,一小部分一小部分地接收数据,写入本地仓库,并同时传给第三个Datanode。最后,第三个Datanode接收数据并存储在本地。
因此,Datanode能流水线式地从前一个节点接收数据,并在同时转发给下一个节点,数据以流水线的方式从前一个Datanode复制到下一个。
参考:https://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html