NameNode和DataNode工作原理(图形化通俗易懂)

2022-05-10 19:45:56 浏览数 (1)

NameNode和DataNode工作原理

    • 组件模块说明
    • NameNode工作原理
      • 第一阶段: NameNode 启动
      • 第二阶段: Secondary NameNode 工作
    • DataNode 工作机制

组件模块说明

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)。

NameNode工作原理

第一阶段: NameNode 启动

  1. 第一次启动 NameNode 格式化(hdfs namenode -format)后, 创建 Fsimage 和 Edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
  2. 客户端对元数据进行增删改的请求。
  3. NameNode 记录操作日志,更新滚动日志,写入edits_inprogress,先记录文件再写入内存。
  4. NameNode 在内存中对元数据进行增删改。

第二阶段: Secondary NameNode 工作

  1. Secondary NameNode 询问 NameNode 是否需要 CheckPoint。
  2. Secondary NameNode 请求执行 CheckPoint。
  3. NameNode 滚动正在写的 Edits 日志,生成edits_inprogress_002记录正在写的日志,再把edits_inprogress_001改为edits_001。
  4. 将滚动前的编辑日志(edits_001)和镜像文件(fsimage)拷贝到 Secondary NameNode。
  5. Secondary NameNode 加载编辑日志(edits_001)和镜像文件(fsimage)到内存,并合并。
  6. 生成新的镜像文件 fsimage.chkpoint。
  7. 拷贝 fsimage.chkpoint 到 NameNode。
  8. NameNode 将 fsimage.chkpoint 重新命名成 fsimage。

DataNode 工作机制

  1. 一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。DataNode 启动后向 NameNode 注册。
  2. 注册成功。
  3. 注册成功后,周期性(6 小时) 的向 NameNode 上报所有的块信息。
  4. 心跳是每 3 秒一次,心跳返回结果带有 NameNode 给该 DataNode 的命令(如复制块数据到另一台机器,或删除某个数据块)。
  5. 如果超过 10 分钟 30秒没有收到某个 DataNode 的心跳,则认为该节点不可用。

如果定义超时时间为TimeOut,则超时时长的计算公式为:

代码语言:javascript复制
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-projecthadoop-hdfssrcmainjavaorgapachehadoophdfsserverblockmanagementDatanodeManager.java:

代码语言:javascript复制
    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;

0 人点赞