1.HBase在Hadoop中的位置
HBase(Hadoop Database)是一個開源的、面向列(Column-Oriented)、適合存儲海量非結構化數據或半結構化數據的、具備高可靠性、高性能、可靈活擴展伸縮的、支持實時數據讀寫的分布式存儲系統。
存儲在HBase中的表的典型特征:
- 大表(BigTable):一個表可以有上億行,上百萬列
- 面向列:面向列的存儲、檢索與權限控制
- 稀疏:表中為空(null)的列不占用存儲空間
2.HBase集群典型部署組網
Master:又叫HMaster,負責HBase中Table和Region的管理,包括表的增刪改查;Region Server的負載均衡,Region分布調整;Region分裂以及分裂后的Region分配;Region Server失效后的Region遷移等。
ZooKeeper cluster:Zookeeper集群存儲-ROOT-表的地址和Master地址,Region Server主動向Zookeeper注冊,使得Master可隨時感知各Region Server的健康狀態。 Zookeeper另一個重要作用是避免Master 單點故障(SPOF)。
RegionServer:負責數據路由、數據讀寫和數據持久化,是HBase 的數據處理和計算單元,同時還負責區域的分割(即Region Split)。 RegionServer要求和HDFS的DataNode一起部署。
3.HBase系統架構
HBase Client:Client使用HBase的RPC機制與HMaster、HRegionServer 進行通信。 Client與HMaster進行管理類通信,與HRegion Server進行數據操作類通信。
HRegionServer:HRegionServer內部管理了一系列HRegion對象,每個HRegion對應Table中的一個Region。HRegion由多個Store組成。每個Store對應Table中的一個ColumnFamily的存儲,即一個Store管理一個Region上的一個列族(CF)。每個Store包含一個MemStore和0到多個StoreFile。 Store是HBase的存儲核心,由MemStore 和 StoreFile組成。
HLog:數據在寫入時,首先寫入預寫日志(Write AheadLog),每個HRegionServer服務的所有Region的寫操作日志都存儲在同一個日志文件中。數據并非直接寫入HDFS,而是等緩存到一定數量再批量寫入,寫入完成后在日志中做標記。
MemStore and StoreFile:MemStore是 一個有序的內存緩存區,用戶寫入的數據首先放入MemStore,當MemStore滿了以后Flush成一個StoreFile(存儲時對應為HFile), 當StoreFile數量增到一定閾值,觸發Compact合并,將多個StoreFiles合并成一個StoreFile。StoreFiles 合并后逐步形成越來越大的StoreFile,當Region內所有StoreFiles(Hfile)的總大小超過閾值(hbase.hregion.max.filesize)即觸發分裂Split,把當前的Region Split成2個Region,父Region下線,新Split出的2個孩子Region被HMaster分配到合適的HRegionServer 上,使得原先1個Region的壓力得以分流到2個Region上。
4.HBase數據模型
存儲在HBase表每一行數據都有可排序的關鍵字(Row Key)和任意列項(Column &Column Family)。在HBase中,僅能通過主鍵(Row Key)和主鍵版本號來檢索數據,僅支持單行事務。下面以HBase存儲搜索引擎的網頁為例:
Row Key:行鍵,相當于關系表的主鍵,每一行數據的唯一標識。字符串、整數、二進制串都可以作為RowKey。所有記錄按照RowKey排序后存儲。
Time Stamp:每次數據操作對應的時間戳,數據按時間戳區分版本,每個Cell的多個版本的數據按時間倒序存儲。
ColumnFamily:Column Family,列簇,一個表在水平方向上由一個或多個CF組成。一個CF可以由任意多個Column組成。Column是CF下的一個標簽,可以在寫入數據時任意添加,因此CF支持動態擴展,無需預先定義Column的數量和類型。 HBase中表的列非常稀疏,不同行的列的個數和類型都可以不同。此外,每個CF都有獨立的TTL(生存周期)。可以只對行上鎖,對行的操作始終是原始的。
5.HBase的物理存儲結構
建表時默認只有一個Region,如果指定Split Key,就會有多個Region。當表的記錄行超過閾值,表按水平方向分割成2個Region,可把Region理解為子表。當Region的行數超過閾值,Region繼續分裂。不同的Region被HMaster分配給合適的HRegionServer管理。每個Region都包含一個隨機ID,Region內的數據按照Row Key有序存儲。
HBase在進行數據存儲時,物理上將同“列簇”的數據存儲在一起,不同“列簇”的數據分開存儲。例如這里的Store1-1對應存儲表Region1上的CF1的所有數據,底層實際存儲時為一個HFile。
HBase文件目錄講解:
- HDFS在文件系統根目錄下為HBase建立專用存儲目錄。
- 在HBase目錄下按照表名創建子目錄
- 在表名子目錄下存放HBase Region塊目錄
- 在Region塊目錄下按照所存放表的CF建立子目錄,同時該目錄下有一個固定的文件regioninfo目錄
- regioninfo目錄下建立的文件用來存放表的Scheme信息
- Column Family下放置的是該CF的HFile文件