读流程方法流程解析:
如果是集群hbase,先从zk中获取/hbase/meta-region-server获取hbase:meta所在的regionserver
至于为什么是meta-region-server是因为hbase-site.xml默认的属性zookeeper.znode.metaserver,值就是meta-region-server
locateRegionInMeta()------------>从hbase:meta元数据中定位区域
createRegionName()--------------->return myHbase:t1,row3,99999999999999
开启子线程去获取meta元数据信息(元数据如下)并且阻塞get主线程,获取meta信息是通过Scan方式去获取,setCaching(1),缓存一行的数据,也就是下面第二分区4列的数据
第一分区:
column=info:regioninfo, timestamp=1590762538499, value={ENCODED => bb202802124ea1eaac4b4292c363f54a, NAME => 'myHbase:t1,,1586785632432.bb202802124ea1eaac4
b4292c363f54a.', STARTKEY => '', ENDKEY => 'row0088888'}
column=info:seqnumDuringOpen, timestamp=1590762538499, value=\x00\x00\x00\x00\x00\x00\x00a
column=info:server, timestamp=1590762538499, value=s204:16020
column=info:serverstartcode, timestamp=1590762538499, value=1590762476841
第二分区:
column=info:regioninfo, timestamp=1590762545619, value={ENCODED => 5934677b5771e70d796df4356498debc, NAME => 'myHbase:t1,row0088888,1586780613717.5934677b5
771e70d796df4356498debc.', STARTKEY => 'row0088888', ENDKEY => ''}
column=info:seqnumDuringOpen, timestamp=1590762545619, value=\x00\x00\x00\x00\x00\x00\x00`
column=info:server, timestamp=1590762545619, value=s203:16020
column=info:serverstartcode, timestamp=1590762545619, value=1590762475832
获取到之后唤醒主线程继续执行get的方法,
client端
HConnectionManager
HRegionInfo
HTable
server端
流程:RpcServer:开启listen、responser、scheduler(simpleRpcScheduler(根据任务来分别调用优先级调度器、副本调度器、通用调度器)、fifo任务调度器)去执行
组件
HRegionServer(包含多个HRegion)
HRegion(包含多个HStore和一个Hlog)
HLog :记录数据的所有变更,可以用来做数据恢复。
HStore(一个store由多个storefile和一个memstore组成)每一个Store对应一个列簇
StoreFile(包含一个HFile,是对HFile的封装)
HFile:去和底层的hdfs交互,写入和读取操作(read/write)
MemStore:
DefaultMemStore:也就是本地链表缓存,采用的是跳表ConcurrentSkipListMap()其优点是在高并发下其插入和查找的性能都很好,复杂度log(n),而且key是有序的
HFileScanner
ClientProtos:客户端协议处理请求 大致分为5种:
1、MultiRequest:多方式请求
2、BulkLoadRequest:这个是是导入数据,性能很高
3、ScanRequest:一种全表查询方式,可设置setCaching、setBatch、Filter等方法,实现复杂查询
4、GetRequest:查询指定行的数据
5、MutateRequest:就是插入操作,put()
ClientProtos.ClientService.callBlockingMethod(MethodDescriptor method, RpcController controller, Message request) throws ServiceException {
if (method.getService() != ClientProtos.ClientService.getDescriptor()) {
throw new IllegalArgumentException("Service.callBlockingMethod() given method descriptor for wrong service type.");
} else {
switch(method.getIndex()) {
case 0:
return RSRpcServices.get(controller, (ClientProtos.GetRequest)request);
case 1:插入
return RSRpcServices.mutate(controller, (ClientProtos.MutateRequest)request);
case 2:
return RSRpcServices.scan(controller, (ClientProtos.ScanRequest)request);
case 3:
return RSRpcServices.bulkLoadHFile(controller, (ClientProtos.BulkLoadHFileRequest)request);
case 4:
return RSRpcServices.execService(controller, (ClientProtos.CoprocessorServiceRequest)request);
case 5:
return RSRpcServices.execRegionServerService(controller, (ClientProtos.CoprocessorServiceRequest)request);
case 6:
return RSRpcServices.multi(controller, (ClientProtos.MultiRequest)request);
default:
throw new AssertionError("Can't get here.");
}
}
RPCClientImpl.call()
HBase读取数据流程
1、Client先访问zookeeper,从zookeeper中找到meta表region的位置,然后读取meta表中的数据。meta中又存储了用户表的region信息。
2、根据namespace、表名和rowkey在meta表中找到对应的region信息
3、找到这个region对应的regionserver
4、查找对应的region
5、先从MemStore找数据,如果没有,再到StoreFile上读(为了读取的效率)。