HBase 簡介
1.1 HBase 定義
?Apache HBase? 是以 hdfs 為數(shù)據(jù)存儲的,一種分布式、可擴展的 NoSQL 數(shù)據(jù)庫。
1.2 HBase 數(shù)據(jù)模型
HBase 的設(shè)計理念依據(jù) Google 的 BigTable 論文,論文中對于數(shù)據(jù)模型的首句介紹。
Bigtable 是一個稀疏的、分布式的、持久的多維排序 map。
之后對于映射的解釋如下:
該映射由行鍵、列鍵和時間戳索引;映射中的每個值都是一個未解釋的字節(jié)數(shù)組。
最終 HBase 關(guān)于數(shù)據(jù)模型和 BigTable 的對應(yīng)關(guān)系如下:
HBase 使用與 Bigtable 非常相似的數(shù)據(jù)模型。用戶將數(shù)據(jù)行存儲在帶標簽的表中。數(shù)
據(jù)行具有可排序的鍵和任意數(shù)量的列。該表存儲稀疏,因此如果用戶喜歡,同一表中的行可
以具有瘋狂變化的列。
最終理解 HBase 數(shù)據(jù)模型的關(guān)鍵在于稀疏、分布式、多維、排序的映射。其中映射 map
指代非關(guān)系型數(shù)據(jù)庫的 key-Value 結(jié)構(gòu)。
1.2.1 HBase 邏輯結(jié)構(gòu)
HBase 可以用于存儲多種結(jié)構(gòu)的數(shù)據(jù),以 JSON 為例,存儲的數(shù)據(jù)原貌為:
{ "row_key1":{ "personal_info":{ "name":"zhangsan", "city":"北京", "phone":"131********" }, "office_info":{ "tel":"010-1111111", "address":"atguigu" } }, "row_key11":{ "personal_info":{ "city":"上海", "phone":"132********" }, "office_info":{ "tel":"010-1111111"} }, "row_key2":{ ...... }
存儲數(shù)據(jù)稀疏,數(shù)據(jù)存儲多維,不同的行具有不同的列。 數(shù)據(jù)存儲整體有序,按照RowKey的字典序排列,RowKey為Byte數(shù)組

1.2.2 HBase 物理存儲結(jié)構(gòu)
物理存儲結(jié)構(gòu)即為數(shù)據(jù)映射關(guān)系,而在概念視圖的空單元格,底層實際根本不存儲。

1.2.3 數(shù)據(jù)模型
1)Name Space
命名空間,類似于關(guān)系型數(shù)據(jù)庫的 database 概念,每個命名空間下有多個表。HBase 兩 個自帶的命名空間,分別是 hbase 和 default,hbase 中存放的是 HBase 內(nèi)置的表,default表是用戶默認使用的命名空間。
2)Table
類似于關(guān)系型數(shù)據(jù)庫的表概念。不同的是,HBase 定義表時只需要聲明列族即可,不需
要聲明具體的列。因為數(shù)據(jù)存儲時稀疏的,所有往 HBase 寫入數(shù)據(jù)時,字段可以動態(tài)、按需
指定。因此,和關(guān)系型數(shù)據(jù)庫相比,HBase 能夠輕松應(yīng)對字段變更的場景。
3)Row
HBase 表中的每行數(shù)據(jù)都由一個 RowKey 和多個 Column(列)組成,數(shù)據(jù)是按照 RowKey
的字典順序存儲的,并且查詢數(shù)據(jù)時只能根據(jù) RowKey 進行檢索,所以 RowKey 的設(shè)計十分重
要。
4)Column
HBase 中的每個列都由 Column Family(列族)和 Column Qualifier(列限定符)進行限
定,例如 info:name,info:age。建表時,只需指明列族,而列限定符無需預(yù)先定義。
5)Time Stamp
用于標識數(shù)據(jù)的不同版本(version),每條數(shù)據(jù)寫入時,系統(tǒng)會自動為其加上該字段,
其值為寫入 HBase 的時間。
6)Cell
由{rowkey, column Family:column Qualifier, timestamp} 唯一確定的單元。cell 中的數(shù) 據(jù)全部是字節(jié)碼形式存貯。
1.3 HBase 基本架構(gòu)

架構(gòu)角色:
1)Master
實現(xiàn)類為 HMaster,負責監(jiān)控集群中所有的 RegionServer 實例。主要作用如下:
(1)管理元數(shù)據(jù)表格 hbase:meta,接收用戶對表格創(chuàng)建修改刪除的命令并執(zhí)行
(2)監(jiān)控 region 是否需要進行負載均衡,故障轉(zhuǎn)移和 region 的拆分。 通過啟動多個后臺線程監(jiān)控實現(xiàn)上述功能:
①LoadBalancer 負載均衡器
周期性監(jiān)控 region 分布在 regionServer 上面是否均衡,由參數(shù) hbase.balancer.period 控
制周期時間,默認 5 分鐘。
②CatalogJanitor 元數(shù)據(jù)管理器
定期檢查和清理 hbase:meta 中的數(shù)據(jù)。meta 表內(nèi)容在進階中介紹。
③MasterProcWAL master 預(yù)寫日志處理器
把 master 需要執(zhí)行的任務(wù)記錄到預(yù)寫日志 WAL 中,如果 master 宕機,讓 backupMaster
讀取日志繼續(xù)干。
2)Region Server
Region Server 實現(xiàn)類為 HRegionServer,主要作用如下:
(1)負責數(shù)據(jù) cell 的處理,例如寫入數(shù)據(jù) put,查詢數(shù)據(jù) get 等
(2)拆分合并 region 的實際執(zhí)行者,有 master 監(jiān)控,有 regionServer 執(zhí)行。
3)Zookeeper
HBase 通過 Zookeeper 來做 master 的高可用、記錄 RegionServer 的部署信息、并且存儲
有 meta 表的位置信息。
HBase 對于數(shù)據(jù)的讀寫操作時直接訪問 Zookeeper 的,在 2.3 版本推出 Master Registry
模式,客戶端可以直接訪問 master。使用此功能,會加大對 master 的壓力,減輕對 Zookeeper
的壓力。
4)HDFS
HDFS 為 Hbase 提供最終的底層數(shù)據(jù)存儲服務(wù),同時為 HBase 提供高容錯的支持。