phoenix 索引重建的三种方式
Phoenix索引重建的三种方式
1.Alter index语句
1.1 执行逻辑
alter index idx_table on main_table rebuild |
首先sql语句通过antlr解析后,生成ExecutableAlterIndexStatement执行句柄。
接下来要在MetaDataClient类中,进行索引的重建。
接着在客户端会发送sql语句将system.catlog表中的索引的状态修改为PIndexState.BUILDING状态。
接下来分为同步重建和异步重建。
同步重建,会将索引表中已经有的索引数据清空。
然后构造一个upsert select语句,从主表中查出数据然后插入到索引表中。
等到执行完成后,由客户端下发更新索引状态的sql,来修改状态。
异步重建,只修改了索引表的状态为building和building异步重建的时间戳UPDATE_INDEX_REBUILD_ASYNC_STATE。需要接下来执行IndexTool工具来重建。(后面会讲到这个时间戳的用处)
1.2 优缺点
同步重建客户端会一直等待,并且upsert select语句执行比较慢,而且同时消耗服务端大量的查询写入资源,会影响其他查询写入效率。
2.Index Tool 工具
2.1 执行逻辑
hbase org.apache.phoenix.mapreduce.index.IndexTool --data-table RUN_SUBCONLOT_STAGE_ECID --index-table IDX_RUN_SUBCONLOT_STAGE_ECID --output-path /user/mds/phoenix/idx_subconlot |
其中有一个参数"pr", "partial-rebuild"。该参数指定是否部分重建,默认是false,如果指定true,则从disable或者building状态的时间戳开始重建,此时就用到了第一种方法的alter index异步执行的时间戳。
工具是启动一个mapreduce任务,将数据表中的数据插入到索引中。
数据插入在map中进行,reduce只是修改了索引的状态为active。
2.2 优缺点
启动MR,需要消耗yarn资源。在大量数据进行索引补建的时候,建议使用此方法。
3. 自动补建索引
3.1 执行逻辑
自动补建索引线程在system.catlog表的第一个region上启动,每隔30分钟跑一次,参数可配。
扫描所有数据表的索引表状态,状态为disable,和inactive的才进行补建。
并且会检测索引表的所有region是否上线,如果有不上线的也不进行补建。
还要检测索引disable时间距离当前时间是否超过半小时(可配),超过了也不补建。
从disable时间戳开始算起,到当前时间扫描。
构造scan扫描数据表,在rs的cp上进行索引数据的插入。
3.2 优缺点
自动补建索引机制,限制太多,比如只补建disable和inactive状态下的索引。
补建是顺序同步补建,如果disable状态的索引表太多,补建将会很慢。
- 点赞
- 收藏
- 关注作者
评论(0)