Hadoop 中的 NameNode 和 DataNode 之间的心跳机制

最近需要在 Hive 中实现 C/S 端的心跳,而心跳在 Hadoop 中被广泛使用,因此首先要清楚 Hadoop 中的心跳是如何实现的。在 Hadoop 中,NameNode 和 DataNode 之间、JobTracker 和 TaskTracker 之间都会有心跳信息,选取前者进行分析。

Hadoop 中通过心跳消息来确定 DataNodes 的有效性。对于超过时间未收到心跳消息的 DataNodes,系统认定这些 DataNodes 已经失效,将其从系统中移除。

心跳消息由 DataNode 发起,DataNode 是一个 Runnable 的对象,在系统运行的时候作为 Daemon 运行,

public static void runDatanodeDaemon(DataNode dn) throws IOException {
    if (dn != null) {
      //register datanode
      dn.register();
      dn.dataNodeThread = new Thread(dn, dnThreadName);
      dn.dataNodeThread.setDaemon(true); // needed for JUnit testing
      dn.dataNodeThread.start();
    }
  }


在 DataNode 的 run() 方法中会调用 offerservice() 方法,而在这个方法中会
定期发送心跳消息:

 

  public void offerService() throws Exception {
  ...
    while (shouldRun) {
      ...
      if (startTime - lastHeartbeat > heartBeatInterval) {
          //
          // All heartbeat messages include following info:
          // -- Datanode name
          // -- data transfer port
          // -- Total capacity
          // -- Bytes remaining
          //
          lastHeartbeat = startTime;
          DatanodeCommand[] cmds = namenode.sendHeartbeat(dnRegistration,
                                                       data.getCapacity(),
                                                       data.getDfsUsed(),
                                                       data.getRemaining(),
                                                       xmitsInProgress.get(),
                                                       getXceiverCount());
          myMetrics.heartbeats.inc(now() - startTime);
          //LOG.info("Just sent heartbeat, with name " + localName);
          if (!processCommand(cmds))
            continue;
        }
      ...
    }
  }
 

上述代码中的 namenode.sendHeartbeat() 方法是一个 对 namenode 的 RPC 调用,在 NameNode 类中的 sendHeartbeat() 方法中被处理。 该方法将最终调用 namesystem.handleHeartbeat(...) 来对心跳消息进行处理,更新心跳消息列表。

在 FSNamesystem 类中有一个 HeartbeatMonitor 子类,这是一个 Runnable 对象,用于定期的检查已经接受到的心跳消息,确定哪些 DataNode 已经失效,然后将失效的 DataNode 从系统中移除。

 

至此,一个完整的心跳消息的发起,汇总,处理的过程完成。


总结:Hadoop 中的心跳消息由 DataNode 发起,在 NameNode 中进行处理,最终由 HeartbeatMonitor 进行维护。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值