Hadoop源码阅读(二):DataNode启动

说明:
1.Hadoop版本:3.1.3
2.阅读工具:IDEA 2023.1.2
3.源码获取:Index of /dist/hadoop/core/hadoop-3.1.3 (apache.org)
4.工程导入:下载源码之后得到 hadoop-3.1.3-src.tar.gz 压缩包,在当前目录打开PowerShell,使用tar -zxvf指令解压即可,然后使用IDEA打开hadoop-3.1.3-src文件夹,要注意配置好Maven或Gradle仓库,否则jar包导入会比较慢
5.参考课程:尚硅谷大数据Hadoop教程,hadoop3.x搭建到集群调优,百万播放_哔哩哔哩_bilibili

Hadoop源码阅读(二):DataNode启动_第1张图片

ctrl + n 全局查找datanode,进入DataNode.java

官方对其介绍如下:

/**********************************************************
 * DataNode is a class (and program) that stores a set of
 * blocks for a DFS deployment.  A single deployment can
 * have one or many DataNodes.  Each DataNode communicates
 * regularly with a single NameNode.  It also communicates
 * with client code and other DataNodes from time to time.
 *
 * DataNodes store a series of named blocks.  The DataNode
 * allows client code to read these blocks, or to write new
 * block data.  The DataNode may also, in response to instructions
 * from its NameNode, delete blocks or copy blocks to/from other
 * DataNodes.
 *
 * The DataNode maintains just one critical table:
 *   block-> stream of bytes (of BLOCK_SIZE or less)
 *
 * This info is stored on a local disk.  The DataNode
 * reports the table's contents to the NameNode upon startup
 * and every so often afterwards.
 *
 * DataNodes spend their lives in an endless loop of asking
 * the NameNode for something to do.  A NameNode cannot connect
 * to a DataNode directly; a NameNode simply returns values from
 * functions invoked by a DataNode.
 *
 * DataNodes maintain an open server socket so that client code 
 * or other DataNodes can read/write data.  The host/port for
 * this server is reported to the NameNode, which then sends that
 * information to clients or other DataNodes that might be interested.
 *
 **********************************************************/

找到main方法

Hadoop源码阅读(二):DataNode启动_第2张图片

进入secureMain方法:

Hadoop源码阅读(二):DataNode启动_第3张图片

进入createDataNode方法:

Hadoop源码阅读(二):DataNode启动_第4张图片

  • 进入instantiateDataNode方法(初始化DN):

Hadoop源码阅读(二):DataNode启动_第5张图片

进入makeInstance方法(实例化对象):

Hadoop源码阅读(二):DataNode启动_第6张图片

进入DataNode类:

Hadoop源码阅读(二):DataNode启动_第7张图片

进入startDataNode方法,之后进行DN启动的一系列操作;

1.初始化DataXceiverServer(initDataXceiver)

startDataNode方法中:

Hadoop源码阅读(二):DataNode启动_第8张图片

进入initDataXceiver方法:

dataXceiverServer是一个服务(线程),DN利用该服务来接收客户端和其他DN发送过来的数据服务

2.初始化HTTP服务(startInfoServer)

startDataNode方法中:

Hadoop源码阅读(二):DataNode启动_第9张图片

进入startInfoServer方法,实例化了一个httpserver

Hadoop源码阅读(二):DataNode启动_第10张图片

进入DatanodeHttpServer类:(DatanodeHttpServer.java)

也是通过builder构建了一个HTTP server

Hadoop源码阅读(二):DataNode启动_第11张图片

3.初始化RPC服务器(initIpcServer)

startDataNode方法中:

Hadoop源码阅读(二):DataNode启动_第12张图片

进入initIpcServer,构建RPC服务器

Hadoop源码阅读(二):DataNode启动_第13张图片

4.向NameNode注册(refreshNamenodes)

startDataNode方法中:

Hadoop源码阅读(二):DataNode启动_第14张图片

进入refreshNamenodes(BlockPoolManager.java)

Hadoop源码阅读(二):DataNode启动_第15张图片

进入doRefreshNamenodes方法:

Hadoop源码阅读(二):DataNode启动_第16张图片

先是创建BPOS,然后启动所有的BPOS

  • 接下来进入createBPOS方法

Hadoop源码阅读(二):DataNode启动_第17张图片

可以看到根据NameNode个数创建对应的服务:

Hadoop源码阅读(二):DataNode启动_第18张图片

有多少个NN就创建多少个对应的服务

  • 进入startAll方法

Hadoop源码阅读(二):DataNode启动_第19张图片

可以看到,遍历了所有的bpos,依次进行启动

这里的offerServices是存储所有通过createBPOS方法创建的bpos的集合:

Hadoop源码阅读(二):DataNode启动_第20张图片

进入bpos.start()方法:

Hadoop源码阅读(二):DataNode启动_第21张图片

继续进入:

Hadoop源码阅读(二):DataNode启动_第22张图片

看到bpThread,表示开启一个线程,因此查找其run方法

Hadoop源码阅读(二):DataNode启动_第23张图片

可以看到通过connectToNNAndHandshake方法向NN进行注册:

Hadoop源码阅读(二):DataNode启动_第24张图片

  • 通过connectToNN方法来获取NN的RPC客户端对象,进入该方法:

进入DatanodeProtocolClientSideTranslatorPB

Hadoop源码阅读(二):DataNode启动_第25张图片

通过createNamenode方法来创建NN的RPC代理:

Hadoop源码阅读(二):DataNode启动_第26张图片

  • 通过register方法来向NN进行注册:

Hadoop源码阅读(二):DataNode启动_第27张图片

通过bpNamenode.registerDatanode将注册信息发送给NN(bpNamenode即创建的NN RPC proxy)

注意:这里的registerDatanode方法,由DN调用,但执行在NN

Hadoop源码阅读(二):DataNode启动_第28张图片

FSNamesystem中查找:

Hadoop源码阅读(二):DataNode启动_第29张图片

ctrl+alt+h查看该方法的调用:

Hadoop源码阅读(二):DataNode启动_第30张图片

于是到NameNodeRpcServer中去查找:

Hadoop源码阅读(二):DataNode启动_第31张图片

可以看到,DN的信息向NN注册这一步骤是在该方法中完成的;

接下来回到FSNamesystem中,进入blockManager.registerDatanode方法:

Hadoop源码阅读(二):DataNode启动_第32张图片

进入datanodeManager.registerDatanode:(DatanodeManager.java)

Hadoop源码阅读(二):DataNode启动_第33张图片

进入addDatanode

Hadoop源码阅读(二):DataNode启动_第34张图片

5.向NameNode发送心跳

回到startAll方法,再向前进入到BPServiceActor.java中的run方法

找到其中的offerService方法

Hadoop源码阅读(二):DataNode启动_第35张图片

进入offerService方法:

Hadoop源码阅读(二):DataNode启动_第36张图片

进入sendHeartBeat方法:

Hadoop源码阅读(二):DataNode启动_第37张图片

这里的bpNamenode是在connectToNNAndHandshake方法中获取到的NN的代理

因此该方法实际上是通过NN的RPC客户端将心跳信息发送给NN

因此该方法实际的实现是在NN中,因此在NameNodeRpcServer.java中搜索sendHeartbeat

Hadoop源码阅读(二):DataNode启动_第38张图片

通过handleHeartbeat来处理DN的心跳信息,进入该方法:

Hadoop源码阅读(二):DataNode启动_第39张图片

处理DN发送过来的心跳并作出相应;

继续进入handleHeartbeat方法:(DatanodeManager.java)

Hadoop源码阅读(二):DataNode启动_第40张图片

通过updateHeartbeat方法来更新心跳信息,进入该方法:(HeartbeatManager.java)

Hadoop源码阅读(二):DataNode启动_第41张图片

再次进入:(BlockManager.java)

Hadoop源码阅读(二):DataNode启动_第42张图片

继续进入:(DatanodeDescriptor.java)

Hadoop源码阅读(二):DataNode启动_第43张图片

进入updateHeartbeatState方法:

Hadoop源码阅读(二):DataNode启动_第44张图片

 

 

你可能感兴趣的:(大数据,hadoop,hadoop,大数据,分布式)