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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值