(元数据存储位置和存储策略)
1、元数据:
(1)元数据维护HDFS文件系统和虚拟访问目录的信息;namenode记录用户存储数据的数据元信息。
(2)元数据包括:数据切块描述信息、副本个数、存储位置、切块大小、文件权限等。
(3)元数据存储位置:/opt/hdpdata/data/current/BP-742774004-192.168.133.3-1597321931822/current/finalized/subdir0/subdir0
2、元数据的存储位置:(两种)
(1)内存:元数据存储在内存对象中;
优点:读写方便、速度快;
缺点:宕机会造成元数据丢失。
(2)磁盘:元数据存储在内存对象的序列化文件中;
优点:安全,机器宕机以后,反序列化修复数据;
缺点:每次序列化占用资源,影响性能。
3、需要考虑的问题:
(1)在主节点内存中的元数据,存储在FsImage对象中,以Tree的数据结构管理数据(方便目录维护)。
(2)但是内存空间有限,为保证宕机后数据的正确性,需要定期把存储元数据的FsImage对象序列化到磁盘进行持久化存储,但是每put一次都会影响性能,占用namenode资源。
(3)如果很长时间序列化一次,中途宕机会导致数据丢失,也不能保证数据信息记录完整。
4、解决问题:(1)日志
(1)用户对数据的操作记录到edits日志中,不需要每一次都进行持久化处理,节省资源;定期合并元数据文件fsimage0000+日志文件edits0000。
(2)宕机时,用上一次持久化的元数据文件+日志文件进行元数据的恢复。
(3)但是,随着时间增长,fsimage0000文件与元数据差异越来越大;用户操作增加,日志数据也越来越大;宕机重启后加载日志数据会花费大量时间,期间用户无法进行操作。
注:日志 —> 追加写,滚动生成,存放在磁盘。
fsimage0000和edits0000是FsImage对象和日志经过序列化存储到磁盘上的文件。
4、解决问题:(2)SecondaryNamenode
引入SecondaryNamenode对元数据进行处理(checkpoint机制)。SecondaryNamenode是一个新的进程,相当于namenode的一个小弟,专门干合并的事情的。
(1)namenode启动,初始化,生成FsImage目录结构文件,记录HDFS的元数据信息;生成edits日志文件,记录用户对HDFS数据的所有写操作(读操作不会记录)。
(2)SecondaryNamenode启动,下载namenode的FsImage0000文件,加载镜像文件,反序列化为FsImage内存对象。
(3)SecondaryNamenode下载日志文件,回放还原,更新到内存中,修改镜像对象。
(4)更新FsImage对象,持久化为fsimage0001镜像文件,再将上传到namenode。
(5)清除namenode中的没用的日志数据和序列化的镜像文件。
(6)每达到触发条件(默认1h或100w次操作)重复完成上述过程一次(checkpoint)。
4、解决问题:(3)edits位置
(1)如果edits日志文件和元数据都存放在主节点中,宕机时,日志文件也会随之消失;
(2)所以,edits日志文件也要存放在集群中,利用集群的高可靠性,完成用户的记录和元数据的恢复。