什麼是HBase?終於有人講明白了

来源:https://www.cnblogs.com/datadance/archive/2022/05/30/16327298.html
-Advertisement-
Play Games

一、初識HBase HBase 是一個面向列式存儲的分散式資料庫,其設計思想來源於 Google 的 BigTable 論文。HBase 底層存儲基於 HDFS 實現,集群的管理基於 ZooKeeper 實現。HBase 良好的分散式架構設計為海量數據的快速存儲、隨機訪問提供了可能,基於數據副本機制 ...


一、初識HBase

HBase 是一個面向列式存儲的分散式資料庫,其設計思想來源於 Google 的 BigTable 論文。HBase 底層存儲基於 HDFS 實現,集群的管理基於 ZooKeeper 實現。HBase 良好的分散式架構設計為海量數據的快速存儲、隨機訪問提供了可能,基於數據副本機制和分區機制可以輕鬆實現線上擴容、縮容和數據容災,是大數據領域中 Key-Value 數據結構存儲最常用的資料庫方案。

HBase特點

易擴展

Hbase 的擴展性主要體現在兩個方面,一個是基於運算能力(RegionServer) 的擴展,通過增加 RegionSever 節點的數量,提升 Hbase 上層的處理能力;另一個是基於存儲能力的擴展(HDFS),通過增加 DataNode 節點數量對存儲層的進行擴容,提升 HBase 的數據存儲能力。(拓展: 圖文詳解 HDFS 的工作機制及其原理

海量存儲

HBase 作為一個開源的分散式 Key-Value 資料庫,其主要作用是面向 PB 級別數據的實時入庫和快速隨機訪問。這主要源於上述易擴展的特點,使得 HBase 通過擴展來存儲海量的數據。

列式存儲

Hbase 是根據列族來存儲數據的。列族下麵可以有非常多的列。列式存儲的最大好處就是,其數據在表中是按照某列存儲的,這樣在查詢只需要少數幾個欄位時,能大大減少讀取的數據量。

高可靠性

WAL 機制保證了數據寫入時不會因集群異常而導致寫入數據丟失,Replication 機制保證了在集群出現嚴重的問題時,數據不會發生丟失或損壞。而且 Hbase 底層使用 HDFS,HDFS 本身也有備份。

稀疏性

在 HBase 的列族中,可以指定任意多的列,為空的列不占用存儲空間,表可以設計得非常稀疏。

模塊組成

HBase 可以將數據存儲在本地文件系統,也可以存儲在 HDFS 文件系統。在生產環境中,HBase 一般運行在 HDFS 上,以 HDFS 作為基礎的存儲設施。HBase 通過 HBase Client 提供的 Java API 來訪問 HBase 資料庫,以完成數據的寫入和讀取。HBase 集群主由HMaster、Region Server 和 ZooKeeper 組成。

HMaster

  • 負責管理 RegionServer,實現其負載均衡;
  • 管理和分配 Region,比如在 Region split時分配新的 Region,在 RegionServer 退出時遷移其內的 Region 到其他 RegionServer上;
  • 管理namespace和table的元數據(實際存儲在HDFS上);
  • 許可權控制(ACL)。

RegionServer

  • 存放和管理本地 Region;
  • 讀寫HDFS,管理Table中的數據;
  • Client 從 HMaster 中獲取元數據,找到 RowKey 所在的 RegionServer 進行讀寫數據。

ZooKeeper

  • 存放整個 HBase集群的元數據以及集群的狀態信息;
  • 實現HMaster主從節點的failover。

二、HBase 數據模型

HBase 是一個面向列式存儲的分散式資料庫。HBase 的數據模型與 BigTable 十分相似。在 HBase 表中,一條數據擁有一個全局唯一的鍵(RowKey)和任意數量的列(Column),一列或多列組成一個列族(Column Family),同一個列族中列的數據在物理上都存儲在同一個 HFile 中,這樣基於列存儲的數據結構有利於數據緩存和查詢。 HBase 中的表是疏鬆地存儲的,因此用戶可以動態地為數據定義各種不同的列。HBase中的數據按主鍵排序,同時,HBase 會將表按主鍵劃分為多個 Region 存儲在不同 Region Server 上,以完成數據的分散式存儲和讀取。

HBase 根據列成來存儲數據,一個列族對應物理存儲上的一個 HFile,列族包含多列列族在創建表的時候被指定。

1.Column Family

Column Family 即列族,HBase 基於列劃分數據的物理存儲,一個列族可以包含包意多列。

一般同一類的列會放在一個列族中,每個列族都有一組存儲屬性:

  • 是否應該緩存在記憶體中;
  • 數據如何被壓縮或行鍵如何編碼等。

HBase 在創建表的時候就必須指定列族。HBase的列族不是越多越好,官方薦一個表的列族數量最好小於或者等於3,過多的列族不利於 HBase 數據的管理和索引。

2.RowKey

RowKey的概念與關係型資料庫中的主鍵相似,HBase 使用 RowKey 來唯一標識某行的數據。

訪問 HBase 數據的方式有三種:

  • 基於 RowKey的單行查詢;
  • 基於RowKey的範圍查詢;
  • 全表掃描查詢。

3.Region

HBase 將表中的數據基於 RowKey 的不同範圍劃分到不同 Region 上,每個Region都負責一定範圍的數據存儲和訪問。

每個表一開始只有一個 Region,隨著數據不斷插入表,Region 不斷增大,當增大到一個閥值的時候,Region 就會等分成兩個新的 Region。當table中的行不斷增多,就會有越來越多的 Region。

另外,Region 是 Hbase 中分散式存儲和負載均衡的最小單元,不同的 Region 可以分佈在不同的 HRegion Server上。但一個Hregion是不會拆分到多個server上的。 拓展:談一下你對 HBase 的認識?

這樣即使有一個包括上百億條數據的表,由於數據被劃分到不同的 Region上,每個 Region 都可以獨立地進行寫入和查詢,HBase 寫查詢時候可以於多 Region 分散式併發操作,因此訪問速度也不會有太大的降低。

4.TimeStamp

TimeStamp 是實現 HBase 多版本的關鍵。在HBase 中,使用不同 TimeStamp 來標識相同RowKey對應的不同版本的數據。相同 RowKey的數據按照 TimeStamp 倒序排列。預設查詢的是最新的版本,當然用戶也可以指定 TimeStamp 的值來讀取指定版本的數據。

三、列式存儲會被廣泛用在OLAP中

不知是否有小伙伴們疑問,為什麼列式存儲會廣泛地應用在 OLAP 領域,和行式存儲相比,它的優勢在哪裡?今天我們一起來對比下這兩種存儲方式的差別。

其實,列式存儲並不是一項新技術,最早可以追溯到 1983 年的論文 Cantor。然而,受限於早期的硬體條件和應用場景,傳統的事務型資料庫(OLTP)如 Oracle、MySQL 等關係型資料庫都是以行的方式來存儲數據的。

直到近幾年分析型資料庫(OLAP)的興起,列式存儲這一概念又變得流行,如 HBase、Cassandra 等大數據相關的資料庫都是以列的方式來存儲數據的。

行式存儲的原理與特點

對於 OLAP 場景,大多都是對一整行記錄進行增刪改查操作的,那麼行式存儲採用以行的行式在磁碟上存儲數據就是一個不錯的選擇。

當查詢基於需求欄位查詢和返回結果時,由於這些欄位都埋藏在各行數據中,就必須讀取每一條完整的行記錄,大量磁碟轉動定址的操作使得讀取效率大大降低。

舉個例子,下圖為員工信息emp表。

數據在磁碟上是以行的形式存儲在磁碟上,同一行的數據緊挨著存放在一起。

對於 emp 表,要查詢部門 dept 為 A 的所有員工的名字。

select name from emp where dept = A

由於 dept 的值是離散地存儲在磁碟中,在查詢過程中,需要磁碟轉動多次,才能完成數據的定位和返回結果。

列式存儲的原理與特點

對於 OLAP 場景,一個典型的查詢需要遍歷整個表,進行分組、排序、聚合等操作,這樣一來行式存儲中把一整行記錄存放在一起的優勢就不復存在了。而且,分析型 SQL 常常不會用到所有的列,而僅僅對其中某些需要的的列做運算,那一行中無關的列也不得不參與掃描。

然而在列式存儲中,由於同一列的數據被緊挨著存放在了一起,如下圖所示。

那麼基於需求欄位查詢和返回結果時,就不許對每一行數據進行掃描,按照列找到需要的數據,磁碟的轉動次數少,性能也會提高。

還是上面例子中的查詢,由於在列式存儲中 dept 的值是按照順序存儲在磁碟上的,因此磁碟只需要順序查詢和返回結果即可。

列式存儲不僅具有按需查詢來提高效率的優勢,由於同一列的數據屬於同一種類型,如數值類型,字元串類型等,相似度很高,還可以選擇使用合適的編碼壓縮可減少數據的存儲空間,進而減少IO提高讀取性能。

總的來說,行式存儲和列式存儲沒有說誰比誰更優越,只能說誰更適合哪種應用場景。

四、HBase 的架構組成

HBase 作為 NoSQL 資料庫的代表,屬於三駕馬車之一 BigTable 的對應實現,HBase 的出現很好地彌補了大數據快速查詢能力的空缺。在前面咱們也有介紹過 HBase 的數據模型,感興趣的小伙伴可以翻看下。

HBase 的核心架構由五部分組成,分別是 HBase Client、HMaster、Region Server、ZooKeeper 以及 HDFS。它的架構組成如下圖所示。

下麵我們對 HBase 架構組成的每一部分詳細介紹一下。

1.HBase Client

HBase Client 為用戶提供了訪問 HBase 的介面,可以通過元數據表來定位到目標數據的 RegionServer,另外 HBase Client 還維護了對應的 cache 來加速 Hbase 的訪問,比如緩存元數據的信息。

2.HMaster

HMaster 是 HBase 集群的主節點,負責整個集群的管理工作,主要工作職責如下:

  • 分配Region:負責啟動的時候分配Region到具體的 RegionServer;
  • 負載均衡:一方面負責將用戶的數據均衡地分佈在各個 Region Server 上,防止Region Server數據傾斜過載。另一方面負責將用戶的請求均衡地分佈在各個 Region Server 上,防止Region Server 請求過熱;
  • 維護數據:發現失效的 Region,並將失效的 Region 分配到正常的 RegionServer 上,並且在Region Sever 失效的時候,協調對應的HLog進行任務的拆分。

3.Region Server

Region Server 直接對接用戶的讀寫請求,是真正的幹活的節點,主要工作職責如下。

  • 管理 HMaster 為其分配的 Region;
  • 負責與底層的 HDFS 交互,存儲數據到 HDFS;
  • 負責 Region 變大以後的拆分以及 StoreFile 的合併工作。

與 HMaster 的協同:當某個 RegionServer 宕機之後,ZK 會通知 Master 進行失效備援。下線的 RegionServer 所負責的 Region 暫時停止對外提供服務,Master 會將該 RegionServer 所負責的 Region 轉移到其他 RegionServer 上,並且會對所下線的 RegionServer 上存在 MemStore 中還未持久化到磁碟中的數據由 WAL 重播進行恢復。

下麵給大家詳細介紹下 Region Serve數據存儲的基本結構,如下圖所示。一個 Region Server 是包含多個 Region 的,這裡僅展示一個。

  • Region:每一個 Region 都有起始 RowKey 和結束 RowKey,代表了存儲的Row的範圍,保存著表中某段連續的數據。一開始每個表都只有一個 Region,隨著數據量不斷增加,當 Region 大小達到一個閥值時,Region 就會被 Regio Server 水平切分成兩個新的 Region。當 Region 很多時,HMaster 會將 Region 保存到其他 Region Server 上。

  • Store:一個 Region 由多個 Store 組成,每個 Store 都對應一個 Column Family, Store 包含 MemStore 和 StoreFile。

    • MemStore:作為HBase的記憶體數據存儲,數據的寫操作會先寫到 MemStore 中,當MemStore 中的數據增長到一個閾值(預設64M)後,Region Server 會啟動 flasheatch 進程將 MemStore 中的數據寫人 StoreFile 持久化存儲,每次寫入後都形成一個單獨的 StoreFile。當客戶端檢索數據時,先在 MemStore中查找,如果MemStore 中不存在,則會在 StoreFile 中繼續查找。
    • StoreFile:MemStore 記憶體中的數據寫到文件後就是StoreFile,StoreFile底層是以 HFile 的格式保存。HBase以Store的大小來判斷是否需要切分Region。

當一個Region 中所有 StoreFile 的大小和數量都增長到超過一個閾值時,HMaster 會把當前Region分割為兩個,並分配到其他 Region Server 上,實現負載均衡。

  • HFile:HFile 和 StoreFile 是同一個文件,只不過站在 HDFS 的角度稱這個文件為HFile,站在HBase的角度就稱這個文件為StoreFile。

  • HLog:負責記錄著數據的操作日誌,當HBase出現故障時可以進行日誌重放、故障恢復。例如,磁碟掉電導致 MemStore中的數據沒有持久化存儲到 StoreFile,這時就可以通過HLog日誌重放來恢複數據。

4.ZooKeeper

HBase 通過 ZooKeeper 來完成選舉 HMaster、監控 Region Server、維護元數據集群配置等工作,主要工作職責如下:

  • 選舉HMaster:通ooKeeper來保證集中有1HMaster在運行,如果 HMaster 異常,則會通過選舉機制產生新的 HMaster 來提供服務;
  • 監控Region Server: 通過 ZooKeeper 來監控 Region Server 的狀態,當Region Server 有異常的時候,通過回調的形式通知 HMaster 有關Region Server 上下線的信息;
  • 維護元數據和集群配置:通過ooKeeper儲B信息並對外提供訪問介面。

5.HDFS

HDFS 為 HBase 提供底層數據存儲服務,同時為 HBase提供高可用的支持, HBase 將 HLog 存儲在 HDFS 上,當伺服器發生異常宕機時,可以重放 HLog 來恢複數據。

五、HBase 的寫入流程

瞭解下 HBase 是如何寫入數據的,然後再講解一下一個比較經典的面試題。

Region Server 定址

  1. HBase Client 訪問 ZooKeeper;
  2. 獲取寫入 Region 所在的位置,即獲取 hbase:meta 表位於哪個 Region Server;
  3. 訪問對應的 Region Server;
  4. 獲取 hbase:meta 表,並查詢出目標數據位於哪個 Region Server 中的哪個 Region 中。並將該 table 的 Region 信息以及 meta 表的位置信息緩存在客戶端的 meta cache,方便下次訪問;

寫 Hlog

  1. HBase Client 向 Region Server 發送寫 Hlog 請求;
  2. Region Server 會通過順序寫入磁碟的方式,將 Hlog 存儲在 HDFS 上;

寫 MemStore 並返回結果

  1. HBase Client 向 Region Server 發送寫 MemStore 請求;
  2. 只有當寫 Hlog 和寫 MemStore 的請求都成功完成之後,並將反饋給 HBase Client,這時對於整個 HBase Client 寫入流程已經完成。

MemStore 刷盤

HBase 會根據 MemStore 配置的刷盤策略定時將數據刷新到 StoreFile 中,完成數據持久化存儲。

為什麼要把 WAL 載入到 MemStore中,再刷寫成 HFile 呢?

WAL (Write-Ahead-Log) 預寫日誌是 HBase 的 RegionServer 在處理數據插入和刪除過程中用來記錄操作內容的一種日誌。每次Put、Delete等一條記錄時,首先將其數據寫入到 RegionServer 對應的 HLog 文件中去。

而WAL是保存在HDFS上的持久化文件,數據到達 Region 時先寫入 WAL,然後被載入到 MemStore 中。這樣就算Region宕機了,操作沒來得及執行持久化,也可以再重啟的時候從 WAL 載入操作並執行。

那麼,我們從寫入流程中可以看出,數據進入 HFile 之前就已經被持久化到 WAL了,而 WAL 就是在 HDFS 上的,MemStore 是在記憶體中的,增加 MemStore 並不能提高寫入性能,為什麼還要從 WAL 載入到 MemStore中,再刷寫成 HFile 呢?

  • 數據需要順序寫入,但 HDFS 是不支持對數據進行修改的;
  • WAL 的持久化為了保證數據的安全性,是無序的;
  • Memstore在記憶體中維持數據按照row key順序排列,從而順序寫入磁碟;

所以 MemStore 的意義在於維持數據按照RowKey的字典序排列,而不是做一個緩存提高寫入效率。

六、HBase 的讀流程

Region Server 定址

HBase Client 請求 ZooKeeper 獲取元數據表所在的 Region Server的地址。

Region 定址

HBase Client 請求 RegionServer 獲取需要訪問的元數據,查詢出目標數據位於哪個 Region Server 中的哪個 Region 中。並將該 table 的 region 信息以 及 meta 表的位置信息緩存在客戶端的 meta cache,方便下次訪問。

數據讀取

HBase Client 請求數據所在的 Region Server,獲取所需要的數據。 Region 首先在 MemStore 中查找,若命中則返回;如果在MemStore 中找不到,則通過 BloomFilter 判斷數據是否存在;如果存在,則在:StoreFile 中掃描並將結果返回客戶端。

七、HBase 的數據刪除

HBase 的數據刪除操作並不會立即將數據從磁碟上刪除,因為 HBase 的數據通常被保存在 HDFS 中,而 HDFS 只允許新增或者追加數據文件,所以刪除操作主要對要被刪除的數據進行標記。

當執行刪除操作時,HBase 新插入一條相同的 Key-Value 數據,但是 keyType=Delete,這便意味著數據被刪除了,直到發生 Major_compaction 操作,數據才會真正地被從磁碟上刪除。

HBase這種基於標記刪除的方式是按順序寫磁碟的的,因此很容易實現海量數據的快速刪除,有效避免了在海量數據中查找數據、執行刪除及重建索引等複雜的流程。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》 源代碼:https://github.com/LanLinnet/STM33F103R6 項目要求 掌握SPI匯流排通信規則,使用單片機每隔1s讀取一次溫度感測器TC72的溫度值,並通過串口將讀取的溫度值發送出去。 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 概述 VMware Workstation Pro 是行業標準桌面 Hypervisor(虛擬化技術),使用它可在 Windows 或 Linux 桌面上運行 Windows、Linux 和 BSD 虛擬機。 什麼意思呢? VMware Work ...
  • firewalld 1、firewalld firewalld防火牆是centos7系統預設的防火牆管理工具取代了之前的iptables防火牆 工作在網路層、屬於包括過濾防火牆 firewalld和iptables都是用來管理防火牆的工具(屬於用戶狀態)來定義防火牆的各種規則功能 內部結構都指向ne ...
  • 痞子衡嵌入式半月刊: 第 55 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • 一、PL/SQL簡介 1)SQL是一種標準化的結構化查詢語言,在資料庫領域有著廣泛的應用和重大影響。但是SQL並不能完成一個過程所能完成的任務,如某一個條件成立進行數據插入,否則不進行數據插入。 2)PL/SQL是Oracle公司對SQL語言的擴展,全面支持所有的SQL操作與數據類型。 3)PL/S ...
  • ClickHouse的由來 ClickHouse是什麼資料庫?ClickHouse速度有多快?應用場景是怎麼樣的?ClickHouse是關係型資料庫嗎?ClickHouse目前是很火爆的一款面向OLAP的數據,可以提供秒級的大數據查詢。 Google於2003~2006年相繼發表了三篇論文“Goog ...
  • - Jedis - 優點:以 Redis 命令作為方法名稱,學習成本低廉,簡單且實用 - 缺點:Jedis 的實例是線程不安全的,在多線程的環境下需要基於線程池來使用 - lettuce(spring 官方預設) - 基於 Netty 實現的,支持同步、非同步和響應式編程方式,並且是線程安... ...
  • redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...