您的位置:首页 > 其它

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

2015-01-27 23:56 351 查看
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的数量决定的。

转自:/article/1384817.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: