六、HBase读取流程

1、HBase读取流程

流程分四步:

1.1、Client-Server读取交互逻辑

1.1.1、Client从ZK获取元素据所在的RS,然后查询元数数据找到key对应的目标RS,向目标RS发送请求

1.1.2、Client的scan请求或者get请求都可以看作是scan操作

1.1.3、因为有些scan会是全表扫描,结果非常大,如果Clien与Server之间的scan操作没有设计为一次RPC请求,而是多次RPC。在数据量大的情况下如果设计为一次RPC,会导致集群网络带宽等系统资源被大量占用,影响集群业务,同时客户端很有可能内存不够存不下所有结果导致OOM

1.1.4、每次RPC请求称为一次next请求,每次返回规定数量的结果,如下代码

Scan scan =  new Scan();

scan.setFilter(...);

...

scan.setMaxResultSize(1000);//一次RPC返回的数据量大小,默认是2G

scan.setCacheing(500); //数据条数 默认是Integer.MAX_VALUE

scan.setBatch(100);//一次RPC请求的列数,防止一张表有设置几万甚至几十万的列,这样一行数据就特别大。

ResultScanner rs = table.getScanner(scan);

for(Result r : rs){ ... } //for(Result r : rs) 等价于 Result r = rs.next();

1.2、构建Server端Scan框架体系《有点抽象》

RS收到请求之后做了两件事,一是构建scanner iteratore体系,然后执行next函数获取KeyValue,并对进行条件过滤。

1.2.1、Scanner的核心体系包括三层Scanner:RegionScanner,StoreScanner,MemStoreScanner和StoreFileScanner

1.3、过滤不符合条件的HFile

1.4、从HFile中读取待查找key《有难度》

1.4.1、根据HFile索引树定位到目标Block

1.4.2、BockCache中检索目标Block

1.4.3、HDFS文件中检索目标Block

2、深入理解Coprocessor(协同处理器)

2.1、Coprocessor类似于存储过程和触发器

2.2、Observer 触发器:提供钩子使用户代码在特定时间发生之前或者之后执行

HBase提供4种Observer接口

1)RegionObserver:主要监听Region相关的事件,比如get、put、scan、delete、flush等

2)RegionServerObserver:监听RS的启动、关闭、或者执行Region合并等

3)WALObserver:监听WAL写入、滚动等

4)MasterObserver:监听见表、删表以及修改表结构等

2.3、Endpoint 存储过程:比如业务需要从HBase集群加载出来几十亿行数据进行求和或者平均值。可以使用Endpoint将计算逻辑下推到RS执行。用户可以通过RPC调用执行部署在服务端的业务代码。

2.4、Coprocessor(协同处理器)加载方式

2.4.1、静态加载

1)将Coprocessor配置到hbase-site.xml中

2)将Coprocessor代码放到HBase的classpath下,对应的jar包放在HBase lib目录下

3)重启HBase集群

2.4.2、动态加载

2.4.2.1、使用shell

1)disable 'table'

2)alter 'table',METHOD=>'table_att','Coprocessor'=>'hdfs://.../coporecessor.jar| a.b.c.OberverExample "|"

3)endable 'table'

2.4.2.2、使用HTableDescriptor的setValue()方法

2.4.2.3、使用HTableDescriptor的addCoprocessor方法

你可能感兴趣的:(六、HBase读取流程)