NameNode:存储文件的元数据。作用:管理HDFS的名称空间;配置副本策略;管理数据块(Block)映射信息;处理客户端读写请求。NameNode两个重要文件(内存中的镜像=fsimage+edits)。
fsimage:元数据镜像文件。NameNode的元数据存放在内存中,为了断电不丢数据,因此需要在磁盘中备份元数据。
edits:元数据操作日志(针对目录树的修改操作),被写入共享存储系统中, 如NFS、 JournalNode。当在内存中的元数据更新时,如果同时更新 FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦 NameNode 节点断电,就会产生数据丢失。 因此,引入 Edits 文件(只进行追加操作,效率很高) 。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到 Edits 中。 这样,一旦 NameNode 节点断电,可以通过 FsImage 和 Edits 的合并,合成元数据。
SecondaryNamenode:如果长时间添加数据到 Edits 中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行 FsImage 和 Edits 的合并,如果这个操作由 NameNode完成,又会效率过低。因此,引入一个新的组件SecondaryNamenode,专门用于 FsImage 和 Edits 的合并。
DataNode:在本地文件系统存储文件块数据,以及块数据的校验和。作用:存储实际的数据块;执行数据块的读/写操作。
Checkpoints: 作用就是合并fsimage和Edits文件,然后生成最新的fsimage。时间设置:1.定时时间到,默认每隔一小时执行一次(dfs.namenode.checkpoint.period)。2.数据满了,默认一分钟检查一次操作次数,当操作次数达到 1 百万时, SecondaryNameNode 执行一次(dfs.namenode.checkpoint.check.period和dfs.namenode.checkpoint.txns)。
如果定义超时时间为TimeOut,则超时时长的计算公式为:
TimeOut = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval
而默认的dfs.namenode.heartbeat.recheck-interval 大小为5分钟,dfs.heartbeat.interval默认为3秒。即10 分钟+30秒。 源码位于hadoop-hdfs-project\hadoop-hdfs\src\main\java\org\apache\hadoop\hdfs\server\blockmanagement\DatanodeManager.java:
heartbeatIntervalSeconds = conf.getTimeDuration(
DFSConfigKeys.DFS_HEARTBEAT_INTERVAL_KEY,
DFSConfigKeys.DFS_HEARTBEAT_INTERVAL_DEFAULT, TimeUnit.SECONDS);
heartbeatRecheckInterval = conf.getInt(
DFSConfigKeys.DFS_NAMENODE_HEARTBEAT_RECHECK_INTERVAL_KEY,
DFSConfigKeys.DFS_NAMENODE_HEARTBEAT_RECHECK_INTERVAL_DEFAULT); // 5 minutes
this.heartbeatExpireInterval = 2 * heartbeatRecheckInterval
+ 10 * 1000 * heartbeatIntervalSeconds;