大家好,我是不溫卜火,是一名計算機學院大數據專業大二的學生,暱稱來源於成語—
不溫不火
,本意是希望自己性情溫和
。作爲一名互聯網行業的小白,博主寫博客一方面是爲了記錄自己的學習過程,另一方面是總結自己所犯的錯誤希望能夠幫助到很多和自己一樣處於起步階段的萌新。但由於水平有限,博客中難免會有一些錯誤出現,有紕漏之處懇請各位大佬不吝賜教!暫時只有csdn這一個平臺,博客主頁:https://buwenbuhuo.blog.csdn.net/
此篇爲大家帶來的是一文教你如何在Phoenix中創建 HBase 二級索引。
一. HBase 的二級索引
在前面的學習中, 我們知道 HBase 只能通過 rowkey 進行搜索, 一般把 rowkey 稱作一級索引. 在很長的一段時間裏 HBase 就只支持一級索引.
HBase 裏面只有 rowkey 作爲一級索引, 如果要對庫裏的非 rowkey 字段進行數據檢索和查詢, 往往要通過 MapReduce/Spark 等分佈式計算框架進行,硬件資源消耗和時間延遲都會比較高。
爲了 HBase 的數據查詢更高效、適應更多的場景, 諸如使用非 rowkey 字段檢索也能做到秒級響應,或者支持各個字段進行模糊查詢和多字段組合查詢等, 因此需要在 HBase 上面構建二級索引, 以滿足現實中更復雜多樣的業務需求。
從 0.94 版本開始, HBase 開始支持二級索引.
HBase 索引有多種放方案, 我們今天要做的是使用 Phoenix 給 HBase 添加二級索引.
二. 配置 HBase 支持 Phoenix 創建二級索引
需要先給 HBase 配置支持創建二級索引
- 1. 添加如下配置到 HBase 的 Hregionerver 節點的 hbase-site.xml
[bigdata@hadoop002 conf]$ vim hbase-site.xml
<!-- phoenix regionserver 配置參數 -->
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
<property>
<name>hbase.region.server.rpc.scheduler.factory.class</name>
<value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value>
<description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>
<property>
<name>hbase.rpc.controllerfactory.class</name>
<value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>
<description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>
- 2. 添加如下配置到 HBase 的 Hmaster 節點的 hbase-site.xml
<!-- phoenix master 配置參數 -->
<property>
<name>hbase.master.loadbalancer.class</name>
<value>org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer</value>
</property>
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.phoenix.hbase.index.master.IndexMasterObserver</value>
</property>
- 3. 測試是否支持
準備數據:
create table user_1(id varchar primary key, name varchar, addr varchar)
upsert into user_1 values ('1', 'zs', 'beijing');
upsert into user_1 values ('2', 'lisi', 'shanghai');
upsert into user_1 values ('3', 'ww', 'sz');
默認情況下, 只要 rowkey 支持索引(就是上面的 id)
其他字段是不支持索引的:
給 name 字段添加索引:
create index idx_user_1 on user_1(name)
注意: 這種索引, 對 name 創建的索引, 則查詢的時候也必須只查詢 name 字段.
三. Phoenix 創建索引
1. Phoenix 索引分類
Phoenix 索引分全局索引和局部索引
- 1. 全局索引
global index 是默認的索引格式。
適用於多讀少寫的業務場景。寫數據的時候會消耗大量開銷,因爲索引表也要更新,而索引表是分佈在不同的數據節點上的,跨節點的數據傳輸帶來了較大的性能消耗。
在讀數據的時候 Phoenix 會選擇索引表來降低查詢消耗的時間。
如果想查詢的字段不是索引字段的話索引表不會被使用,也就是說不會帶來查詢速度的提升。
創建全局索引的方法:
CREATE INDEX my_index ON my_table (my_col)
- 2.局部索引
local index 適用於寫操作頻繁的場景。索引數據和數據表的數據是存放在相同的服務器中的,避免了在寫操作的時候往不同服務器的索引表中寫索引帶來的額外開銷。
查詢的字段不是索引字段索引表也會被使用,這會帶來查詢速度的提升。
創建局部索引的方法(相比全局索引多了一個關鍵字 local):
CREATE LOCAL INDEX my_index ON my_table (my_index)
- 3. Local index 和 Global index區別:
Local index 由於是數據與索引在同一服務器上,所以要查詢的數據在哪臺服務器的哪個region是無法定位的,只能先找到region然後再利用索引。
Global index 是一種分佈式索引,可以直接利用索引定位服務器和region,速度更快,但是由於分佈式的原因,數據一旦出現新增變化,分佈式的索引要進行跨服務的同步操作,帶來大量的通信消耗。所以在寫操作頻繁的字段上不適合建立Global index。
2. 創建索引總結
- 1. 創建全局索引, 也支持查詢其他字段
CREATE INDEX my_index ON my_table (v1) INCLUDE (v2)
SELECT v2 FROM my_table WHERE v1 = 'foo'
- 2. 創建局部索引
CREATE LOCAL INDEX my_index ON my_table (v1)
- 3. 刪除索引
DROP INDEX my_index ON my_table
本次的分享就到這裏了,
好書不厭讀百回,熟讀課思子自知。而我想要成爲全場最靚的仔,就必須堅持通過學習來獲取更多知識,用知識改變命運,用博客見證成長,用行動證明我在努力。
如果我的博客對你有幫助、如果你喜歡我的博客內容,請“點贊” “評論”“收藏”
一鍵三連哦!聽說點讚的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看。
碼字不易,大家的支持就是我堅持下去的動力。點贊後不要忘了關注
我哦!