Phoenix4.10中的大表異步索引創(chuàng)建實戰(zhàn)是怎樣的,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè),為客戶提供網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計開發(fā)服務(wù),多年建網(wǎng)站服務(wù)經(jīng)驗,各類網(wǎng)站都可以開發(fā),品牌網(wǎng)站制作,公司官網(wǎng),公司展示網(wǎng)站,網(wǎng)站設(shè)計,建網(wǎng)站費用,建網(wǎng)站多少錢,價格優(yōu)惠,收費合理。
概述:
Phoenix使用HBase作為后端存儲,對于HBase來說,我們通常使用字典序的RowKey來快速訪問數(shù)據(jù),除此之外,也可以使用自定義的Filter來搜索數(shù)據(jù),但是它是基于全表掃描的。而Phoenix提供的二級索引是可以避開全表掃描,是在HBase中快速查找或批量檢索數(shù)據(jù)的另一個選擇。
為什么使用異步索引?
一般我們可以使用CREATE INDEX來創(chuàng)建一個索引,這是一種同步的方法。但是有時候我們創(chuàng)建索引的表非常大,我們需要等很長時間。經(jīng)常會超時,為了防止超時我們可通過調(diào)整超時時間來處理,但是如果這個表非常大,無限制的增加超時時間就顯得不太合理,Phoenix 4.5以后有一個異步創(chuàng)建索引的方式 :
數(shù)據(jù)準(zhǔn)備:
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);
這里只是為了演示,我先導(dǎo)入了幾條數(shù)據(jù),一般你使用異步索引肯定是這個表的數(shù)據(jù)量比較大,不然就沒必要用異步索引了:
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);
異步索引大體分兩步:
新建索引表,sql語句最后加上異步索引標(biāo)識 ASYNC:
CREATE INDEX ljs.index2_testTable211 ON testTable211(order_code) INCLUDE(total_amount,create_time,user_id) ASYNC;
2.這時候創(chuàng)建的索引表中不會有數(shù)據(jù),查詢索引表驗證下。
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,執(zhí)行一條命令,后端會啟動一個map reduce任務(wù),只有等到這個任務(wù)結(jié)束,數(shù)據(jù)都被生成在索引表中后,這個索引才能被使用。啟動工具的方法:
[hbase@salver31 ~]$ hbase org.apache.phoenix.mapreduce.index.IndexTool --schema ljs --data-table testTable211 --index-table index2_testTable211 --output-path /tmp/index_testTable211
參數(shù)解釋:
-schema ljs 數(shù)據(jù)庫名
--data-table testTable211 數(shù)據(jù)表名
--output-path mapreduce任務(wù)臨時路徑,可自定義
--index-table index2_testTable211 索引表名
執(zhí)行完成后查看索引表,已經(jīng)有了索引數(shù)據(jù):
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.這里查看對應(yīng)的執(zhí)行計劃驗證,下圖的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.至此,異步索引執(zhí)行完成。
注意:
這里一定要注意,異步索引比較繁瑣,需要執(zhí)行兩步命令,后臺會啟動一個Mapreduce分布式任務(wù)向索引表插入數(shù)據(jù),如果你的表數(shù)據(jù)很小完全沒有必要用異步索引,啟動Mapreduce任務(wù)的時間就趕上了小表索引創(chuàng)建時間,切記勿亂用!?。?/p>
關(guān)于Phoenix4.10中的大表異步索引創(chuàng)建實戰(zhàn)是怎樣的問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。