一、Scan 原理
scanAPI原理: 最常见的scan用法,见官方API文档。scan的原理之前在多篇文章中都有提及,为了表述方便,有必要在此简单概述一番。HBase中scan并不像大家想象的一样直接发送一个命令过去,服务器就将满足扫描条件的所有数据一次性返回给客户端。而实际上它的工作原理如下图所示:
- Scan 客户端
- Scan 服务端
参考: 源码解析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框架
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]
, 的确是走索引
0: jdbc:phoenix:> select PK, "lng" from MP where "lng" = 121.61598033795607;
63 rows selected (49.249 seconds)
- 查询计划, 可以看到
FULL SCAN OVER MP
,是扫描全表
创建异步索引
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
一般情况下当前索引表的状态是building状态的(可以在sqlline中使用 !table命令查看),只有当索引表状态变为active才算真正完成了索引构建。此时有两种解决方法:第一、通过alter index命令rebuild索引。第二、删除building状态的索引表,配置更大的客户端超时时间,重新创建索引。
5.2.2、索引表一直处于building状态 5.2.3、向hbase表中插入数据, 但是 phoenix中对应的映射视图, 没有数据更新- 解决 删除视图,重建,就有了。