帶你瞭解 HBase 數據模型和 HBase 架構

摘要:HBase 是一個面向列的 NoSQL 數據庫。

本文分享自華爲雲社區《HBase 架構:HBase 數據模型 & HBase 讀/寫機制》,作者: Donglian Lin 。

HBase 架構:HBase 數據模型

衆所周知,HBase 是一個面向列的 NoSQL 數據庫。雖然它看起來類似於包含行和列的關係數據庫,但它不是關係數據庫。關係數據庫是面向行的,而 HBase 是面向列的。那麼,讓我們首先了解面向列和麪向行的數據庫之間的區別:

面向行與面向列的數據庫:

  • 面向行的數據庫以行的順序存儲表記錄。而面向列的數據庫 將表記錄存儲在一系列列中,即列中的條目存儲在磁盤上的連續位置。

爲了更好地理解它,讓我們舉個例子並考慮下表。

如果此表存儲在面向行的數據庫中。它將存儲如下所示的記錄:

1 ,保羅沃克,美國, 231 ,加拉多,

2, Vin Diesel ,巴西, 520 , Mustang

如上所示,在面向行的數據庫中,數據是基於行或元組存儲的。

雖然面向列的數據庫將此數據存儲爲:

1 , 2 , Paul Walker , Vin Diesel , 美國,巴西, 231 , 520 , Gallardo , Mustang

在面向列的數據庫中,所有列值都存儲在一起,就像第一列值將存儲在一起,然後第二列值將一起存儲,其他列中的數據以類似方式存儲。

  • 當數據量非常大時,比如 PB 級或 EB 級,我們使用面向列的方法,因爲單列的數據存儲在一起,可以更快地訪問。
  • 雖然面向行的方法相對有效地處理較少數量的行和列,但面向行的數據庫存儲數據是一種結構化格式。
  • 當我們需要處理和分析大量半結構化或非結構化數據時,我們使用面向列的方法。例如處理在線分析處理的應用程序,如數據挖掘、數據倉庫、包括分析在內的應用程序等。
  • 而在線事務處理(例如處理結構化數據並需要事務屬性(ACID 屬性)的銀行和金融領域)使用面向行的方法。

HBase 表具有以下組件,如下圖所示:

  • 表格:數據以表格格式存儲在 HBase 中。但這裏的表格是面向列的格式。
  • 行鍵:行鍵用於搜索記錄,使搜索速度更快。你會很想知道怎麼做嗎?我將在本博客的架構部分進行解釋。
  • 列族:各種列組合在一個列族中。這些列族存儲在一起,這使得搜索過程更快,因爲可以在一次查找中一起訪問屬於同一列族的數據。
  • 列限定符:每列的名稱稱爲其列限定符。
  • 單元格:數據存儲在單元格中。數據被轉儲到由行鍵和列限定符專門標識的單元格中。
  • 時間戳:時間戳是日期和時間的組合。無論何時存儲數據,它都會與其時間戳一起存儲。這使得搜索特定版本的數據變得容易。

用更簡單易懂的方式,我們可以說 HBase 包括:

  • 一組表
  • 每個表都有列族和行
  • 行鍵在 HBase 中充當主鍵。
  • 對 HBase 表的任何訪問都使用此主鍵
  • HBase 中存在的每個列限定符表示與駐留在單元格中的對象相對應的屬性。

現在您瞭解了 HBase 數據模型,讓我們看看這個數據模型如何符合 HBase 架構並使其適用於大存儲和更快的處理。

HBase 架構:HBase 架構的組件

HBase 具有三個主要組件,即HMaster Server、HBase Region Server、Regions和Zookeeper。

下圖解釋了 HBase 架構的層次結構。我們將單獨討論它們中的每一個。

現在在進入 HMaster 之前,我們將瞭解 Region,因爲所有這些 Server(HMaster、Region Server、Zookeeper)都是用來協調和管理 Region 並在 Region 內部執行各種操作的。因此,您很想知道什麼是區域以及它們爲何如此重要?

HBase 架構:區域

一個區域包含分配給該區域的開始鍵和結束鍵之間的所有行。HBase 表可以劃分爲多個區域,將一個列族的所有列存儲在一個區域中。每個區域都包含按排序順序的行。

許多區域被分配給一個Region Server,它負責處理、管理、執行對該組區域的讀取和寫入操作。

所以,以更簡單的方式結束:

  • 一個表可以分爲多個區域。區域是存儲在開始鍵和結束鍵之間的數據的有序行範圍。
  • 一個 Region 的默認大小爲 256MB,可以根據需要進行配置。
  • 區域服務器爲客戶端提供一組區域。
  • 一個區域服務器可以爲客戶端提供大約 1000 個區域。

現在從層次結構的頂部開始,我首先想向您解釋 HMaster Server,它的作用類似於HDFS 中的 NameNode 。然後,在層次結構中向下移動,我將帶您瞭解 ZooKeeper 和 Region Server。

HBase 架構:HMaster

如下圖所示,您可以看到 HMaster 處理駐留在 DataNode 上的 Region Server 集合。讓我們瞭解 HMaster 是如何做到這一點的。

  • HBase HMaster 執行 DDL 操作(創建和刪除表)並將區域分配給區域服務器,如上圖所示。
  • 它協調和管理 Region Server(類似於 NameNode 在 HDFS 中管理 DataNode)。
  • 它在啓動時將區域分配給區域服務器,並在恢復和負載平衡期間將區域重新分配給區域服務器。
  • 它監視集羣中所有 Region Server 的實例(在 Zookeeper 的幫助下),並在任何 Region Server 關閉時執行恢復活動。
  • 它提供了一個用於創建、刪除和更新表的接口。

HBase 有一個龐大的分佈式環境,僅靠 HMaster 不足以管理所有內容。那麼,你會想知道是什麼幫助 HMaster 管理這個巨大的環境?這就是 ZooKeeper 出現的地方。在瞭解了 HMaster 如何管理 HBase 環境後,我們將瞭解 Zookeeper 如何幫助 HMaster 管理環境。

HBase 架構:ZooKeeper – 協調器

下圖解釋了 ZooKeeper 的協調機制。

  • Zookeeper 就像 HBase 分佈式環境中的協調器。它有助於通過會話進行通信來維護集羣內的服務器狀態。
  • 每個 Region Server 和 HMaster Server 都會定期向 Zookeeper 發送連續的心跳,並檢查哪個服務器是活動的和可用的,如上圖所示。它還提供服務器故障通知,以便可以執行恢復措施。
  • 從上圖可以看出,有一個不活動的服務器,它作爲活動服務器的備份。如果活動服務器出現故障,它就會派上用場。
  • 活動的 HMaster 向 Zookeeper 發送心跳,而非活動的 HMaster 偵聽活動 HMaster 發送的通知。如果活動 HMaster 未能發送心跳,則會話將被刪除,非活動 HMaster 變爲活動狀態。
  • 而如果 Region Server 無法發送心跳,則會話將過期並通知所有偵聽器。然後 HMaster 執行適當的恢復操作,我們將在本博客稍後討論。
  • Zookeeper 還維護 .META Server 的路徑,這有助於任何客戶端搜索任何區域。Client首先必須與.META Server覈對某個區域所屬的Region Server,並獲取該Region Server的路徑。

說到.META Server,我先給大家解釋一下什麼是.META Server?因此,您可以輕鬆地將 ZooKeeper 和 .META Server 的工作聯繫在一起。稍後,當我在此博客中向您解釋 HBase 搜索機制時,我將解釋這兩者如何協同工作。

HBase 架構: 元表

  • META 表是一個特殊的 HBase 目錄表。它維護了 HBase 存儲系統中所有區域服務器的列表,如上圖所示。
  • 從圖中可以看到,.META文件以鍵和值的形式維護表。Key 代表區域的起始鍵和它的 id,而值包含區域服務器的路徑。

正如我在向您解釋 Region 時已經討論過的 Region Server 及其功能,因此現在我們正在向下移動層次結構,我將專注於 Region Server 的組件及其功能。稍後我將討論搜索、閱讀、寫作的機制,並瞭解所有這些組件如何協同工作。

HBase 架構: Region Server 的組件

下圖顯示了區域服務器的組件。現在,我將分別討論它們。

區域服務器維護在HDFS頂部運行的各種區域。區域服務器的組件是:

  • WAL: 從上圖中可以得出結論,Write Ahead Log (WAL) 是附加到分佈式環境中每個 Region Server 的文件。WAL 存儲尚未持久化或提交到永久存儲的新數據。它用於恢復數據集失敗的情況。
  • Block Cache:從上圖可以清楚的看到Block Cache位於Region Server的頂部。它將經常讀取的數據存儲在內存中。如果 BlockCache 中的數據最近最少使用,則該數據將從 BlockCache 中刪除。
  • MemStore:是寫緩存。在將所有傳入數據提交到磁盤或永久內存之前,它會存儲所有傳入數據。一個區域中的每個列族都有一個 MemStore。正如您在圖像中看到的,一個區域有多個 MemStore,因爲每個區域包含多個列族。數據在提交到磁盤之前按字典順序排序。
  • HFile:從上圖可以看出HFile是存儲在HDFS上的。因此,它將實際單元存儲在磁盤上。當 MemStore 的大小超過時,MemStore 將數據提交到 HFile。

現在我們知道了 HBase 架構的主要和次要組件,我將在此解釋機制和他們的協作努力。不管是讀還是寫,首先我們要搜索從哪裏讀或者從哪裏寫一個文件。所以,讓我們瞭解這個搜索過程,因爲這是使 HBase 非常流行的機制之一。

HBase 架構: 搜索如何在 HBase 中初始化?

如您所知,Zookeeper 存儲 META 表位置。每當客戶端向 HBase 發出讀取或寫入請求時,就會發生以下操作:

  1. 客戶端從 ZooKeeper 檢索 META 表的位置。
  2. 客戶端然後從 META 表中請求相應行鍵的 Region Server 的位置來訪問它。客戶端將此信息與 META 表的位置一起緩存。
  3. 然後它將通過從相應的 Region Server 請求來獲取行位置。

對於將來的引用,客戶端使用其緩存來檢索 META 表的位置和先前讀取的行鍵的區域服務器。然後客戶端將不會引用 META 表,直到並且除非由於區域移動或移動而導致未命中。然後它將再次請求 META 服務器並更新緩存。

與每次一樣,客戶端不會浪費時間從 META 服務器檢索 Region Server 的位置,因此,這節省了時間並使搜索過程更快。現在,讓我告訴您如何在 HBase 中進行寫入。其中涉及哪些組件以及它們如何參與?

HBase 架構: HBase 寫機制

下圖解釋了 HBase 中的寫入機制。

寫入機制依次經過以下過程(參考上圖):

步驟1:每當客戶端有寫請求時,客戶端將數據寫入WAL(Write Ahead Log)。

  • 然後將編輯附加到 WAL 文件的末尾。
  • 該 WAL 文件保存在每個 Region Server 中,Region Server 使用它來恢復未提交到磁盤的數據。

第 2 步:將數據寫入 WAL 後,將其複製到 MemStore。

第 3 步:一旦數據放入 MemStore,客戶端就會收到確認。

第 4 步:當 MemStore 達到閾值時,它將數據轉儲或提交到 HFile。

現在讓我們深入瞭解一下 MemStore 在寫作過程中的貢獻以及它的功能是什麼?

HBase 寫機制- MemStore

  • MemStore 總是按照字典順序(按字典方式)將存儲在其中的數據更新爲已排序的 KeyValue。每個列族有一個 MemStore,因此每個列族的更新以排序的方式存儲。
  • 當 MemStore 達到閾值時,它會以排序的方式將所有數據轉儲到一個新的 HFile 中。此 HFile 存儲在 HDFS 中。HBase 爲每個列族包含多個 HFile。
  • 隨着時間的推移,HFile 的數量隨着 MemStore 轉儲數據而增長。
  • MemStore 還保存了最後寫入的序列號,因此 Master Server 和 MemStore 都知道到目前爲止提交了什麼以及從哪裏開始。當區域啓動時,讀取最後一個序列號,並從該編號開始新的編輯。

正如我多次討論過的,HFile 是 HBase 架構中的主要持久存儲。最後,所有的數據都提交到 HFile 中,HFile 是 HBase 的永久存儲。因此,讓我們看看 HFile 的屬性,它可以在讀寫時更快地進行搜索。

HBase 架構: HBase 寫入機制- HFile

  • 寫入按順序放置在磁盤上。因此,磁盤讀寫頭的運動非常少。這使得寫入和搜索機制非常快。
  • 每當打開 HFile 時,HFile 索引就會加載到內存中。這有助於在單次查找中查找記錄。
  • 預告片是一個指向 HFile 的元塊的指針。它寫在提交文件的末尾。它包含有關時間戳和布隆過濾器的信息。
  • 布隆過濾器有助於搜索鍵值對,它會跳過不包含所需行鍵的文件。時間戳還有助於搜索文件的版本,它有助於跳過數據。

在瞭解寫入機制和各種組件在使寫入和搜索更快方面的作用之後。我將向您解釋讀取機制在 HBase 架構中是如何工作的?然後我們將轉向提高 HBase 性能的機制,如壓縮、區域拆分和恢復。

HBase 架構: 讀取機制

正如我們在搜索機制中所討論的,如果客戶端的緩存中沒有它,客戶端首先從 .META 服務器中檢索區域服務器的位置。然後它按順序執行以下步驟:

  • 爲了讀取數據,掃描器首先在塊緩存中查找行單元。這裏存儲了所有最近讀取的鍵值對。
  • 如果 Scanner 未能找到所需的結果,它會移動到 MemStore,因爲我們知道這是寫緩存內存。在那裏,它搜索最近寫入的文件,這些文件尚未轉儲到 HFile 中。
  • 最後,它將使用布隆過濾器和塊緩存從 HFile 加載數據。

到目前爲止,我已經討論了 HBase 的搜索、讀寫機制。現在我們來看看 HBase 機制,它使 HBase 中的搜索、讀取和寫入變得快速。首先,我們將瞭解Compaction,這是其中一種機制。

HBase 架構: 壓縮

HBase 結合 HFiles 以減少存儲並減少讀取所需的磁盤尋道次數。這個過程稱爲壓縮。Compaction 從一個區域中選擇一些 HFile 並將它們組合起來。如上圖所示,有兩種類型的壓縮。

  1. 次要壓縮:HBase 自動選擇較小的 HFile 並將它們重新提交到較大的 HFile,如上圖所示。這稱爲輕微壓實。它執行合併排序以將較小的 HFile 提交到較大的 HFile。這有助於優化存儲空間。
  2. Major Compaction: 如上圖所示,在Major compaction中,HBase將一個區域的較小的HFiles合併並重新提交到一個新的HFile。在這個過程中,相同的列族被放置在新的 HFile 中。它會在此過程中刪除已刪除和過期的單元格。它提高了讀取性能。

但在此過程中,輸入輸出磁盤和網絡流量可能會變得擁擠。這稱爲寫放大。因此,它通常安排在低峯值負載時間。

現在我將討論的另一個性能優化過程是 Region Split。這對於負載平衡非常重要。

HBase 架構: 區域拆分

下圖說明了 Region Split 機制。

每當一個區域變大時,它就會被分成兩個子區域,如上圖所示。每個區域正好代表父區域的一半。然後將此拆分報告給 HMaster。這由同一個 Region Server 處理,直到 HMaster 將它們分配給新的 Region Server 以進行負載平衡。

接下來,最後但並非最不重要的一點是,我將向您解釋 HBase 如何在發生故障後恢復數據。我們知道故障恢復是 HBase 的一個非常重要的特性,因此讓我們瞭解 HBase 如何在故障後恢復數據。

HBase 架構:HBase 崩潰和數據恢復

  • 每當 Region Server 出現故障時,ZooKeeper 都會通知 HMaster 故障。
  • 然後 HMaster 將崩潰的 Region Server 的區域分發並分配給許多活動的 Region Server。爲了恢復出現故障的 Region Server 的 MemStore 的數據,HMaster 將 WAL 分發給所有 Region Server。
  • 每個 Region Server 重新執行 WAL 來爲那個失敗的 region 的列族構建 MemStore。
  • 數據按時間順序(按時間順序)寫入 WAL。因此,重新執行該 WAL 意味着進行所有在 MemStore 文件中所做和存儲的更改。
  • 所以,在所有的 Region Servers 執行完 WAL 之後,所有列族的 MemStore 數據都被恢復了。

我希望這篇博客能幫助您瞭解 HBase 數據模型和 HBase 架構。希望你喜歡它。

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章