当前位置:   article > 正文

HDFS源码分析——DataNode启动流程_datanode怎么启动

datanode怎么启动

1. 概述

在这里插入图片描述
DataNode会每6个小时上报块信息(数据、数据长度、校验和、时间戳),每3秒(心跳)汇报当前DataNode是否活着;超时则视为挂掉;

在这里插入图片描述
如图,NameNode启动时,主要的几个步骤分别是:

  1. initDataXceiver 初始化服务线程,用于接收Client和其他DataNode发来的数据
  2. startInfoServer 初始化HTTP服务
  3. initIpcServer 初始化RPC服务端
  4. refreshNameNodes→doRefreshNamenodes
    createBPOS 创建BPOS服务 ;
    →startAll→connectToNNAndHadnshakeregisterDatanode 注册DataNode(RPC调用)
  5. refreshNameNodes→doRefreshNamenodes
    →startAll→offerService→sendHeartBeat 发送心跳(RPC调用)

2. 解析

secureMain→createDataNode→instantiateDataNode→makeInstance→new DataNode→startDataNode→

从DataNode.java进入,先进入main方法的secureMain方法;
在这里插入图片描述

进入secureMain中的createDataNode:
在这里插入图片描述
进入instantiateDataNode初始化方法
在这里插入图片描述
进入instantiateDataNode中的makeInstance创建实例对象
在这里插入图片描述
new DataNode
在这里插入图片描述
在 DataNode方法找到startDataNode
在这里插入图片描述

2.1 initDataXceiver

startDataNode的1417行找到initDataXceiver服务线程(用来接收Client和其他DataNode发送过来的数据服务)
在这里插入图片描述
在这里插入图片描述

2.2 startInfoServer

退回startDataNode,在1418行找到startInfoServer ,即要开启web服务
在这里插入图片描述
进入DatanodeHttpServer
在这里插入图片描述
进入DatanodeHttpServer,会由HttpServer2绑定serverlet;
在这里插入图片描述

2.3 initIpcServer

退回startDataNodes,1430行找到initIpcServer
在这里插入图片描述
启动RPC服务端
在这里插入图片描述

2.4 refreshNameNodes→doRefreshNamenodes→createBPOS / startAll→connectToNNAndHadnshake→dpNamenode.registerDatanode

退回startDataNode,1441行找到refreshNamenodes,即要向NameNode反向注册;
在这里插入图片描述
进入refreshNamenodes,找到doRefreshNamenodes:
进入doRefreshNamenodes,找到createBPOS,DataNode需要和NameNode心跳,则当有多个NameNode时(高可用),
使用for循环,对每个NameNode都会创建一个BPOS服务,最后开启所有服务
在这里插入图片描述
startAll中:
在这里插入图片描述
在这里插入图片描述
开启bpThread线程的start(),对每个NameNode进行DataNode的注册;
在这里插入图片描述
进入bpThread的run()方法,进入connectToNNAndHandshake
在这里插入图片描述
在connectToNNAndHandnshake()中会获取到NameNode的proxy代理对象dpNamenode,
在这里插入图片描述
底层通过RPC.getProxy获取代理对象令为dpNamenode并返回;
在这里插入图片描述
回到connectToNNAndHadnshake,开始注册;
在这里插入图片描述
进入register,可见执行了代理对象dpNamenoderegisterDatanode方法,代理对象会将参数传到NameNodRpcServer同样的方法种去执行(RPC调用),只是看上去是由DataNode执行!
在这里插入图片描述
到此由DataNode向NameNode发送了注册信号,去namenodeRpcServer类中找到同样的registerDatanode方法,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在1139行找到addDatanode,进行注册:①添加datanode ②添加心跳信息
在这里插入图片描述

2.5 refreshNameNodes→doRefreshNamenodes→startAll→offerService→dpNamenode.sendHeartBeat

(5)回到refreshNameNodes→doRefreshNamenodes→startAll→bpThread.run() 的847行找到offerService()
在这里插入图片描述
进入offerService(),646行找到sendHeartBeat 发送心跳;
在这里插入图片描述
DataNode要向NameNode发送心跳属于跨进程通信,需要先拿到代理对象;
进入sendHeartBeat方法,在516行找到:执行bpNamenode.sendHeartbeat方法;
在这里插入图片描述
那么在namenodeRpcServer也有sendHeartbeat方法:
在这里插入图片描述
进入handleHeartbeat,继续handleHeartbeat
在这里插入图片描述
找到 heartbeatManager更新心跳 updateHeartbeat:
在这里插入图片描述
进入多个updateHeartbeat最后进入updateHeartbeatState:
①更新上次发送心跳的时间,②将NameNode元数据存储状态发给DataNode;
在这里插入图片描述
回到namenodeRpcServer → sendHeartbeat → handleHeartbeat:
最后由return new HeartbeatResponse把NameNode的命令(如创建文件、删除文件的指令等)返回给DataNode,完成NameNode和DataNode的心跳通信。
在这里插入图片描述
到此,DataNode启动过程结束。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/852039
推荐阅读
相关标签
  

闽ICP备14008679号