淺談Hbase與中間的一些設計策略
前面的文章初入Hadoop生態系統裡面有涉及到Hbase的一些特點和資料模型,這裡來著重談談Hbase和其中的一些設計策略。
回顧
Hbase是一個分散式的面向列的開源資料庫 rowKey決定Region(區域),columnFamily(列族)決定HFile,並且由於Hbase的多版本性,不同的HFile也有不同的Timestamp區間,所以在查詢時,指定columnFamily將大大提高查詢效率,因為決定了讀取的HFile個數,如果指定Timestamp也可以進一步對HFile進行過濾。 HFile是Hbase中key-value資料的儲存格式。
Hbase的實現包括三個主要功能元件
-
庫函式:
連結到每個客戶端。 -
一個Master主伺服器:
主要負責均衡。 管理使用者對Table的增刪改查等操作管理RegionServer的負載均衡,調整Region分佈
在Region Split後負責新的Region的分配 RegionServer停機後,負責失效RegionServer上的Region遷移
-
多個Region伺服器:
負責儲存和維護分配給自己的Region,處理客戶端的讀寫。
客戶端不需要通過Master,直接通過Zookeeper來獲得Region位置資訊,然後直接從Region伺服器獲取資料,這種設計方式使得Master負載小。
Region開始只有一個,後面不斷分裂、拆分非常快,原因是拆分時只需要修改指向配置,直到後臺啟動合併過程把儲存檔案非同步寫到獨立檔案之後,才會讀取新檔案。是由Master來完成。
Hbase架構

客戶端讀寫資料的過程 快取的重新整理 StoreFile的合併 Store HLog BlockCache 資料恢復
Hbase中特殊的兩張Table
-ROOT-: .META.:
目前Region最佳大小建議1GB-2GB,每個Region服務10-1000個Region。
客戶端與Hbase互動步驟
多次的網路操作,客戶端會做Cache快取,加速定址,如圖:

表的設計
Hbase主要有兩種表設計風格
Flat-Wide表: Tall-Narrow表:
如果查詢模式以scan(掃描)為主可以把表設計成Tall-Narrow型別,如果查詢模式以get為主可以把表設計成Flat-Wide型別
scan:
掃描整表,如上所述,如果是Tall-Narrow表,可以考慮在rowkey的設計上考慮,因為scan是可以模糊匹配的。 get:
獲取資料,如果是Flat-Wide型別,獲取的資料基本上是根據列族來分類的,get可以指定到某個列族以及還可以細化到Timestamp。
行的設計
因為Hbase只能在行鍵上建立索引,行鍵結構很重要,所以應該基於預期的訪問模式來為行鍵建模。Hbase表是有序特性,行鍵是按照字典序儲存的,所以基於IO的考慮在設計的時候從兩個方面入手
-
為寫優化:
犧牲讀模式的效率,把資料分散到多個Region上,在大量資料寫入的時候,就不會導致像使用時間戳做行鍵那樣遭遇單個Region的熱點問題。雜湊:使用MD5等提供隨機分佈的雜湊函式。
salting:時間戳前面加上一個隨機數字首,可以用RegionServer的數量取模來生產隨機salt數。(salt方法,就是加點“佐料”)
-
為讀優化:
可以使用倒序時間戳(long.Max_value-時間戳),然後附上使用者ID來構成行鍵,這樣就可以基於使用者ID掃描N行就能找到使用者需要的n條最新資訊了。
列族的設計
-
列族儘量少:
最好不超過三個,每個列族存在一個獨立的HFile裡,flush和compaction操作都是針對一個Region進行的,當資料很多的列族需要flush的時候,其它列族即使資料很少也需要flush,這樣就產生大量不必要的io操作。flush,compaction主要起的幾個作用是: 合併檔案--清除過期多餘版本的資料--提高讀寫效率。
-
多列族時:
注意各列族資料的數量級要一致,如果相差太大,會使數量級少的列族的資料掃描效率低。 -
針對查詢:
將經常查詢和不經常查詢的資料放在不同的列族,根據實際情況來劃分,也體現Hbase的反規範化。 -
取名:
儘可能短,列族和列的名字會存在Hbase的每個cell中。 cell:通過row和columns確定的為一個儲存單元稱為cell。每個cell都儲存著同一份資料的多個版本。版本通過時間戳來索引。時間戳的型別是64位整型。
常用叢集配置
Hbase生產叢集不應該少於10個節點
小型生產叢集(10-20臺伺服器)
一個HbaseMaster,一個Zookeeper就可以了,並且可以部署在一塊
中型(50臺以下)
把NameNode和JobTracker分開部署到不同的機器,建議部署3個Master,3個Zookeeper
大型(50臺以上)
5個Zookeeper,其它和中型方式相同