大數據時代的結構化存儲--HBase
迄今,相信大家肯定聽說過 HBase,但是對於 HBase 的了解可能僅僅是它是 Hadoop 生態圈重要的一員,是一個大數據相關的數據庫技術。
今天我帶你們一起領略一下 HBase 體系架構,看看它是如何大規模處理海量數據。
一、什麽是 HBase?
關於 HBase 的實現,是基本遵循 Bigtable 的論文。HBase 是一個面向列的分布式數據庫,也是個非關系型數據庫系統(NoSQL),它建立在 Hadoop 文件系統之上。面向列的數據庫是將數據表存儲為數據列的一部分而不是數據行的數據庫。
HBase 是一個分布式,持久,嚴格一致的存儲系統,具有接近最佳的寫入 I / O 通道飽和度和出色的讀取性能。而且 HBase 只考慮單個索引,類似於 RDBMS 中的主鍵,提供服務器端實現靈活的二級索引解決方案。
二、為什麽使用 HBase?
HBase 是 Hadoop 生態圈中重要的一環,用於存儲,管理和處理數據。我們知道 Hadoop HDFS 是無法處理高速隨機寫入和讀取,也無法在不重寫文件的情況下對文件進行修改。HBase 正好解決了 HDFS 的缺點,因為它使用優化的方式快速隨機寫入和讀取。此外,隨著數據呈指數增長,關系數據庫無法提供更好性能去處理海量的數據。HBase提供可擴展性和分區,以實現高效的存儲和檢索。
三、HBase 體系架構
我們先來看看 HBase 的架構設計,由上圖我們可以得知,HBase 主要由以下及部分組成:
Master
對 Region 進行負載均衡,分配到合適的 HRegionServer。
所有 HRegion 的信息,包括存儲的 Key 值區間、所在 HRegionServer 地址、訪問端口號等,都記錄在 HMaster 服務器上。
ZooKeeper
HBase 會啟動多個 HMaster,並通過 ZooKeeper 選舉出一個主服務器。
Region Server
負責實際數據的讀寫. 當訪問數據時, 客戶端與 HBase 的 Region Server 直接通信。
Region: HBase 中的數據都是按 Rowkey 進行排序的,對這些按 Rowkey 排序的數據進行水平切分,每一片稱為一個 Region。 當一個 Region 中數據量太多時,這個 Region 連同 HFile 會分裂成兩個 Region,並根據集群中服務器負載進行遷移。
五、HBase 如何尋址?
如你所知,Zookeeper 存儲 META 表。每當客戶端對 HBase 的讀取或寫入請求時,就會發生以下操作:
1、 客戶端從 ZooKeeper 中檢索 META 表的位置。
2、 然後,客戶端從 META 表請求相應 Rowkey 的 Region Server 的位置以訪問它。客戶端會緩存當前 META 表的信息。
3、 然後它將通過從相應的 Region Server 請求獲取行位置。
在這裏有一個地方要註意,客戶端會緩存 META 表信息,所以之後請求不會直接通過 META 表檢索 Region Server 的位置,除非因為區域被移位或移動而導致查詢失敗。然後它才會再次請求 META 服務器並更新緩存。這樣可以節省時間而且搜索過程會更快。
六、HBase 寫機制
數據寫入過程一樣要進行尋址,需要先得到 Region Server 才能繼續操作。寫入機制按順序執行以下過程(參見上圖):
1、 每當客戶端有寫請求時,客戶端將數據寫入預寫日 WAL;
- 新增附加到存儲在磁盤上的 WAL 文件的末尾
- WAL 用於在服務器崩潰時恢復尚未保留的數據
2、 將數據寫入 WAL 後,將其復制到 MemStore;
3、 將數據放入 MemStore 後,客戶端將收到確認;
4、 當 MemStore 達到閾值時,它將數據轉儲或提交到 HFile。
MemStore
MemStore 在內存按照 Key 的順序, 以 Key-Value 對進行存儲。每個列族都有一個 MemStore,因此更新是以每個列族的排序方式存儲。當 MemStore 達到閾值時,它會將已排序的所有數據轉儲到新的 HFile 中,HFile 存儲在 HDFS 中。HBase 為每個列族包含多個 HFile。
MemStore 還保存了最後寫入的序列號,因此 Master Server 和 MemStore 都知道,到目前為止提交的內容以及從哪裏開始。當區域啟動時,將讀取最後一個序列號,並從該序列號開始新的寫入。
HFile
寫入順序放在磁盤上。因此,磁盤讀寫磁頭的移動非常少。這使得寫入和搜索機制非常快。只要 HFile 打開,HFile索引就會加載到內存中。這有助於在單個搜索中查找記錄。
七、什麽情況應該使用HBase?
作為 NoSQL DB,HBase 提供了許多良好的功能,但它仍然不是適用所有情況的解決方案,進一步說它是為了解決某一些方面而存在的。當你的應用程序要使用 HBase,需要考慮一些關鍵因數。
數據量: 數據量是最常考慮。在分布式環境中一般處理 PB 級別的數據。否則,對於少量數據,它將在單個節點中存儲和處理,而其他節點空閑,這是對技術框架的濫用。
吞吐量: HBase 其中一個最大優勢就是接近最優的 I/O 讀寫速度,持續的大量的插入可以達到每秒百萬的吞吐量。
關系特性: 應用程序對事務,觸發器,復雜查詢,復雜連接等 RDBMS 功能不做任何要求,HBase 對於這些基本都不支持。
除了以上幾點,當需要在非關系環境中進行容錯和可用的數據管理時,HBase也是合適的。在這裏許多人會拿 RDBMS 和 Hbase 進行比較, 其實兩者的對比毫無意義,從上面幾點關鍵因數也可以看出,兩者適用於不同的場景,比較是毫無意義的。
八、小結
HBase 是在 HDFS 之上運行的非關系型(NoSQL)數據庫,提供對這些大型數據集的實時讀/寫訪問。HBase 水平擴展使其處理具有數十億行和數百萬列的大量數據集,並且它可以輕松組合使用各種不同結構和模式的數據。正是如此,HBase 成為 Hadoop 生態圈 中重要的一環,用於存儲,管理和處理大數據。
大數據時代的結構化存儲--HBase