Phoenix4.10中的大表异步索引创建实战是怎样的

Phoenix4.10中的大表异步索引创建实战是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

创新互联专注于网站建设,为客户提供网站建设、网站设计、网页设计开发服务,多年建网站服务经验,各类网站都可以开发,品牌网站制作,公司官网,公司展示网站,网站设计,建网站费用,建网站多少钱,价格优惠,收费合理。

概述:   

 Phoenix使用HBase作为后端存储,对于HBase来说,我们通常使用字典序的RowKey来快速访问数据,除此之外,也可以使用自定义的Filter来搜索数据,但是它是基于全表扫描的。而Phoenix提供的二级索引是可以避开全表扫描,是在HBase中快速查找或批量检索数据的另一个选择。

为什么使用异步索引?

   一般我们可以使用CREATE INDEX来创建一个索引,这是一种同步的方法。但是有时候我们创建索引的表非常大,我们需要等很长时间。经常会超时,为了防止超时我们可通过调整超时时间来处理,但是如果这个表非常大,无限制的增加超时时间就显得不太合理,Phoenix 4.5以后有一个异步创建索引的方式 :

    数据准备:

    1.phoenix新建表,

CREATE TABLE IF NOT EXISTS  ljs.testTable211 (id BIGINT not null primary key,order_code char(20),total_amount decimal(10,2),create_time date,user_id bigint);

    这里只是为了演示,我先导入了几条数据,一般你使用异步索引肯定是这个表的数据量比较大,不然就没必要用异步索引了:

upsert into ljs.testTable211 values(1, 'A001', 10.5, '2019-3-19 23:35:00', 1);upsert into ljs.testTable211 values(2, 'A002', 60.0, '2019-3-19 23:36:00', 2);upsert into ljs.testTable211 values(3, 'B001', 66.6, '2019-3-20 01:01:00', 3);upsert into ljs.testTable211 values(4, 'C001', 66.4, '2019-3-20 02:01:00', 3);

 异步索引大体分两步:

  1. 新建索引表,sql语句最后加上异步索引标识 ASYNC:

CREATE INDEX ljs.index2_testTable211 ON testTable211(order_code) INCLUDE(total_amount,create_time,user_id) ASYNC;

2.这时候创建的索引表中不会有数据,查询索引表验证下。

0: jdbc:phoenix:> select * from ljs.index2_testTable211;+---------------+------+-----------------+----------------+------------+| 0:ORDER_CODE  | :ID  | 0:TOTAL_AMOUNT  | 0:CREATE_TIME  | 0:USER_ID  |+---------------+------+-----------------+----------------+------------++---------------+------+-----------------+----------------+------------+No rows selected (0.204 seconds)0: jdbc:phoenix:>

3.你还需要用HBase自带的一个工具类

org.apache.phoenix.mapreduce.index.IndexTool,执行一条命令,后端会启动一个map reduce任务,只有等到这个任务结束,数据都被生成在索引表中后,这个索引才能被使用。启动工具的方法:

[hbase@salver31 ~]$ hbase org.apache.phoenix.mapreduce.index.IndexTool --schema ljs --data-table testTable211 --index-table index2_testTable211 --output-path /tmp/index_testTable211

参数解释:

    -schema   ljs  数据库名

    --data-table  testTable211  数据表名

    --output-path   mapreduce任务临时路径,可自定义

    --index-table  index2_testTable211 索引表名

执行完成后查看索引表,已经有了索引数据:

0: jdbc:phoenix:> select  * from  ljs.INDEX2_TESTTABLE211;+---------------+------+-----------------+--------------------------+------------+| 0:ORDER_CODE  | :ID  | 0:TOTAL_AMOUNT  |      0:CREATE_TIME       | 0:USER_ID  |+---------------+------+-----------------+--------------------------+------------+| A001          | 1    | 10.5            | 2019-03-19 23:35:00.000  | 1          || A002          | 2    | 6E+1            | 2019-03-19 23:36:00.000  | 2          || B001          | 3    | 66.6            | 2019-03-20 01:01:00.000  | 3          || C001          | 4    | 66.4            | 2019-03-20 02:01:00.000  | 3          |

4.这里查看对应的执行计划验证,下图的SQL走了索引,而不是全表扫描:

0: jdbc:phoenix:> explain select total_amount,create_time,user_id from  ljs.testTable211  where ORDER_CODE='A001';+-------------------------------------------------------------------------------------------------------------+|                                                    PLAN                                                     |+-------------------------------------------------------------------------------------------------------------+| CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN RANGE SCAN OVER LJS:INDEX2_TESTTABLE211 ['A001                ']  |+-------------------------------------------------------------------------------------------------------------+1 row selected (0.043 seconds)

5.至此,异步索引执行完成。

注意:

    这里一定要注意,异步索引比较繁琐,需要执行两步命令,后台会启动一个Mapreduce分布式任务向索引表插入数据,如果你的表数据很小完全没有必要用异步索引,启动Mapreduce任务的时间就赶上了小表索引创建时间,切记勿乱用!!!

关于Phoenix4.10中的大表异步索引创建实战是怎样的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


网站栏目:Phoenix4.10中的大表异步索引创建实战是怎样的
链接URL:http://cdiso.cn/article/jcgcpp.html

其他资讯