HBase簡介:數據庫
HBase---Hadoop DataBase,是一個高可靠、高性能、面向列、可存儲、實時讀寫的分佈式數據庫apache
利用HBase HDFS做爲其文件存儲系統數組
HBase數據模型:緩存
(1)RowKey:架構
決定一行數據,按照字典順序排序,RowKey只能存儲64K字節數據app
(2)Column Family列族 & qualifier列:負載均衡
HBase表中某個列都歸屬某個列族,列族必須做爲表模式(schema)定義的一部分預先給出。分佈式
列名以列族做爲前綴,每一個列族均可以有多個列成員(cloumn)oop
HBase把同一列族裏面的數據存儲在統一目錄下,由幾個文件保存性能
(3)Timestamp時間戳
在HBase每一個cell存儲單元對同一份數據有多個版本,根據惟一的時間戳來區分每一個版本之間的差別,不一樣版本的數據按照時間倒序排序,最新的數據版本排在最前面;
時間戳的類型是64位整型
時間戳能夠由HBase(在數據寫入時自動賦值)此時時間戳是精確到毫秒的當前系統時間
時間戳也能夠由客戶顯示賦值,若是應用程序之間要避免數據版本衝突,就必須本身生成具備惟一性的時間戳
(4)Cell單元格
由行和列的座標交叉決定;單元格是有版本的;單元格的內容是未解析的字節數組
(5)HLog(WAL Log)
HLog文件就是一個普通的Hadoop Sequence File,Sequence File的key是HLogKey對象,HLogKey中記錄了寫入數據的歸屬信息,除了Table和Region名字外,同時還包括sequence number和timestamp,「timestamp」是寫入時間;
sequence number的起始值爲0,或者是最近一次存入文件系統中sequence number
HLog SequenceFile的Value是HBase的keyValue是HBase的KeyValue對象,即對應HFile中的KeyValue
HBase體系架構
(1)Client
包含訪問HBase的接口並維護cache來加快對HBase的訪問
(2)Zookeeper
保證任什麼時候候,集羣中只有一個Master處於active狀態
存儲全部Region的尋址入口
實時監控Region Server的上下線信息,並實時通知Master
存儲HBase的schema和table元數據信息
(3)Master
爲Region Server分配region
負責Region Server的負載均衡
發現失效的Region Server,並從新分配失效Region Server上的Region
管理用戶對table的增刪改操做
(6)Region Server
Region Server維護region,處理對這些region的IO請求
Region Server負責切分在運行過程當中變得過大的Region
(7)Memstore和storefile
一個region由多個store組成,一個store對應一個CF;
store包括內存中的memstore和位於磁盤的storefile,寫操做先寫入memstore,當memstore中的數據達到某個閾值時,hregionserver會啓動flushcache進程寫入storefile,每次寫入造成一個單獨的storefile
當storefile文件數量增加到必定閾值的時候,系統會進行minor、major compaction,在合併過程當中會進行版本合併和刪除工做,造成更大的storefile
當一個region中全部storefile的大小和數量超過必定閾值的時候,會把當前的region分割爲兩個,並由hmaster分配到相應的regionserver上,實現負載均衡
客戶端檢索數據,先在memstore上找,找不到再去storefile中找
HRegion是HBase中分佈式存儲和負載均衡的最小單元。最小單元就表示不一樣HRegion能夠分佈在不一樣HRegion Server上面
HBase讀寫流程:
讀流程: 1、Client先訪問zookeeper,從meta表讀取region的位置,而後讀取meta表中的數據。meta中又存儲了用戶表的region信息。 2、根據namespace、表名和rowkey在meta表中找到對應的region信息 3、找到這個region對應的regionserver 4、查找對應的region 5、先從MemStore找數據,若是沒有,再到StoreFile上讀(爲了讀取的效率)。
寫流程: 1、Client先訪問zookeeper,從meta表獲取相應region信息,而後找到meta表的數據 2、根據namespace、表名和rowkey根據meta表的數據找到寫入數據對應的region信息 3、找到對應的regionserver 4、把數據分別寫到HLog和MemStore上一份 5、MemStore達到一個閾值後則把數據刷成一個StoreFile文件。(若MemStore中的數據有丟失,則能夠總HLog上恢復) 6、當多個StoreFile文件達到必定的大小後,會觸發Compact合併操做,合併爲一個StoreFile,(這裏同時進行版本的合併和數據刪除。) 7、當Storefile大小超過必定閾值後,會把當前的Region分割爲兩個(Split),並由Hmaster分配到相應的HRegionServer,實現負載均衡
HBase Compaction
主要有Minor Compaction和Major Compaction
Minor Compaction:指選取一些小的、相鄰的storefile將他們合併成更大的StoreFile,在這個過程不會處理Delete或者Expired的Cell
Major Compaction:指將全部的StoreFile合併成一個StoreFile,在這個過程當中會有清理三類無心義數據:被刪除的數據,TTL過時的數據,版本號超過設定版本的數據,整個過程會消耗大量的系統資源
Compaction就是使用短期的IO消耗以及帶寬消耗換取後續查詢的低延遲
Compaction流程:
Compaction出發時機始於特定的觸發條件,好比flush、週期性的Compaction檢查操做或手動觸發,一旦觸發,HBase會將該Compaction交由一個單獨的線程去操做
Memstore Flush:memstore flush 會產生一個hfile文件,文件愈來愈多就須要compact,一旦文件數大於設定值就會進行compact
後臺線程週期性檢查:手動觸發,通常不會作過多的檢查,直接執行合併
sanpshort流程:
主要分爲如下幾個步驟:
(1)加一把全局鎖,此時不容許任何數據寫入更新以及刪除操做
(2)將memstore中緩存的數據flush(可選)
(3)爲全部hfile文件分別新建引用指引,這些指針元數據就是snapshort
功能:
(1)全量/增量的備份
(2)對重要數據業務進行快照,若是發生錯誤後可回滾以前的快照點
(3)數據遷移,使用ExportSnapshot功能將快照到另外一個集羣
snapshort使用:
(1)爲表'sourceTable'打一個快照'snapshotName',快照並不涉及數據移動,能夠在線完成
hbase> snapshot 'sourceTable','snapshotName'
(2)恢復指定快照,恢復過程會替代原有數據,將表還原到快照點,快照點以後的全部更新數據將會丟失,須要注意的是原有表須要先disable,而後才能恢復操做
hbase> restore_snapshot 'snapshotName'
(3)根據快照恢復出一個新表,恢復過程不涉及數據移動,能夠在秒級完成
hbase> clone_snapshot 'snapshotName','tableName'
使用ExportSnapshot命令能夠將A集羣的快照數據遷移到B集羣,ExportSnapshot是HDFS層面的操做,會使用MR進行數據的並行遷移,所以須要在開啓MR的機器上進行遷移。HMaster和HRegionServer並不參與這個過程,所以不會帶來額外的內存開銷以及GC開銷。惟一的影響是DN在拷貝數據的時候須要額外的帶寬以及IO負載,ExportSnapshot也針對這個問題設置了參數-bandwidth來限制帶寬的使用。
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \ -snapshot MySnapshot -copy-from hdfs://srv2:8082/hbase \ -copy-to hdfs://srv1:50070/hbase -mappers 16 -bandwidth 1024\
HBase優化:
(1)表的設計:
(2)寫表操做:
(3)讀表操做