hbase面试题


读流程方法流程解析:
如果是集群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上读(为了读取的效率)。

你可能感兴趣的:(hbase)