我想简短介绍一下namenodes和fsimage/edit_logs
,以及namenode在hadoop集群中的工作原理,
NameNode
将对文件系统的修改存储为日志,并附加到本机文件系统文件中,以进行编辑。
NameNode
启动时,它将从图像文件fsimage
中读取HDFS状态,然后从编辑日志文件中应用编辑。
然后将新的HDFS状态写入fsimage
,并使用空的编辑文件开始正常操作。
FsImage
是存储在OS文件系统上的文件,其中包含HDFS的完整目录结构(命名空间),其中包含有关数据在数据块上的位置以及哪些块存储在哪个节点上的详细信息。 / p>
EditLogs
是一个事务日志,记录HDFS文件系统中的更改或在HDFS集群上执行的任何操作,例如添加新块,
复制,删除等,它记录自创建上一个FsImage
以来的更改,
然后将更改合并到FsImage
文件中以创建新的FsImage
文件。
当我们启动namenode时,最新的FsImage
文件将被加载到“内存中”,同时
EditLog
文件不包含最新信息,也会将 FsImage
文件加载到内存中。
Namenode
将元数据存储在“内存中”,以便尽可能快地满足多个客户端请求。
如果不这样做,则对于每个操作,namenode
必须将元数据信息从磁盘读取到内存中。此过程将为每个操作消耗更多的磁盘查找时间。
让我们进行总结
HDFS元数据的持久性大致包括两类文件:
fsimage
在某个时间点包含文件系统的完整状态。每次文件系统修改都会分配一个唯一的,单调增加的事务ID。 fsimage文件代表所有修改后直到特定事务ID的文件系统状态。
编辑文件
包含一个日志,其中列出了在最近的fsimage之后进行的每个文件系统更改(文件创建,删除或修改)。
检查点
是合并最新fsimage内容的过程,合并该fsimage之后将应用所有编辑,以创建新的fsimage。检查点可以通过配置策略自动触发,也可以通过HDFS管理命令手动触发。
直到现在有关namenode
和编辑日志的摘要
现在让我们谈论一下我们的集群(其基于HDP版本2.6.5
)
在每个/var/hadoop/hdfs/namenode/current
的文件夹namenode
中,我们有以下fsimage文件
fsimage_0000000000000031788 100% 104KB 104.1KB/s 00:00
fsimage_0000000000000031788.md5 100% 62 0.1KB/s 00:00
fsimage_0000000000000041641 100% 104KB 104.1KB/s 00:00
fsimage_0000000000000041641.md5 100% 62 0.1KB/s 00:00
编辑日志
.
.
.
-rw-r--r-- 1 hdfs hadoop 328138542 Jan 23 12:37 edits_0000000022056979997-0000000022059239786
-rw-r--r-- 1 hdfs hadoop 301415558 Jan 23 13:07 edits_0000000022059239787-0000000022061345588
-rw-r--r-- 1 hdfs hadoop 311747850 Jan 23 13:37 edits_0000000022061345589-0000000022063490851
-rw-r--r-- 1 hdfs hadoop 12 Jan 23 13:37 seen_txid
-rw-r--r-- 1 hdfs hadoop 330301440 Jan 24 07:10 edits_0000000022063490852-0000000022065448335
现在,我们同时启动namenode
,
在namenode
日志中,我们看到namenode
正在重播每个编辑日志(因此,例如,如果我们有1965 edit_logs,则namenode
会一个一个地重播它们。 ...)
示例:
2020-01-27 06:20:37,306 INFO namenode.FSEditLogLoader (FSEditLogLoader.java:loadEditRecords(266)) - replaying edit log: 2072759/2282427 transactions completed. (91%)
2020-01-27 06:20:38,307 INFO namenode.FSEditLogLoader (FSEditLogLoader.java:loadEditRecords(266)) - replaying edit log: 2214991/2282427 transactions completed. (97%)
因此,namenode
在重播了所有1965 edit_logs
之后完全从活动/备用状态开始,
这需要将近17个小时
因此,我们同时重启两个namenodes
后,我们希望获得fsimage
个文件为最新
例如:
-rw-r--r-- 1 hdfs hadoop 445716 Jan 31 08:11 fsimage_0000000000000132222
-rw-r--r-- 1 hdfs hadoop 62 Jan 31 08:11 fsimage_0000000000000132222.md5
但是在我们的例子中,两个namenode重新启动后,我们得到了这个示例(fsimage无法更新-时间从1月3日开始)
-rw-r--r-- 1 hdfs hadoop 445716 Jan 03 07:11 fsimage_0000000000000132222
-rw-r--r-- 1 hdfs hadoop 62 Jan 03 07:11 fsimage_0000000000000132222.md5
所以我们可以看到fsimage
尚未更新,尽管namenode
已完全启动(17小时后)并且处于活动/备用状态
任何建议,为什么fsimage
不会在当前时间更新?