一、
1、什么是Hbase。
是一個高可靠性、高性能、列存儲、可伸縮、實時讀寫的分布式數據庫系統。
適合于存儲非結構化數據,基于列的而不是基于行的模式
如圖:Hadoop生態中hbase與其他部分的關系。

2、關系數據庫已經流行很多年,并且hadoop已經有了HDFS和MapReduce,為什么需要HBase?
Hadoop可以很好地解決大規模數據的離線批量處理問題,但是,受限于HadoopMapReduce編程框架的高延遲數據處理機制,使得Hadoop無法滿足大規模數據實時處理應用的需求
HDFS面向批量訪問模式,不是隨機訪問模式
傳統的通用關系型數據庫無法應對在數據規模劇增時導致的系統擴展性和性能問題(分庫分表也不能很好解決)
傳統關系數據庫在數據結構變化時一般需要停機維護;空列浪費存儲空間
因此,業界出現了一類面向半結構化數據存儲和處理的高可擴展、低寫入/查詢延遲的系統,例如,鍵值數據庫、文檔數據庫和列族數據庫(如BigTable和HBase等)
HBase已經成功應用于互聯網服務領域和傳統行業的眾多在線式數據分析處理系統中
3、HBase與傳統的關系數據庫的區別
(1)數據類型:關系數據庫采用關系模型,具有豐富的數據類型和存儲方式,HBase則采用了更加簡單的數據模型,它把數據存儲為未經解釋的字符串
(2)數據操作:關系數據庫中包含了豐富的操作,其中會涉及復雜的多表連接。HBase操作則不存在復雜的表與表之間的關系,只有簡單的插入、查詢、刪除、清空等,因為HBase在設計上就避免了復雜的表和表之間的關系
(3)存儲模式:關系數據庫是基于行模式存儲的。HBase是基于列存儲的,每個列族都由幾個文件保存,不同列族的文件是分離的
(4)數據索引:關系數據庫通常可以針對不同列構建復雜的多個索引,以提高數據訪問性能。HBase只有一個索引——行鍵,通過巧妙的設計,HBase中的所有訪問方法,或者通過行鍵訪問,或者通過行鍵掃描,從而使得整個系統不會慢下來
(5)數據維護:在關系數據庫中,更新操作會用最新的當前值去替換記錄中原來的舊值,舊值被覆蓋后就不會存在。而在HBase中執行更新操作時,并不會刪除數據舊的版本,而是生成一個新的版本,舊有的版本仍然保留
(6)可伸縮性:關系數據庫很難實現橫向擴展,縱向擴展的空間也比較有限。相反,HBase和BigTable這些分布式數據庫就是為了實現靈活的水平擴展而開發的,能夠輕易地通過在集群中增加或者減少硬件數量來實現性能的伸縮
二、Hbase數據模型
1、模型概述
HBase是一個稀疏、多維度、排序的映射表,這張表的索引是行鍵、列族、列限定符和時間戳
每個值是一個未經解釋的字符串,沒有數據類型
用戶在表中存儲數據,每一行都有一個可排序的行鍵和任意多的列
表在水平方向由一個或者多個列族組成,一個列族中可以包含任意多個列,同一個列族里面的數據存儲在一起
列族支持動態擴展,可以很輕松地添加一個列族或列,無需預先定義列的數量以及類型,所有列均以字符串形式存儲,用戶需要自行進行數據類型轉換
HBase中執行更新操作時,并不會刪除數據舊的版本,而是生成一個新的版本,舊有的版本仍然保留(這是和HDFS只允許追加不允許修改的特性相關的)

2、數據坐標
HBase中需要根據行鍵、列族、列限定符和時間戳來確定一個單元格,因此,可以視為一個“四維坐標”,即[行鍵,列族, 列限定符,時間戳]
鍵 |
值 |
[“201505003”,“Info”,“email”, 1174184619081] |
“xie@qq.com” |
[“201505003”,“Info”,“email”, 1174184620720] |
“you@163.com”
|
3、概念視圖

4、物理視圖

三、HBase實現原理
1、HBase的實現包括三個主要的功能組件:
(1)庫函數:鏈接到每個客戶端
(2)一個Master主服務器
(3)許多個Region服務器
主服務器Master負責管理和維護HBase表的分區信息,維護Region服務器列表,分配Region,負載均衡
Region服務器負責存儲和維護分配給自己的Region,處理來自客戶端的讀寫請求
客戶端并不是直接從Master主服務器上讀取數據,而是在獲得Region的存儲位置信息后,直接從Region服務器上讀取數據
客戶端并不依賴Master,而是通過Zookeeper來獲得Region位置信息,大多數客戶端甚至從來不和Master通信,這種設計方式使得Master負載很小
2、Region
開始只有一個Region,后來不斷分裂
Region拆分操作非常快,接近瞬間,因為拆分之后的Region讀取的仍然是原存儲文件,直到“合并”過程把存儲文件異步地寫到獨立的文件之后,才會讀取新文件
同一個Region不會被分拆到多個Region服務器
每個Region服務器存儲10-1000個Region
元數據表,又名.META.表,存儲了Region和Region服務器的映射關系
當HBase表很大時, .META.表也會被分裂成多個Region
根數據表,又名-ROOT-表,記錄所有元數據的具體位置
-ROOT-表只有唯一一個Region,名字是在程序中被寫死的
Zookeeper文件記錄了-ROOT-表的位置
客戶端訪問數據時的“三級尋址”
為了加速尋址,客戶端會緩存位置信息,同時,需要解決緩存失效問題
尋址過程客戶端只需要詢問Zookeeper服務器,不需要連接Master服務器
3、HBase的三層結構中各層次的名稱和作用
層次 |
名稱 |
作用 |
第一層 |
Zookeper文件 |
記錄了-ROOT-表的位置信息 |
第二層 |
-ROOT-表 |
記錄了.META.表的Region位置信息
-ROOT-表只能有一個Region。通過-ROOT-表,就可以訪問.META.表中的數據 |
第三層 |
.META.表 |
記錄了用戶數據表的Region位置信息,.META.表可以有多個Region,保存了HBase中所有用戶數據表的Region位置信息 |
四、HBase運行機制
1、HBase系統架構

(1、客戶端包含訪問HBase的接口,同時在緩存中維護著已經訪問過的Region位置信息,用來加快后續數據訪問過程
(2、Zookeeper可以幫助選舉出一個Master作為集群的總管,并保證在任何時刻總有唯一一個Master在運行,這就避免了Master的“單點失效”問題
(Zookeeper是一個很好的集群管理工具,被大量用于分布式計算,提供配置維護、域名服務、分布式同步、組服務等。)

(3. Master
主服務器Master主要負責表和Region的管理工作:
管理用戶對表的增加、刪除、修改、查詢等操作
實現不同Region服務器之間的負載均衡
在Region分裂或合并后,負責重新調整Region的分布
對發生故障失效的Region服務器上的Region進行遷移
(4. Region服務器
Region服務器是HBase中最核心的模塊,負責維護分配給自己的Region,并響應用戶的讀寫請求
2、Region

(1、用戶讀寫數據過程
用戶寫入數據時,被分配到相應Region服務器去執行
用戶數據首先被寫入到MemStore和Hlog中
只有當操作寫入Hlog之后,commit()調用才會將其返回給客戶端
當用戶讀取數據時,Region服務器會首先訪問MemStore緩存,如果找不到,再去磁盤上面的StoreFile中尋找
(2、緩存的刷新
系統會周期性地把MemStore緩存里的內容刷寫到磁盤的StoreFile文件中,清空緩存,并在Hlog里面寫入一個標記、
每次刷寫都生成一個新的StoreFile文件,因此,每個Store包含多個StoreFile文件
每個Region服務器都有一個自己的HLog文件,每次啟動都檢查該文件,確認最近一次執行緩存刷新操作之后是否發生新的寫入操作;如果發現更新,則先寫入MemStore,再刷寫到StoreFile,最后刪除舊的Hlog文件,開始為用戶提供服務
(3、StroreFile的合并
每次刷寫都生成一個新的StoreFile,數量太多,影響查找速度
調用Store.compact()把多個合并成一個
合并操作比較耗費資源,只有數量達到一個閾值才啟動合并
3、Store工作原理
Store是Region服務器的核心
多個StoreFile合并成一個
觸發分裂操作,1個父Region被分裂成兩個子Region
單個StoreFile過大時,又4、HLog工作原理
分布式環境必須要考慮系統出錯。HBase采用HLog保證系統恢復
HBase系統為每個Region服務器配置了一個HLog文件,它是一種預寫式日志(WriteAhead Log)
用戶更新數據必須首先寫入日志后,才能寫入MemStore緩存,并且,直到MemStore緩存內容對應的日志已經寫入磁盤,該緩存內容才能被刷寫到磁盤
Zookeeper會實時監測每個Region服務器的狀態,當某個Region服務器發生故障時,Zookeeper會通知Master
Master首先會處理該故障Region服務器上面遺留的HLog文件,這個遺留的HLog文件中包含了來自多個Region對象的日志記錄
系統會根據每條日志記錄所屬的Region對象對HLog數據進行拆分,分別放到相應Region對象的目錄下,然后,再將失效的Region重新分配到可用的Region服務器中,并把與該Region對象相關的HLog日志記錄也發送給相應的Region服務器
Region服務器領取到分配給自己的Region對象以及與之相關的HLog日志記錄以后,會重新做一遍日志記錄中的各種操作,把日志記錄中的數據寫入到MemStore緩存中,然后,刷新到磁盤的StoreFile文件中,完成數據恢復
共用日志優點:提高對表的寫操作性能;缺點:恢復時需要分拆日志
五、HBase性能
1、
行鍵(RowKey)
行鍵是按照字典序存儲,因此,設計行鍵時,要充分利用這個排序特點,將經常一起讀取的數據存儲到一塊,將最近可能會被訪問的數據放在一塊。
舉個例子:如果最近寫入HBase表中的數據是最可能被訪問的,可以考慮將時間戳作為行鍵的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE- timestamp作為行鍵,這樣能保證新寫入的數據在讀取時可以被快速命中。
InMemory:創建表的時候,可以通過HColumnDescriptor.setInMemory(true)將表放到Region服務器的緩存中,保證在讀取的時候被cache命中。
Max Version:創建表的時候,可以通過HColumnDescriptor.setMaxVersions(int maxVersions)設置表中數據的最大版本,如果只需要保存最新版本的數據,那么可以設置setMaxVersions(1)。
Time To Live創建表的時候,可以通過HColumnDescriptor.setTimeToLive(inttimeToLive)設置表中數據的存儲生命期,過期數據將自動被刪除,例如如果只需要存儲最近兩天的數據,那么可以設置setTimeToLive(2* 24 * 60 * 60)。
2、HBaseMaster默認基于Web的UI服務端口為60010,HBase region服務器默認基于Web的UI服務端口為60030.如果master運行在名為master.foo.com的主機中,mater的主頁地址就是http://master.foo.com:60010,用戶可以通過Web瀏覽器輸入這個地址查看該頁面
可以查看HBase集群的當前狀態
3、
NoSQL區別于關系型數據庫的一點就是NoSQL不使用SQL作為查詢語言,至于為何在NoSQL數據存儲HBase上提供SQL接口
易使用,減少編碼
4、HBase只有一個針對行健的索引
訪問HBase表中的行,只有三種方式:
通過單個行健訪問
通過一個行健的區間來訪問
全表掃描
總結:
1、HBase數據庫是BigTable的開源實現,和BigTable一樣,支持大規模海量數據,分布式并發數據處理效率極高,易于擴展且支持動態伸縮,適用于廉價設備
2、HBase可以支持NativeJava API、HBaseShell、ThriftGateway、Hive等多種訪問接口,可以根據具體應用場合選擇相應訪問方式
3、HBase實際上就是一個稀疏、多維、持久化存儲的映射表,它采用行鍵、列鍵和時間戳進行索引,每個值都是未經解釋的字符串。
4、HBase采用分區存儲,一個大的表會被分拆許多個Region,這些Region會被分發到不同的服務器上實現分布式存儲
5、HBase的系統架構包括客戶端、Zookeeper服務器、Master主服務器、Region服務器。客戶端包含訪問HBase的接口;Zookeeper服務器負責提供穩定可靠的協同服務;Master主服務器主要負責表和Region的管理工作;Region服務器負責維護分配給自己的Region,并響應用戶的讀寫請求