结合源码分析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
首先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
相关文章推荐
- 结合源码分析HBase相关操作流程
- HBase1.0.0源码分析之请求处理流程分析以Put操作为例(一)
- Hbase-0.98.6源码分析--Put写操作Client端流程
- HBase1.0.0源码分析之请求处理流程分析以Put操作为例(二)
- Hbase-0.98.6源码分析--Put写操作HRegionServer端流程
- HBase 0.1.0版本源码分析--Master启动流程
- Hbase 源码分析四 - Get 流程及rpc原理
- struts2 处理请求流程分析(结合源码)
- struts2 处理请求流程分析(结合源码)1
- ceph源码分析之读写操作流程(2)
- HBase 0.1.0 Get流程源码分析
- hbase0.98 源码分析-读数据流程
- struts2 处理请求流程分析(结合源码)3
- struts2 处理请求流程分析(结合源码)1
- Android Loader(三) 结合CursorLoader分析Loader相关源码
- Hbase 源码分析4 - Get 流程及rpc原理
- struts2 处理请求流程分析(结合源码)3
- 结合源码分析Solr&Lucene查询打分的工作流程
- Libevent源码分析-----与event相关的一些函数和操作
- Hbase 源码分析之 Get 流程及rpc原理