一:問題由來
1.舉例
有A列與B列,分別是年齡與姓名。
如果想通過年齡查詢姓名。
正常的檢索是通過rowkey進行檢索。
根據年齡查詢rowkey,然后根據rowkey進行查找姓名。
這樣的效率不高,因為要兩次scan。
2.建議有一張索引表。
二:HBase的二級索引
1.講解
rowkey是uid+ts
11111_20161126111111:
這個rowkey方便查詢某一uid的某一個時間段內的數據
問題:
查詢某一時間段內所有用戶的數據:按照時間
索引表
rowkey:ts+uid 20161126111111—111111
其他列:info:uid
值是uid+ts,因為這個是原表的rowkey。
檢索流程:
從索引表中根據時間段來查詢源表rowkey
根據rowkey來查詢源表
2.還有的問題
如何保持索引表與原表的同步問題。
好的方式是:編寫協處理器,將客戶端實現的邏輯代碼放到服務端。
同時,可以使用其他的框架,主要有solr,phoenix。elassearch。
3.協處理器
observer處理器:觀察者,類似於觸發器
endpoint類:終端類,類似於儲存過程。
4.hbase自帶的協處理器
這個在hbase:meta中
可以通過desc 'hbase:meta'進行查看
是coprocessor$1。
三:phoenix的安裝
1.上傳源碼包
因為對應的hbase0.98.6沒有對應的phoenix,所以需要自己進行編譯。
2.解壓到modules文件夾下
tar -zxvf phoenix-4.2.2-src.tar.gz -C /etc/opt/modules/
3.修改pom.xml文件
有一個問題,將所有的hadoop-two.version 變量都換成2.5.0
<hbase.version>0.98.6-hadoop2</hbase.version>
<hadoop-two.version>2.5.0</hadoop-two.version>
4.進入主目錄
5.編譯
mvn clean package -DskipTests
----------------------------------------------------(以下需要重新編譯,重新做)------------------------------------------------------------
6.查找編譯好的包
Phoenix_home/Phoenix-assembly/target/phoenix-4.2.2.tar.gz
7.安裝phoenix
啟動的時候,后面跟的是zookeeper地址。
8.phoenix映射原有的表
執行的語句,在phoenix中。
hbase對於大小寫敏感,然后需要將phoenix中的語句進行雙引號引起來。
9.看效果
可以在phoenix中查詢映射的表。
select * from "s1";
將會發現,這里的數據與hbase中的數據相同。