结合源码分析HBase相关操作流程

来源:互联网 发布:张艺谋电影风格知乎 编辑:程序博客网 时间:2024/06/04 19:17
1、RegionServer打开region的过程:
  首先master给regionServer发出打开region的命令(AssignmentManager.assign)
          RegionOpeningState regionOpenState = ServerManager.sendRegionOpen(plan
            .getDestination(), state.getRegion(), versionOfOfflineNode);
   远程连接对应的regionserver,发送打开region的命令
  HRegionServer.openRegion--->ExecutorService.submit操作(Runable)-->OpenRegionHandler.process
   process的实现逻辑为,
      创建region对象,并初始化(检查.regioninfo文件--->遍历所有的store文件,创建并初始化store对象--->设置Hlog的seqNum<如果region中的store最大的seqNum比当前hlog中的seqNum大,则更改当前hLog的seqNum是最大的那个>)

 

2、HLog的读写过程

如果regionserver down, 如何判断哪些hlog中的信息没有flush到数据文件中
             ---hdfs中.logs下对于每个regionserver都有一个目录,结合该server下的所有region,对每个region stores中最大的seqNum和.logs做比较,找出来所有还没checkpoint的seqNum,后由master对清洗的logs进行split操作,copy到hdfs中的每个region的splitlogs目录下,那么后续新的regionserver打开该region的时候,会把这些split log replay到memstore中。

 

3、创建表,修改schema

客户端经过RPC HMasterInterface接口调用HMaster中的createTable接口,创建regioninfo(根据表名和指定的splitkey范围的数量)
提交ExecuteService,多线程并发执行创建表逻辑(在HDFS中创建表对应的目录,创建各个region的目录,创建regioninfo,创建region并初始化<创建Hlog对象--用在Region中所有region都相同,创建stores对象>,批量插入Region信息到META表中<调用HTable客户端API>,按照轮询算法往regionservers分配region<参见9>,并在zookeeper中标记该表为enable)

 

4、get、scan数据

HRegionServerInterface
从zookeeper中查找ROOT表所在的regionServer1,到该server1上根据table和key,查找ROOT表,找出META表中的region所在的Server2,到Server2上查找META表,根据table和key找出数据记录所在Region对一个的Server3,接下来到Server3查找即可。
    Result get(byte [] regionName, Get get),在Server内部,查找内存中的Region对象,并调用它的RegionScanner对象的next方法进行查找(next中存在缓存,下一次会从直接从缓存中取),最终遍历各个storeFile进行查找

 

5、insert,update数据

HRegionInterface
   put操作,(客户端代码的分析)关键是put操作的数据插入到该table中的regions中的哪一部分,每个region都是有范围的,根据key落在哪个范围中进行插入操作,如果超过region的大小限制,则进行相关的split操作
  update操作,查找所在的region,追加操作,major compact的时候进行合并操作
以上两种都需要记录WAL Log(应用----flush--->文件系统cache----sync---->文件硬盘存储)

 

6、分配region到RegionServer的过程分析

BulkAssign
  创建分配计划,即RegionServer和Regions的对应关系
 多线程并发进行分配,调用AssignmentManager.assign(regionserver, regions);
AssignmentManager创建分配计划,后按计划通过ServerManager远程调用RegionServer打开regions<参考1>,成功后更新META表。

 

7、complatebulkload的过程分析

先利用mapreduce生成一堆HFile,然后调用completebuikload加载到table中。
      LoadIncrementalHFiles.doBulkLoad(Path hfofDir, final HTable table),利用多线程根据HFile的startkey、endkey先把hfiles划分到各个region(startkey,endKey)中,可能要split hfile。
     多线程调用HRegionInterface. bulkLoadHFiles(List<Pair<byte[], String>> familyPaths, byte[] regionName)进行load
   load的过程是,调用region中的Store对象的bulkLoadHFile方法,在HDFS中的region目录下新建一个StoreFile,把原来的文件数据copy到这个StoreFile。更新META表。
  mapreduce的过程,main类Import,mapper(KeyValueImporter) reducer(KeyValueSortReducer)

     reduce的数量,有partiton决定region的数量决定的。

转自:http://blog.csdn.net/yangbutao/article/details/8309614

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 国土防线2没反应怎么办 镜之边缘迷路了怎么办? 陌陌直播不清晰怎么办 夏利n5 1.0费油怎么办 gg修改器是病毒怎么办 传送门骑士联机读条慢怎么办 被打成轻伤派出所不抓人怎么办 有人上门找事怎么办算正当防卫吗 win10 电脑账户被停用怎么办 电脑一键还原后黑屏怎么办 win一键还原后黑屏怎么办 打架对方群殴我我怎么办 杀了人没钱赔怎么办 团伙打架被对方所刀捅伤怎么办 过失致人重伤赔偿不起怎么办 被别人打了派出所不管怎么办 先动手的被打伤怎么办 自为伤了人怎么办? 孩子被打不敢还手怎么办 小孩给电打了怎么办 电打了手都黑了怎么办 手指被电打伤了怎么办 电打了手有点麻怎么办 没打人对方确弄个轻伤证明怎么办 对人造成轻伤害怎么办 如果有人要砍我怎么办 美版手机坏了怎么办 战地4ping太高怎么办 喝了红牛睡不着怎么办 球球大作战总是闪退怎么办解决方法 球球大作战手机号己绑定怎么办 弄的底窝中药味太大怎么办 锤子手机上不了网怎么办 ppt没保存就卡了怎么办 ppt卡了没保存怎么办 匡威鞋舌头跑偏怎么办 霍尼韦尔dcs cb锁死怎么办 谷歌身份验证器丢失 怎么办 叛乱2手雷没了怎么办 王者转移号封了怎么办? 电脑被入侵挖矿怎么办