說明
- hbase是大數據平臺上開源的、面向列的分佈式數據庫,技術源於Fay Chang撰寫的Google論文BigTable:一個結構化數據的分佈式存儲系統。是一種NoSql數據庫。
- hbase依賴hdfs存儲文件,必須構建在hadoop平臺上。
- hbase 內置zookeeper實行分佈式同步
特點
- 強讀寫一致,不是“最終一致性”的數據存儲,這使得它非常適合高速的計算聚合
- 自動分片,通過Region分散在集羣中,當行數增長的時候,Region也會自動的切分和再分配
- 自動的故障轉移
- Hadoop/HDFS集成,和HDFS開箱即用,不用太麻煩的銜接
- 豐富的“簡潔,高效”API,Thrift/REST API,Java API
- 塊緩存,布隆過濾器,可以高效的列查詢優化
- 操作管理,Hbase提供了內置的web界面來操作,還可以監控JMX指標
- HBase 是一個稀疏的、分佈式、持久、多維、排序的映射,它以行鍵(row key),列鍵(column key)和時間戳(timestamp)爲索引。
- Hbase在存儲數據的時候,有兩個SortedMap,首先按照rowkey進行字典排序,然後再對Column進行字典排序。SortedMap<RowKey,List<SortedMap<Column,List<Value,Timestamp>>>>
hbase使用場景
- 數據量足夠大,如果有十億及百億行數據,Hbase是一個很好的選擇,如果只有幾百萬行甚至不到的數據量,RDBMS(mysql、oracle)是一個很好的選擇。因爲數據量小真正能工作的機器量少,剩餘的機器都處於空閒狀態
- 如果不需要輔助索引和靜態類型的列、事務等特性,已使用RDBMS的系統要切換到Hbase,需要重新設計系統
- 保證硬件資源足夠,每個HDFS集羣在少於5個節點的時候,都不能表現的很好。因爲HDFS默認的複製數量是3,再加上一個NameNode。
Hbase架構
簡單架構
- Zookeeper,作爲分佈式的協調。RegionServer也會把自己的信息寫到ZooKeeper中。
- HDFS是Hbase運行的底層文件系統
- RegionServer,理解爲數據節點,負責存儲數據
- RegionServer要實時的向Master報告信息。Master知道全局的RegionServer運行情況,可以控制RegionServer的故障轉移和Region的切分。
架構細化
- HMaster是Master Server的實現,負責監控集羣中的RegionServer實例,同時是所有metadata(元數據)改變的接口,在集羣中,通常運行在NameNode上面
- HMasterInterface暴露的接口,Table(createTable, modifyTable, removeTable, enable, disable),ColumnFamily (addColumn, modifyColumn, removeColumn),Region (move, assign, unassign)
- Master運行的後臺線程:LoadBalancer線程,控制region來平衡集羣的負載。CatalogJanitor線程,週期性的檢查hbase:meta表
- HRegionServer是RegionServer的實現,服務和管理Regions,集羣中RegionServer運行在DataNode
- HRegionRegionInterface暴露接口:Data (get, put, delete, next, etc.),Region (splitRegion, compactRegion, etc.)
- RegionServer後臺線程:CompactSplitThread,MajorCompactionChecker,MemStoreFlusher,LogRoller
- HRegion代表table,Region有多個Store(列簇),Store有一個Memstore和多個StoreFiles(HFiles),StoreFiles的底層是Block。
存儲設計
- 在Hbase中,表被分割成多個更小的塊然後分散的存儲在不同的服務器上,這些小塊叫做Regions,存放Regions的地方叫做RegionServer。Master進程負責處理不同的RegionServer之間的Region的分發。在Hbase實現中HRegionServer和HRegion類代表RegionServer和Region。HRegionServer除了包含一些HRegions之外,還處理兩種類型的文件用於數據存儲
- HLog 預寫日誌文件,也叫做WAL(write-ahead log)
- MasterProcWAL:HMaster記錄管理操作,比如解決衝突的服務器,表創建和其它DDLs等操作到它的WAL文件中,這個WALs存儲在MasterProcWALs目錄下,它不像RegionServer的WALs,HMaster的WAL也支持彈性操作,就是如果Master服務器掛了,其它的Master接管的時候繼續操作這個文件
- WAL記錄所有的Hbase數據改變,如果一個RegionServer在MemStore進行FLush的時候掛掉了,WAL可以保證數據的改變被應用到。如果寫WAL失敗了,那麼修改數據的完整操作就是失敗的。
- 通常情況,每個RegionServer只有一個WAL實例。在2.0之前,WAL的實現叫做HLog
- WAL位於/hbase/WALs/目錄下
- MultiWAL: 如果每個RegionServer只有一個WAL,由於HDFS必須是連續的,導致必須寫WAL連續的,然後出現性能問題。MultiWAL可以讓RegionServer同時寫多個WAL並行的,通過HDFS底層的多管道,最終提升總的吞吐量,但是不會提升單個Region的吞吐量
- HFile 真實的數據存儲文件,HFile是Hbase在HDFS中存儲數據的格式,它包含多層的索引,這樣在Hbase檢索數據的時候就不用完全的加載整個文件。索引的大小(keys的大小,數據量的大小)影響block的大小,在大數據集的情況下,block的大小設置爲每個RegionServer 1GB也是常見的。
- HFile生成方式
- 開始HFile中並沒有任何Block,數據還存在於MemStore中。
- Flush發生時,創建HFile Writer,第一個空的Data Block出現,初始化後的Data Block中爲Header部分預留了空間,Header部分用來存放一個Data Block的元數據信息。
- 而後,位於MemStore中的KeyValues被一個個append到位於內存中的第一個Data Block中:
- 注:如果配置了Data Block Encoding,則會在Append KeyValue的時候進行同步編碼,編碼後的數據不再是單純的KeyValue模式。Data Block Encoding是HBase爲了降低KeyValue結構性膨脹而提供的內部編碼機制。
- HFile生成方式
- HLog 預寫日誌文件,也叫做WAL(write-ahead log)
讀寫簡單流程
- 讀寫都先請求zookeeper獲取meta region位置,再從meta region位置,讀取meta region獲得數據存儲region,最後實現數據讀寫。
region拆分策略
- 在設置hbase.hregion.max.filesize(默認10G)值時,各拆分算法執行細節。
- IncreasingToUpperBoundRegionSplitPolicy,0.94默認region split策略。根據公式min(r^2*flushSize,maxFileSize)確定split的maxFileSize,其中r爲在線region個數,maxFileSize由hbase.hregion.max.filesize指定。
- ConstantSizeRegionSplitPolicy,僅僅當region大小超過常量值(hbase.hregion.max.filesize大小)時,才進行拆分。
- DelimitedKeyPrefixRegionSplitPolicy,保證以分隔符前面的前綴爲splitPoint,保證相同RowKey前綴的數據在一個Region中
- KeyPrefixRegionSplitPolicy,保證具有相同前綴的row在一個region中(要求設計中前綴具有同樣長度)。指定rowkey前綴位數劃分region,通過讀取table的prefix_split_key_policy.prefix_length屬性,該屬性爲數字類型,表示前綴長度,在進行split時,按此長度對splitPoint進行截取。此種策略比較適合固定前綴的rowkey。當table中沒有設置該屬性,或其屬性不爲Integer類型時,指定此策略效果等同與使用IncreasingToUpperBoundRegionSplitPolicy。
總結
hbase是大數據領域重要的高效實時查詢數據庫,肩負着實時數據響應的職責,在海量T、P級數據的快速查詢上,有着不可替代的地位。