体系结构
从上图可以看出NameNode节点:在Hadoop1.x的版本中,NameNode节点只有一个,所以NameNode节点为非HA的(不是高可用的,后面会详细讨论)。在Hadoop2.X的版本中,NameNode节点可以有很多个。所以在Hadoop2.x的版本中,NameNode节点是HA的。(高可用的)。该节点主要负责管理文件系统命名空间、集群配置和数据块的复制等
DataNode节点:是文件存储的基本单元,它以数据块的形式保存了hdfs中文件的内容和数据块的数据校验信息。SecondaryNameNode节点:配合NameNode节点管理元数据
通信协议
Client与NameNode的通信遵循ClientProtocol协议
NameNode与DataNode的通信遵循DataNodeProtocol协议
block
block为块,是hdfs的最小存储单位。
在HDFS中,有一个特别重要的概念:数据块(Block)。前面介绍到,在HDFS中存储的文件都是超大数据的文件,我们可以把这个超大规模的文件以一个标准切分成几块,分别存储到不同的磁盘上。这个标准就称为Block。Block 默认的大小为64M。这样做有以下几点好处:
1、 文件块可以保存在不同的磁盘上。在HDFS系统中,一个文件可以分成不同的Block存储在不同的磁盘上。
2、 简化存储系统。这样不需要管理文件,而是管理文件块就可以了。
3、 有利于数据的复制。在HDFS系统中,一个数据节点一般会复制3份
NameNode
如图为NameNode做的事情:维护着整个文件系统的文件目录树
从上图可以看出,NameNode维护两层关系。第一关系为文件目录的元信息和文件的数据块的关系,/txt/exec/a.txt分为三个数据块存储b1,b2,b3。/word/exec/b.doc分为两个数据块存储b4,b5。第二关系为数据块信息与数据节点之间的关系。从图中也可以看出来b1在DataNode1,DataNode2,DataNode3节点都有。b2在DataNode1,DataNode2,DataNoden节点。依次类推。以上的信息以两种形式存储在本地文件系统中。一种是命名空间镜像(File System Image,FSImage,也称为文件系统镜像),另一种是命名空间镜像的编辑日志(Edit Log)。
在HDFS运行的过程中,NameNode节点还能获取HDFS整体运行的状态信息。如系统的可用空间、已经使用的空间、各数据节点的当前状态等。
FSImage
命名空间镜像保存着某一特定时刻HDFS的目录树、元信息和数据块索引信息。
EditLog
当在HDFS中,后续对FSImage的改动则放在编辑日志中。
SecondaryNameNode
是hadoop1.0的产物。用户定期合并FSImage和EditLog。在大规模集群的情况下,SecondaryNameNode是单独一台机器的。该节点根据集群配置的时间间隔,不停地获取HDFS某一个时间点的FSImage和EditLog,合并得到一个新的FSImage。这个新的FSImage会上传到NameNode节点上,替换原来的NameNode上的FSImage,并清空上述日志。这种机制称为Checkpoint机制。这样避免了EditLog过大,导致NameNode启动时间过长的问题。但是如果NameNode出现故障,SecondaryNameNode是不能帮助NameNode进行自动恢复的。
Checkpoint的触发机制有两种。一种是设置两次checkpoint之间的最大间隔时间。默认为3600秒,也就是说每3600秒触发一次checkpoint。一种是规定edit文件的最大值。当文件超过该值以后,触发一次checkpoint。
上图为在secondarynamenode中发生的事情:
1、 SecondaryNameNode通过RPC技术远程调用NameNode中的getEditLogSize方法,获取到NameNode节点上编辑日志的大小
2、 如果编辑日志很小,SecondaryNameNode就不需要合并元数据镜像和编辑日志。
3、 继续通过RPC技术远程调用rollEditLog方法,启动一次checkpoint过程
4、 NameNode在调用rollEditLog方法之前,需要创建一个新的编辑日志文件edit.new。后续对文件系统元数据的改动,都会记录到edit.new文件中。
5、 SecondaryNameNode通过RPC技术把NameNode中的fsimage和edit文件读取过来,在内存中进行合并(3,4)
6、 在SecondaryNameNode中,在内存中合并的文件为fsimage.ckpt。
NameNode通过RPC技术把fsimage.ckpt下载到本地,把fsimage.ckpt覆盖掉原来的fsimage,形成新的fsimage,把原来的edit.new改成edit。
DataNode
在hadoop中,数据是存放在DataNode上面的。是以Block的形式存储的。
DataNode节点会不断向NameNode节点报告。初始化时,每个数据节点将当前存储的数据块告知NameNode节点。后续DataNode节点在工作的过程中,数据节点仍会不断的更新 NameNode节点与之对应的元数据信息,并接受来自NameNode节点的指令,创建、移动或者删除本地磁盘上的数据块。
DataNode的启动与心跳
从上图可以看出,当DataNode启动的时候
1、 检查版本号:检查本地的版本号和NameNode中的版本号是否一致
2、 把DataNode节点注册到NameNode中
3、 DataNode需要向NameNode报告其数据节点的blocks信息
4、 之后DataNode会一直向NameNode发出心跳信息
SecordaryNameNode