您好,登錄后才能下訂單哦!
本篇內容主要講解“Hbase二級索引怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Hbase二級索引怎么實現”吧!
apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz
hadoop-2.9.2.tar.gz
hbase-2.0.5-bin.tar.gz
Hbase中通過非rowkey查詢數據查詢速度會很慢
在Hbase中要想精確查詢一條數據所以必須使用rowkey,如果不通過rowkey查詢數據,就必須逐行逐列的比較(即全表掃描),效率很低. 實際業務中需要通過多個維度快速查詢數據. 例如查詢用戶的時候可能需要通過用戶名,姓名,郵箱,手機號查詢,但是把這種多維度的查詢字段都放到rowkey中,顯然是不可能的(靈活性不高,roekey的長度也是有限制的),因此二級索引的應用場景就應運而生,Phoenix已經提供了對HBase的二級索引支持支持。
Global indexing 全局索引,適用于讀多寫少的場景
使用Global indexing在寫數據的時候開銷很大,因為所有對數據表的更新操作(DELETE, UPSERT VALUES and UPSERT SELECT),都會引起索引表的更新,而索引表是分布在不同的數據節點上的,跨節點的數據傳輸帶來了較大的性能消耗。在讀數據的時候Phoenix會選擇索引表來降低查詢消耗的時間。在默認情況下如果想查詢的字段不是索引字段的話索引表不會被使用,也就是說不會帶來查詢速度的提升。
Local indexing 本地索引,適用于寫多的場景
與Global indexing一樣,Phoenix會自動判定在進行查詢的時候是否使用索引。使用Local indexing時,索引數據和數據表的數據存放在相同的服務器中,這樣避免了在寫操作的時候往不同服務器的索引表中寫索引帶來的額外開銷。使用Local indexing的時候即使查詢的字段不是索引字段索引表也會被使用,這會帶來查詢速度的提升,這點跟Global indexing不同。對于Local Indexing,一個數據表的所有索引數據都存儲在一個單一的獨立的可共享的表中。
immutable indexing 不可變索引,適用于數據只增加不更新,而且按時間順序先后循序存儲.
不可變索引的存儲方式是write one,append only。當在Phoenix使用create table語句時指定IMMUTABLE_ROWS = true表示該表上創建的索引將被設置為不可變索引。Phoenix默認情況下如果在create table時不指定IMMUTABLE_ROW = true時,表示該表為mutable。不可變索引分為Global immutable index和Local immutable index兩種。
mutable indexing 可變索引,適用于數據有增刪的的場景
Phoenix默認情況下創建的索引是可變索引,除非指定 IMMUTABLE_ROW=true
vim vim hbase-2.3.1/conf/hbase-site.xml
<property> <name>hbase.regionserver.wal.codec</name> <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value> </property>
>create table user1( id varchar(10) primary key, f.name varchar(100), f.pass varchar(100), f.grp varchar(10), f.type varchar(5), f.types varchar(2), f.code varchar(10), f.uname varchar(20), f.email varchar(20), f.factory varchar(10), f.depart varchar(10), f.region varchar(10) )column_encoded_bytes=0; > create index user_name on user(name); //查詢索引 > !indexes user
> drop index user_name on user;
create index user_name on user; //默認可變索引
//創建索引 > create index user_name on user; //*這樣查詢是不會走索引的 > select * from user where name='rumenz'; > explain select * from user where name='rumenz'; //FULL SCAN OVER USER SERVER FILTER BY F.NAME = //查詢字段和索引字段保持一致就可以用到索引 > select name from user where name='rumenz'; > explain select name from user where name='rumenz'; //CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN RANGE SCAN OVER USER_NAME SERVER FILTER BY FIRST KEY ONLY
create local index user_name on user1(name); //創建本地索引
//*這樣查詢就會走索引 > select * from user where name='rumenz'; > explain select * from user where name='rumenz'; //使用到了索引 //ROUND ROBIN RANGE SCAN OVER USER1
converted index //相當于一個聯合索引
> create index user_name1 on user1(name) include(pass); //只有當name,pass在查詢字段出現時,才會用到索引:比如 //select name from user1 where name=''或者 pass=''; //select pass from user1 where name=''或者 pass=''; //select name,pass from user1 where name=''或者 pass='';
在select和column_name之間加上/*+ Index(<表名> <index名>)*/
,通過這種方式強制使用索引。
> select /*+ index(user1,USER_NAME) */ pass from user1 where name='xxx'; //1.如果pass是索引那么從索引表查詢. //2.如果pass不是索引,那么會進行全表掃描會很慢.
> alter index USER_NAME on user1 rebuild;
1. index.builder.threads.max 創建索引時,使用的最大線程數。 默認值: 10。 2. index.builder.threads.keepalivetime 創建索引的創建線程池中線程的存活時間,單位:秒。 默認值: 60 3. index.writer.threads.max 寫索引表數據的寫線程池的最大線程數。 更新索引表可以用的最大線程數,也就是同時可以更新多少張索引表,數量最好和索引表的數量一致。 默認值: 10 4. index.writer.threads.keepalivetime 索引寫線程池中,線程的存活時間,單位:秒。 默認值:60 5. hbase.htable.threads.max 每一張索引表可用于寫的線程數。 默認值: 2,147,483,647 6. hbase.htable.threads.keepalivetime 索引表線程池中線程的存活時間,單位:秒。 默認值: 60 7. index.tablefactory.cache.size 允許緩存的索引表的數量。 增加此值,可以在寫索引表時不用每次都去重復的創建htable,這個值越大,內存消耗越多。 默認值: 10 8. org.apache.phoenix.regionserver.index.handler.count 處理全局索引寫請求時,可以使用的線程數。 默認值: 30
到此,相信大家對“Hbase二級索引怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。