目录
第八章 HDFS中元数据的管理
8.1 元数据
8.1.1 什么是元数据?
元数据:抽象目录树、数据和数据块的映射、数据块的存储节点。存储在内存和磁盘中的元数据有所不同。
内存中存储:抽象目录树、数据和数据块的映射、数据块的存储节点
磁盘中存储:抽象目录树、数据和数据块的映射
8.1.2 元数据存储在哪里?
首先进入Hadoopdata目录,Hadoopdata目录下有三个目录:dfs、nm-local-dir;dsf目录下包括:data、name、namesecondary
(1)data:数据的真实存储目录,DataNode存储数据的存储目录
(2)name:NameNode存储元数据的目录
(3)nm-local-dir:HDFS的本地缓存
对于name目录,该目录中包含4类文件:
(1)历史日志文件
日志文件,记录的是客户端对元数据操作,并且只记录操作。比如某一个用户对某一个目录执行某一种操作。
历史日志文件,即:已经编辑完成的日志文件;
例如:edits_0000000000000000001-0000000000000000002等
(2)正在编辑的日志文件
正在编辑的日志文件,即:目前对元数据修改操作记录的文件;
例如:edits_inprogress_0000000000000000398
(3)镜像文件
镜像文件就是真实的元数据;但是,是真实的元数据信息经过序列化之后的文件;集群启动时会加载这个文件,在加载的时候反序列化。(为了减少存储的容量)
例如:序列化后的文件:fsimage_0000000000000000396
序列化后的加密文件: fsimage_0000000000000000396.md5
序列化目的:减小文件的大小
(4)seen_txid文件
合并点记录文件:记录的是下一次需要合并的日志文件的起始偏移量。
用户上传文件或其他操作,会改变元数据,但元数据不会直接写入fsimage文件中,而是在集群空闲时,通过日志文件修改fsimage文件;这种通过日志文件修改镜像文件的操作,就叫合并;
合并点记录的就是下一次需要合并文件的起始偏移量,本例中是398,即正在编辑的文件。
8.2 元数据的写入机制
Ps:无论什么时候,内存中保存的元数据永远是最新最完整的元数据。
当用户输入hadoop fs -mkdir/put/rename等修改元数据的命令时,元数据的写入步骤如下:
(1)首先,将操作写入磁盘日志文件中(edites文件)
(2)然后,将操作写入内存中,修改内存中的元数据;修改内存中元数据目录结构;
8.3 合并(CheckPoint)
为了减小fsimage和内存元数据之间的差别,HDFS被设计为:fsimage与日志文件(edit_xxxx)定期合并。但合并是由谁来做呢?
解释分析:
合并操作由SecondaryNameNode来做,由于NameNode的职责是保存元数据,处理客户端的请求;如果再进行文件合并,会导致压力过大,所以操作由SecondaryNameNode执行。
8.3.1 元数据合并前
将fsimage与正在编辑的日志合并的过程,也叫CheckPoint过程。
在开始合并之前,SecondNameNode时刻与NameNode保持通讯,目的是监督是否达到合并条件;触发合并的条件在hdfs-default.xml中配置。
(1)时间节点:默认时间间隔3600s,即1h;
(2)元数据条数:100W条
以上两条触发条件是或的关系,满足其中一个就会触发CheckPoint过程。
8.3.2 元数据合并(CheckPoint)
根据操作日志(edit文件)改变fsimage的元数据信息。CheckPoint步骤如下:
(1)SecondNameNode不间断的向NameNode发送请求,请求CheckPoint
(2)一旦满足响应条件,NameNode则向SecondNameNode发送checkpoint响应;
(3)再次请求CheckPoint
(4)NameNode将日志文件的状态,由正在编辑转变为编辑完成;即,edit_inprogress变为edit_xxxxx,该操作也被称为回滚;于此同时,为了记录合并期间客户端对HDFS的操作,重新生成一个正在编辑的日志文件(edit_inprogress)
(5)SecondNameNode将edits文件和fsimage拉取到SecondNameNode上。其中,日志文件是上一次CheckPoint至现在的
(6)SecondNameNode将edits文件和fsimage文件加载到内存中,进行合并;合并完成的文件叫:fsimage.checkpoint
(7)SecondNameNode将fsimage.checkpoint发送给NameNode;同时会固化到磁盘,永久保存一份,可在NameNode宕机时提供恢复帮助;
(8)NameNode将fsimage.checkpoint重命名为fsimage,并替换掉原来的fsimage文件
以上就是CheckPoint的全过程
(p.s :如果没有达到checkpoint过程的这段时间,集群正常关闭,在关闭之前内存中的元数据会固化到磁盘中一份。
保证SecondaryNameNode磁盘上的元数据和内存中的一致。)
8.4 总结集群中各节点的作用
8.4.1 NameNode的作用
(1)保存元数据
(2)处理客户端的请求
(3)负责分配数据块的存储节点
(4)进行负载均衡
8.4.2 SecondaryNameNode的作用
(1)帮助NameNode做元数据备份, 帮助NameNode恢复元数据
(2)进行CheckpPoint,帮助NameNode进行元数据合并,减轻NameNode压力
8.4.3 DataNode的作用
(1)用来存储数据块
(2)处理真正的磁盘读写
(3)定期的向NameNode发送心跳报告(状态信息和数据块的位置信息)
对数据块的位置信息的补充:
(1)数据块存储在DataNode节点上;
(2)每个DataNode只知道自己节点上存储了哪些块,但并不知道这些数据块分别属于哪个文件。
(NameNode知道数据块属于哪个文件,即文件与块的对应关系)
例如:Test.txt:blk_1:[];blk_2:[](在NameNode中)
数据块的存储信息会先存为一个空的列表,在DataNode向NameNode发送块报告的时候,NameNode会把对应块的存储节点添加到列表中。