HBase-Region分配

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

HBase中Region分配问题的探讨在HBase的cluster中,Region是如何分配这个问题,困扰了我很久,经过代码分析和调试,得出了一些见解,缺点和错误请大家批评指正。在Region分配过程中,起着重要作用有如下一些对象。HMaster—是HBase中的Masterserver,仅有一个。HRegionServer—负责多个HRegion使之能向client端提供服务,在HBasecluster中存在多个HRegionServer。ServerManager—负责管理Regionserver信息,比如每个Regionserver的HServerInfo(这个对象包含HServerAddress和startCode),已loadRegion个数,死亡的Regionserver列表RegionManager—负责将region分配到regionserver的具体工作,还有监视root和meta这2个特殊region的状态。RootScanner—定期扫描rootregion,以发现没有分配的metaregion。MetaScanner—定期扫描metaregion,以发现没有分配的userregion。这些对象的关系如下图所示:+regionServerStartup()+regionServerReport()接口HMasterRegionInterface+reportForDuty()HRegionServerHMaster+regionServerStartup()+regionServerReport()+processMsgs()+assignRegionsToMultipleServers()ServerManager+assignRegions()+regionsAwaitingAssignment()+loadBalancer()+regionsToGiveOtherServers()+computeNextHeaviestLoad()RegionManager+checkAssigned()RootScanner+checkAssigned()MetaScanner-结束11-结束21-结束31-结束41-结束51-结束61-结束71-结束81-结束9*-结束10*Region分配过程Rootregion的分配HMaster起动时,首先会通过RegionManager把rootRegionLocation(里面包含HServerAddress)的值置为null,然后把rootregion从待处理region列表中移除(如果有的话),然后重新将其放入待处理region列表(regionsInTransition),并将其状态设置为UNASSIGNED(未分配).当一个Regionserver启动完成时,它会调用reportForDuty函数向HMaster报告它的启动,报告当然是通过HMasterRegionInterface的regionServerStartup方法。然后HMaster会把Regionserver的报告转交给ServerManager的regionServerStartup方法处理。ServerManager会将这个新的RegionServer加入regionserver列表并且把它的serverload设为空闲的。RegionServer会定期发送报告给HMaster,请求HMaster进一步的指示。发送报告是通过HMasterRegionInterface的regionServerReport方法。HMaster接到报告后,移交报告给ServerManager的regionServerReport方法处理。ServerManager会查询regionServer的状态,得到一个HServerInfo对像,然后检查RegionServer是否为正常的。如果为正常的话,ServerManager会查询regionserver的负载(HServerLoad),更新一个loadToServers的map。然后进入ServerManager的processMsgs函数处理。ServerManager会检查该regionServer的已经打开的region的数目,如果打开的region数目少于一个固定的值(对应配置文件中的hbase.regions.nobalancing.count),然后就会调用RegionManager的assignRegions方法。RegionManager会向ServerManager查询,现在已启动的RegionServer有几个,如果只有一个的话,会做特别处理。然后RegionManager调用自己的regionsAwaitingAssignment方法去取得等待分配的region集合。它先会特别考虑rootregion,如果它查到rootregion尚未被分配,它会马上返回只包含rootregion的集合。如果没有任何region未分配的话而且并未处在安全模式,RegionManager会让loadBalancer执行负载均衡的动作(就是可能把该regionserver负责的region分一点出去)。反之如果有待分配的region,serverManager会调用自己的assignRegionsToMultipleServers方法。在assignRegionsToMultipleServers中,参数regionsToAssign是所有待分配的region集合,因为存在多个regionServer,所以regionManager会考虑到多个regionServer的负载。regionManager会先调用regionsToGiveOtherServers方法,求出其他regionServer(比如相对负载较轻的)应该承载的region数目,那么当前regionServer可能承载的region个数就是待分配的region总数目减去其他regionServer应该承载的region数目,这个数量我们暂称之为N。如果N=0并且MetaRegion如果已被分配的话,该regionServer会被略过,不会被要求承载region。因为比当前regionServer的负载轻的regionServer个数超过了待分配的region个数,轮不到当前的regionServer。看起来快水落石出了,但是剩下事情还有点复杂。regionManager还会调用computeNextHeaviestLoad方法,算出cluster中有多少regionServer超过当前的regionServer,这个数目我们暂称之为NS,同时该方法会抓出负载最重的server的负载。接着regionManager会求出当前regionServer负责的region数目和负载最重的regionServer负责的region数目之间的差值。如果这个差值大于N,那么这N个region将全部会交由当前regionServer负责。反之这个差值小于N,如果NS大于零,当前regionServer要被分配的region数量为(int)Math.ceil(1.0*N/1.0*NS),如果NS等于零,那么当前regionServer要被分配region的数量为(int)Math.ceil(1.0*N/1.0*regionServer总数)。然后rootregion就会被分配到该RegionServer上。这里特别要提下:如果有多个regionserve存在,HBase不会把rootregion和metaregion分配到一个RegionServer上(在事实的例子中会将两个分配到同一个RegionServer上的)。Metaregion的分配一旦rootregion被分配完成,RootScanner线程将被唤醒。然后它会scanrootregion。在scan过程中,碰到每个metaregion条目,它会调用checkAssigned函数检查该metaregion是否被分配,如果没有的话,regionManager将会记录之,把该region加入待分配的region列表中。一旦有RegionServer定期报告来了,metaregion会像rootregion一样的方式被分配。Userregion的分配一旦metaregion被分配完成,MetaScanner将被唤醒,然后它会scanmetaregion。在scan过程中,碰到每个userregion条目,它会调用checkAssigned函数检查,该userregion是否被分配,如果没有的话,regionManager将会记录之,把该region加入待分配的region列表中。一旦有RegionServer定期报告来了,userregion会被分配。

1 / 3
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功