DataNode启动流程
2015-12-01 18:09
766 查看
DataNode启动可以分为两个部分,创建DataNode对象和启动DataNode节点。
从DataNode.main()说起:
1、main(args)àsecureMain(args,null),在该函数内部:
调用StringUtils.startupShutdownMessage()方法打印启动或停止参数信息;
调用createDatanode(args…)创建DataNode对象e;
若创建成功,调用e.join()加入集群。
2、紧接着,我们来看createDatanode方法,在该方法内部:
1)instantiateDataNode()方法,用于初始化DataNode成员变量;
2)runDatanodeDaemon()方法,以daemon方式运行DataNode。
3、在instantiateDataNode方法内部,主要进行了如下操作:
1)判断conf参数是否为空,为空,则创建HdfsConfiguration对象;
2)调用GenericOptionsParse解析输入参数;
3)判断输入参数是否符合创建条件,不符合,直接返回;否则,
a、获取配置文件hdfs-site.xml中dfs.datanode.data.dir参数所对应的属性信息集合;
b、调用makeInstance(…)方法。
4、在makeInstance方法内部,
1)创建本地文件系统localFS,根据输入参数conf;
2)创建针对dfs.datanode.data.dir.perm属性对应的信息操作权限对象FSPermission;
3)创建DataNode.DataNodeDiskChecker对象,调用checkStorageLocations(),该方法主要进行校验文件夹是否在本地文件系统中存在,若存在,则检验文件所属用户的权限,将符合条件的目录集合返回;
4)调用DistributeMetricsSystem.initialize();
5)至少有一个目录存在,且满足权限;
6)调用DataNode的构造函数,创建DataNode实例。
6、在DataNode构造函数内部
进行了一些属性信息(变量)的赋值操作;
最主要的在startDataNode方法内部
在startDataNode方法内部,
成员变量赋值及实例化对象;
registerMXBean()方法用来注册Mbean信息的;
initDataXceiver()方法实例化DataXceiverServer,该对象主要是用来接收客户端或者其他Datanode的数据接收或者发送请求;
startInfoServer()方法启动Datanode的web服务器;
pauseMonitor使用来监控JVM是否有停顿的;
initIpcServer()用来启动DataNode上的rpc服务,主要包括两个服务:ClientDatanodeProtocolPB和InterDatanodeProtocolPB;
BlockPoolManager对象的实例化,用来支撑hadoop
federation特性,该对象的实例调用refreshNamenodes(conf)函数,在该函数内部:
a、首先,获取集群dfs.nameservices所对应的namenode节点的主机地址信息newAddressMap,key为dfs.nameservices对应的属性值,value为以dfs.ha.namenodes.${
dfs.nameservices}为key,值为namenode节点地址信息的map;
如:key:hdpha
, value:<<n1,master-active:8020>,<n2,master-standby:8020>>
b、然后,调用doRefreshNamenodes()函数,在函数内部调用createBPOS()函数创建BPOfferService对象,进而创建BPServiceActor对象;
c、调用startAll()函数,进而调用BPOfferService对象的start()方法,调用BPServiceActor对象的start方法,
BPServiceActor是一个实现Runnable接口的线程;
d、调用BPServiceActor对象的run方法,在方法内部调用connectToNNAndHandshake();
e、在方法内部,是与NameNode节点进行握手并注册的过程,
A1、首先调用DataNode对象的connectToNN()创建DatanodeProtocolClientSideTranslatorPB对象;
A2、然后调用BPServiceActor对象的retrieveNamespaceInfo函数创建NamespaceInfo对象,在对应的函数内部调用了DatanodeProtocolClientSideTranslatorPB对象的versionRequest()请求连接(RPC调用)到Namenode节点的信息,该方法返回一个NamespaceInfo对象,这个类主要包含了整个HDFS的版本信息
A3、紧接着调用BPOfferService对象的verifyAndSetNamespaceInfo(nsInfo)进行校验,主要进行数据块的初始化工作,其内部调用了DataNode的initBlockPool方法
A4、最后调用BPServiceActor对象的register()进行Datanode节点注册
关注:DatanodeRegistration这个类包含了所有NameNode用于与DataNode的通信过程中识别和确认DataNode节点的信息,DataNode通过RPC调用NameNode方法的时候,会传递这些信息。
f、上报数据块,在Datanode节点注册好以后,调用BPServiceActor对象的offerService()方法,在方法内部,DataNode节点根据心跳时间间隔循环的发送心跳信息,上报最近接收到的数据块信息,上报所有的数据块信息
从DataNode.main()说起:
1、main(args)àsecureMain(args,null),在该函数内部:
调用StringUtils.startupShutdownMessage()方法打印启动或停止参数信息;
调用createDatanode(args…)创建DataNode对象e;
若创建成功,调用e.join()加入集群。
2、紧接着,我们来看createDatanode方法,在该方法内部:
1)instantiateDataNode()方法,用于初始化DataNode成员变量;
2)runDatanodeDaemon()方法,以daemon方式运行DataNode。
3、在instantiateDataNode方法内部,主要进行了如下操作:
1)判断conf参数是否为空,为空,则创建HdfsConfiguration对象;
2)调用GenericOptionsParse解析输入参数;
3)判断输入参数是否符合创建条件,不符合,直接返回;否则,
a、获取配置文件hdfs-site.xml中dfs.datanode.data.dir参数所对应的属性信息集合;
b、调用makeInstance(…)方法。
4、在makeInstance方法内部,
1)创建本地文件系统localFS,根据输入参数conf;
2)创建针对dfs.datanode.data.dir.perm属性对应的信息操作权限对象FSPermission;
3)创建DataNode.DataNodeDiskChecker对象,调用checkStorageLocations(),该方法主要进行校验文件夹是否在本地文件系统中存在,若存在,则检验文件所属用户的权限,将符合条件的目录集合返回;
4)调用DistributeMetricsSystem.initialize();
5)至少有一个目录存在,且满足权限;
6)调用DataNode的构造函数,创建DataNode实例。
6、在DataNode构造函数内部
进行了一些属性信息(变量)的赋值操作;
最主要的在startDataNode方法内部
在startDataNode方法内部,
成员变量赋值及实例化对象;
registerMXBean()方法用来注册Mbean信息的;
initDataXceiver()方法实例化DataXceiverServer,该对象主要是用来接收客户端或者其他Datanode的数据接收或者发送请求;
startInfoServer()方法启动Datanode的web服务器;
pauseMonitor使用来监控JVM是否有停顿的;
initIpcServer()用来启动DataNode上的rpc服务,主要包括两个服务:ClientDatanodeProtocolPB和InterDatanodeProtocolPB;
BlockPoolManager对象的实例化,用来支撑hadoop
federation特性,该对象的实例调用refreshNamenodes(conf)函数,在该函数内部:
a、首先,获取集群dfs.nameservices所对应的namenode节点的主机地址信息newAddressMap,key为dfs.nameservices对应的属性值,value为以dfs.ha.namenodes.${
dfs.nameservices}为key,值为namenode节点地址信息的map;
如:key:hdpha
, value:<<n1,master-active:8020>,<n2,master-standby:8020>>
b、然后,调用doRefreshNamenodes()函数,在函数内部调用createBPOS()函数创建BPOfferService对象,进而创建BPServiceActor对象;
c、调用startAll()函数,进而调用BPOfferService对象的start()方法,调用BPServiceActor对象的start方法,
BPServiceActor是一个实现Runnable接口的线程;
d、调用BPServiceActor对象的run方法,在方法内部调用connectToNNAndHandshake();
e、在方法内部,是与NameNode节点进行握手并注册的过程,
A1、首先调用DataNode对象的connectToNN()创建DatanodeProtocolClientSideTranslatorPB对象;
A2、然后调用BPServiceActor对象的retrieveNamespaceInfo函数创建NamespaceInfo对象,在对应的函数内部调用了DatanodeProtocolClientSideTranslatorPB对象的versionRequest()请求连接(RPC调用)到Namenode节点的信息,该方法返回一个NamespaceInfo对象,这个类主要包含了整个HDFS的版本信息
A3、紧接着调用BPOfferService对象的verifyAndSetNamespaceInfo(nsInfo)进行校验,主要进行数据块的初始化工作,其内部调用了DataNode的initBlockPool方法
A4、最后调用BPServiceActor对象的register()进行Datanode节点注册
关注:DatanodeRegistration这个类包含了所有NameNode用于与DataNode的通信过程中识别和确认DataNode节点的信息,DataNode通过RPC调用NameNode方法的时候,会传递这些信息。
f、上报数据块,在Datanode节点注册好以后,调用BPServiceActor对象的offerService()方法,在方法内部,DataNode节点根据心跳时间间隔循环的发送心跳信息,上报最近接收到的数据块信息,上报所有的数据块信息
相关文章推荐
- NameNode格式过程
- 安装node_modules文件遇到的问题:更改代理
- 【02】Node.js 安装配置(OK)
- Node.js Tools for Visual Studio
- websocket nodejs
- [LeetCode]Remove Nth Node From End of List
- Leetcode #237 Delete Node in a Linked List
- 使用 AngularJS & NodeJS 实现基于 token 的认证应用
- inode
- C#操作xml SelectNodes,SelectSingleNode总是返回NULL 与 xPath 介绍
- 天猫双11前端分享系列(四):大规模 Node.js 应用
- 解决在IE中获取数据的缓存问题,运行环境为node.js
- Node.js 手册查询-5-Ejs 方法
- 使用dwz-ria Jquery ui框架出现“HierarchyRequestError: Node cannot be inserted at the specified point in th
- [Nodejs入门]第四篇,用nodejs实现一个爬虫的功能(二)
- [LeetCode] Populating Next Right Pointers in Each Node
- nodejs 聊天室
- hadoop 中namenode 和 secondary namenode 对元数据的管理
- NodeJS学习笔记(一)——异步I/O的理解
- WebKit之Node的继承关系图