Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)数据结构初始化
来源:互联网 发布:qq飞车卓越16年数据 编辑:程序博客网 时间:2024/05/16 09:27
在上篇文章《Hadoop源码分析--HDFS HeartBeat(心跳检测)整体结构》中,详细了解了HDFS中关于心跳的整体结构,知道了BlockPoolManager、BPOfferService和BPServiceActor三者之间的关系。接下来,我们就开始研究HDFS心跳汇报之数据结构初始化。
首先,在DataNode节点启动时所必须执行的startDataNode()方法中,有如下代码:
它构造了一个BlockPoolManager实例,并调用其refreshNamenodes()方法,完成NameNodes的刷新。我们来看下这个方法:
首先,我们看下如何从配置信息conf中获取nameserviceid->{namenode名称->InetSocketAddress}的映射集合newAddressMap,相关代码如下:
这个方法的处理逻辑如下:
1、首先,根据静态方法getHostPortString()从配置信息中获取默认地址defaultAddress;
2、调用getAddresses()方法,利用conf、defaultAddress等获取nameserviceId->{nameNodeId->InetSocketAddress}对应关系的集合addressList,并返回。
下面,我们再看下getAddresses()方法,代码如下:
继续看getAddressesForNameserviceId()方法,如下:
它通过参数获取dfs.ha.namenodes.nsId获取到NameNodeId的集合nnIds,然后针对每个NameNode,根据keys获取address,这keys传递进来的就是dfs.namenode.servicerpc-address、dfs.namenode.rpc-address,也就是优先取前一个参数,前一个取不到的话,再取第二个参数,然后将address封装成InetSocketAddress,得到isa,将nnId-> InetSocketAddress的对应关系放入到Map中,最终返回给上层应用。
至此,从配置信息conf中获取nameserviceid->{namenode名称->InetSocketAddress}的映射集合newAddressMap就分析完了。下面,我们再看下初始化的重点:调用doRefreshNamenodes()方法执行集合newAddressMap中的刷新。代码如下:
至此,从配置信息conf中获取nameserviceid->{namenode名称->InetSocketAddress}的映射集合newAddressMap就分析完了。下面,我们再看下初始化的重点:调用doRefreshNamenodes()方法执行集合newAddressMap中的刷新。代码如下:
整个doRefreshNamenodes()方法比较长,但是主体逻辑很清晰,主要分五大步骤,分别如下:
1、第一步,针对nameserviceid->{namenode名称->InetSocketAddress}的映射集合newAddressMap中每个
nameserviceid,确认它是一个完全新加的nameservice,还是一个其NameNode列表被更新的nameservice,分别加入待添加toAdd和待刷新toRefresh集合;
2、第二步,针对newAddressMap中没有,而目前DataNode内存bpByNameserviceId中存在的nameservice,需要删除,添加到待删除toRemove集合;
3、第三步,处理待添加toAdd集合,启动所有新的nameservices:根据addrs创建BPOfferService,维护
BPOfferService相关映射集合,然后启动所有的BPOfferService;
4、第四步,处理待删除toRemove集合,停止所有旧的nameservices;
5、第五步,处理待刷新toRefresh集合,更新NN列表已变化的nameservices。
就是这样,将需要处理的nameservice分别加入到不同的集合,然后按照添加、删除、更新的顺序针对处理类型相同的nameservice一并处理即可。
接下来,我们分别研究下每一步的细节:
1、第一步,针对nameserviceid->{namenode名称->InetSocketAddress}的映射集合newAddressMap中每个
nameserviceid,确认它是一个完全新加的nameservice,还是一个其NameNode列表被更新的nameservice,分别加入待添加toAdd和待刷新toRefresh集合;
它的处理思路是,循环addrMap中每个nameserviceid,放入待添加toAdd或者待刷新toRefresh集合;如果
bpByNameserviceId结合中存在nameserviceId,加入待刷新集合toRefresh,否则加入到待添加集合toAdd。
2、第二步,针对newAddressMap中没有,而目前DataNode内存bpByNameserviceId中存在的nameservice,需要删除,添加到待删除toRemove集合;
它的处理思路是:利用Sets的difference()方法,比较bpByNameserviceId和addrMap两个集合的keySet,找出
bpByNameserviceId中存在,但是addrMap中不存在的nameserviceid,生成待删除集合toRemove。
3、第三步,处理待添加toAdd集合,启动所有新的nameservices:根据addrs创建BPOfferService,维护
BPOfferService相关映射集合,然后启动所有的BPOfferService;
这一步针对待添加集合toAdd中的每个nameserviceId,做以下处理:
3.1、从addrMap中根据nameserviceId获取对应Socket地址InetSocketAddress,创建集合addrs;
3.2、根据addrs创建BPOfferService实例bpos;
3.3、将nameserviceId->BPOfferService的对应关系添加到集合bpByNameserviceId中
3.4、将BPOfferService添加到集合offerServices中;
最后,调用startAll()方法启动所有BPOfferService,实际上是通过调用它的start()方法启动。
其中,创建BPOfferService实例bpos时,BPOfferService的构造方法如下:
1、第一步,针对nameserviceid->{namenode名称->InetSocketAddress}的映射集合newAddressMap中每个
nameserviceid,确认它是一个完全新加的nameservice,还是一个其NameNode列表被更新的nameservice,分别加入待添加toAdd和待刷新toRefresh集合;
2、第二步,针对newAddressMap中没有,而目前DataNode内存bpByNameserviceId中存在的nameservice,需要删除,添加到待删除toRemove集合;
3、第三步,处理待添加toAdd集合,启动所有新的nameservices:根据addrs创建BPOfferService,维护
BPOfferService相关映射集合,然后启动所有的BPOfferService;
4、第四步,处理待删除toRemove集合,停止所有旧的nameservices;
5、第五步,处理待刷新toRefresh集合,更新NN列表已变化的nameservices。
就是这样,将需要处理的nameservice分别加入到不同的集合,然后按照添加、删除、更新的顺序针对处理类型相同的nameservice一并处理即可。
接下来,我们分别研究下每一步的细节:
1、第一步,针对nameserviceid->{namenode名称->InetSocketAddress}的映射集合newAddressMap中每个
nameserviceid,确认它是一个完全新加的nameservice,还是一个其NameNode列表被更新的nameservice,分别加入待添加toAdd和待刷新toRefresh集合;
它的处理思路是,循环addrMap中每个nameserviceid,放入待添加toAdd或者待刷新toRefresh集合;如果
bpByNameserviceId结合中存在nameserviceId,加入待刷新集合toRefresh,否则加入到待添加集合toAdd。
2、第二步,针对newAddressMap中没有,而目前DataNode内存bpByNameserviceId中存在的nameservice,需要删除,添加到待删除toRemove集合;
它的处理思路是:利用Sets的difference()方法,比较bpByNameserviceId和addrMap两个集合的keySet,找出
bpByNameserviceId中存在,但是addrMap中不存在的nameserviceid,生成待删除集合toRemove。
3、第三步,处理待添加toAdd集合,启动所有新的nameservices:根据addrs创建BPOfferService,维护
BPOfferService相关映射集合,然后启动所有的BPOfferService;
这一步针对待添加集合toAdd中的每个nameserviceId,做以下处理:
3.1、从addrMap中根据nameserviceId获取对应Socket地址InetSocketAddress,创建集合addrs;
3.2、根据addrs创建BPOfferService实例bpos;
3.3、将nameserviceId->BPOfferService的对应关系添加到集合bpByNameserviceId中
3.4、将BPOfferService添加到集合offerServices中;
最后,调用startAll()方法启动所有BPOfferService,实际上是通过调用它的start()方法启动。
其中,创建BPOfferService实例bpos时,BPOfferService的构造方法如下:
它实际上是遍历nnAddrs,为每个namenode添加一个构造的BPServiceActor线城实例,加入到bpServices列表。
而调用startAll()方法启动所有BPOfferService时,执行的代码如下:
它会遍历offerServices,启动所有的BPOfferService,而BPOfferService的启动,实际上就是将其所持有的每个NameNode对应的BPServiceActor线程启动,代码如下:
4、第四步,处理待删除toRemove集合,停止所有旧的nameservices;
在这一步中,遍历待删除集合toRemove中的每个nameserviceId:
4.1、根据nameserviceId从集合bpByNameserviceId中获取BPOfferService;
4.2、调用BPOfferService的stop()和join()方法停止服务,它们会调用本身的remove()方法;
而BPOfferService的stop()和join()方法,则是依次调用BPOfferService所包含的所有BPServiceActor线程的stop()和join()方法,代码如下:
5、第五步,处理待刷新toRefresh集合,更新NN列表已变化的nameservices;
在最后一步中,遍历待更新集合toRefresh中的每个nameserviceId:
5.1、根据nameserviceId从集合bpByNameserviceId中取出对应的BPOfferService;
5.2、根据BPOfferService从配置信息addrMap中取出NN的Socket地址InetSocketAddress,形成列表addrs;
5.3、调用BPOfferService的refreshNNList()方法根据addrs刷新NN列表。
好了,HDFS心跳相关数据结构的初始化已分析完毕,至此,涉及到每个命名空间服务中每个NameNode相关的BPServiceActor线程均已启动,它是真正干活的苦力,真正的底层劳动人民啊!至于它是怎么运行来完成HDFS心跳的,我们下一节再分析吧!
0 0
- Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)数据结构初始化
- Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)整体结构
- Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之BPServiceActor工作线程运行流程(上)
- Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之BPServiceActor工作线程运行流程(下)
- Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之DataNode端数据块增量汇报
- Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之NameNode端处理数据块增量汇报
- Hadoop-2.4.1源码分析--由HDFS心跳检测想到的Keepalived
- HDFS源码分析心跳汇报之数据结构初始化
- Hadoop心跳机制源码分析
- Hadoop心跳机制源码分析
- Hadoop心跳机制源码分析
- Hadoop心跳机制源码分析
- 【hadoop】 2006-hdfs源码分析下载初始化、下载过程
- Hadoop源码分析-HDFS
- HDFS源码分析心跳汇报之周期性心跳
- Hadoop-2.4.1源码分析--HDFS读取文件
- Hadoop源码分析之心跳机制
- Hadoop源码分析之心跳机制<转>
- Leetcode Maximum Subarray
- Xcode中的pch文件
- C语言标准
- Activity中保存状态和数据
- linux 分卷解压
- Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)数据结构初始化
- Handler机制
- Cocos2d-vs避免过长编译的小技巧
- 2016 计蒜之道 初赛 第二场(待补)
- c# list 委托排序
- Unix式图形化操作系统开发笔记0:前言
- 从netfilter的NF_IP_PRE_ROUTING抓包 和 用libpcap抓包有什么区别?
- gdi+ gdiplus创建保存动态gif动画成功 C++语言 有意者请联系我
- 毕业季随笔:一本书卖多少钱合适,7毛/公斤?