一、Scan 原理
scanAPI原理: 最常见的scan用法,见官方API文档。scan的原理之前在多篇文章中都有提及,为了表述方便,有必要在此简单概述一番。HBase中scan并不像大家想象的一样直接发送一个命令过去,服务器就将满足扫描条件的所有数据一次性返回给客户端。而实际上它的工作原理如下图所示:
1.1、源码系列
- Scan 客户端
- Scan 服务端
二、Filter
参考: 源码解析Filter的流程
Filter:运行在服务器端,
RegionScannerImpl中的nextInternal(int limit)方法中进行调用
private boolean nextInternal(int limit) throws IOException {
while (true) {
byte [] currentRow = peekRow();
if (isStopRow(currentRow)) {
if (filter != null && filter.hasFilterRow()) {
filter.filterRow(results);
}
if (filter != null && filter.filterRow()) {
results.clear();
}
return false;
} else if (filterRowKey(currentRow)) {
nextRow(currentRow);
}
三、协处理器
参考:
https://www.cnblogs.com/liuwei6/p/6837674.html
加载问题
四、phoenix 原理
Phoenix通过以下方法来奉行把计算带到离数据近的地方的哲学:
-
协处理器
在服务端执行操作来最小化服务端和客户端的数据传输 -
定制的过滤器
为了删减数据使之尽可能地靠近源数据并最小化启动代价,Phoenix使用原生的HBase APIs而不是使用Map/Reduce框架
五、phoenix安装
5.1、配置
5.1.1、Phoenix 索引重建操作
5.1.2、Phoenix 索引生命周期
查询
1.1、对创建索引列查询
0: jdbc:phoenix:> select PK, "lat" from MP where "lat" = 28.28184750074689;
44 rows selected (0.219 seconds)
- 查询计划, 可以看到
RANGE SCAN OVER IDX_MP_LAT [28.282], 的确是走索引
1.2、对未建索引列查询
0: jdbc:phoenix:> select PK, "lng" from MP where "lng" = 121.61598033795607;
63 rows selected (49.249 seconds)
- 查询计划, 可以看到
FULL SCAN OVER MP,是扫描全表
1.3、查询条件中包括rowkey, 查询更加高效
1.4、 通过 phoenix API 查询
1.4.1、创建索引
创建异步索引
create index IDX_MP_LAT on MP("b"."lat") ASYNC;
加载索引
hbase org.apache.phoenix.mapreduce.index.IndexTool --data-table MP --index-table IDX_MP_LAT --output-path /apps/hbase/data/data/default/IDX_MP_LAT
主键与字段配合
1.4.2、MP表没有创建索引, 根据主键,以及字段
phoenix 分页
5.2、问题
5.2.1、创建索引由于时间太长,客户端断开了链接怎么办?
一般情况下当前索引表的状态是building状态的(可以在sqlline中使用 !table命令查看),只有当索引表状态变为active才算真正完成了索引构建。此时有两种解决方法:第一、通过alter index命令rebuild索引。第二、删除building状态的索引表,配置更大的客户端超时时间,重新创建索引。
5.2.2、索引表一直处于building状态
5.2.3、向hbase表中插入数据, 但是 phoenix中对应的映射视图, 没有数据更新
- 解决 删除视图,重建,就有了。
