region assign的流程补充
Master端:
1.regionserver下线,zk中注册的rs节点下的server子路径session过期被删除,
master触发RegionServerTracker.nodeDeleted监听事件,并调用ServerManager.expireServer
2.把下线的server添加到deadServers列表中,同时从onlineServers列表中移出此server,
3.触发ServerShutdownHandler.process方法,执行Hlog 的split操作。
4.通过AssignmentManager.assign执行region的分配操作,得到现在可用的所有servers
5.通过LoadBalancer.roundRobinAssignment把要分配的region平均到4中得到的可用servers中。
6.如果配置的balancer实现是FavoredNodeLoadBalancer,那么执行其getFavoredNodes,
得到每个region可转移的servers列表.
7.检查是否达到批量分配region条件,如果是,执行GeneralBulkAssigner.bulkAssign,否则直接使用assign
8.设置每一个region的状态为offline,同时在zk的region-in-transition中注册此region名称的子路径,
设置此路径的zk的event type 为M_ZK_REGION_OFFLINE,并生成一个RegionTransition添加到此节点的内容中
9.生成region的RegionPlan实例。并把RegionPlan添加到AssignmentManager.regionPlans列表中。
10.把region的assign状态更新为PENDING_OPEN状态
11.通过ServerManager.sendOpenRegion去请求regionserver的rpc连接,
并把连接存储到ServerManager.rsAdmin列表中,调用regionserver.openRegion方法开始执行openRegion
RegionServer端:
1.region server接收到openRegion的rpc请求,并解析出要open的所有的region列表
2.检查region是否在RegionServer.onlineRegions中存在,
同时meta表中此region在当前RegionServer.regionsInTransitionInRS中为非closing状态,
表示region已经在此server上存在,设置此region的响应状态为ALREADY_OPENED,执行下一个region open
3.region在当前server中不存在,添加region到regionsInTransitionInRS中,设置值为true
4.从RegionServer中的movedRegions列表中移出此region,
5.如果distributedLogReplay设置为true,检查此region在zk中的recovering-regions路径下是否存在,
如果存在,把region添加到recoveringRegions列表中。
5.1开始执行6与后面的其它流程,同时设置此region的响应状态为OPENED,执行下一个region open
6.此处开始异步执行,检查是否是meta region,如果是执行OpenMetaHandler,否则执行OpenRegionHandler
7.在zk中的region-in-transition路径下把eventtype的状态从M_ZK_REGION_OFFLINE设置为RS_ZK_REGION_OPENING
7.1:master中通过AssignmentManager.nodeDataChanged来处理zk中状态的修改,更新region状态为OPENING,
触发RegionStates.notify,
8.调用HRegion.openRegion来生成此region实例,openRegion最终调用HRegion.newHRegion,生成HRegion实例
9.调用HRegion实例的openRegion方法。openRegion-->initialize-->initializeRegionInternals
10.调用initializeRegionStores初始化加载region下所有的cf,开启线程调用instantiateHStore,
并加载每一个cf中的store file,
得到所有的store中所有的store file中最大的sequenceid与maxMemstoreTS,
初始化region mvcc的memstoreWrite/memstoreRead为最大的maxMemstoreTS+1
初始化此Hregion实例的next sequence id(openSeqNum)为最大的sequenceid+1
11.执行replayRecoveredEditsIfAny进行日志重播.得到一个replay后的最大seqid,
与region store加载得到sequenceid取最大值返回去计算next sequence id.
Replay会查找region是否存在recovered.edits路径,
如果distributedLogReplay设置为true,在region open时此路径不存在,因此region的open会相对很快。
12.如果设置有distributedLogReplay为true,同时recoveringRegions列表中包含此region(zk中存在)
设置HRegion实例的isRecovering=true,
13.执行OpenRegionHandler.updateMeta,生成并启动OpenRegionHandler.PostOpenDeployTasksThread线程
region的assign分配超时时间通过进行hbase.master.assignment.timeoutmonitor.timeout配置,
默认为600000ms
执行HRegionServer.postOpenDeployTasks方法,检查所有store是否需要做compact,并发起compact请求
如果是user region,更新meta表中此region的location信息,
主要是region所在的regionserver,当前region实例开启时的sequence id.
如果是meta region,更新zk中meta-region-server路径下的内容为当前的regionserver
14.更新zk中recovering-regions路径下region的last seqid,每一个store的last seqid.
15.从HRegionServer的regionsInTransitionInRS列表中移出此region,添加到onlineRegions列表中
16.把zk中region-in-transition路径下把eventtype的状态从RS_ZK_REGION_OPENING设置为RS_ZK_REGION_OPENED
16.1:master中通过AssignmentManager.nodeDataChanged来处理zk中状态的修改,更新region状态为OPEN,
把region对应的regionserver添加到RegionStates.lastAssignments中,触发RegionStates.notify,
生成一个OpenedRegionHandler实例,并执行其process处理,检查如果region的状态为open,
同时zk中此region的eventtype为RS_ZK_REGION_OPENED,删除zk中region-in-transition路径下此region的路径
16.2:master中更新region状态为open后会删除zk中此region的transition路径,
触发AssignmentManager.nodeDeleted处理。
从RegionStates.regionsInTransition中移出此region的transition,
在RegionStates.regionAssignments中添加此region对应的server
在RegionStates.serverHoldings中此server中添加此open成功的region
在AssignmentManager.regionPlans中移出此region对应的assign计划
- 浏览: 59747 次
- 性别:
- 来自: 西安
最新评论
-
gmd2009:
...
memstore的flush流程分析 -
hongs_yang:
iteye上好像格式没法复制过来。可以去csdn上看,那上面有 ...
memstore的flush流程分析 -
hongs_yang:
复制到word上去看,
memstore的flush流程分析 -
qindongliang1922:
注意格式擦
memstore的flush流程分析 -
hongs_yang:
可以有一些意见发表的,后期我会慢慢发布一些hadoop/yar ...
hbase put 流程分析regionserver端
相关推荐
对于Retain和Assign属性的理解
retain和copy还有assign的区别
针对iOS 对象的属性的关键字(retain/assign/readonly等)的区别。彻底解决您的疑惑。
详细讲解了ios中常用关键字的使用方法的区别,着重讲解了assign,retain,copy之间的区别
Cannot assign configuration entry 'pluginArtifacts' with value '${plugin.artifacts}' of type java.ut
非常好用的总结,Verilog中-reg和wire-用法和区别以及always和assign的区别
object-assign(c) Sindre Sorhus@license MIT
设备适配辅助性脚本
Assign1.py
Section 4.5.2.4.2 Assign Cable SOP* State is incorrect. Passive cables never respond on SOP” per USB PD. The change is to remove the sentence “If two eMarkers are powered at the same time in a ...
压缩包里有英文原版,还有本人经过两天不懈奋斗才翻译出来的中文版。谦虚使人进步,我承认里面会有些须错误,但不影响阅读。望谅解
这是将所有新问题自动分配给octocat用户的示例流程: name : Issue assignment on : issues : types : [opened] jobs : auto-assign : runs-on : ubuntu-latest steps : - name : ' Auto-assign issue ' ...
Assign6 solution.sql
icon_assign2
从matlab函数上摘出的匈牙利指派算法,可以用在二分图匹配、目标跟踪等多个领域。
assign3-源码.rar
这为Ember 2.5中添加的Ember.assign功能提供了一个polyfill。安装ember install ember-assign-polyfill用法import Ember from 'ember' ;var a = { first : 'Robert' } ;var b = { last : 'Wagner' } ;var c = { ...
前端开源库-es-object-assignES对象分配,模块友好的对象分配分支,ES2015
classification_NN_assign.m