HBase

香芹胡萝卜炒鸡片發表於2024-07-02

請回答以下問題。
1.由於資料過多,HBase 頻繁地 Region 分裂,什麼方法最合適?
A.預分 Region B.增大 Region 大小 C.增大 MemStore,減少 Flush D.提升 RegionServer 資源。

一、HBase 簡介

HBase 資料模型

HBase 的底層物理儲存結構(K-V)來看,HBase 更像是一個 Multi-dimensional(多維) Map。

HBase 邏輯結構

HBase 儲存結構

StoreFile(HFile)
StoreFile 以 HFile 格式儲存在 HDFS 上,是在磁碟上儲存原始資料的實際的物理檔案,是實際的儲存檔案。

  • Data Block:儲存表中的資料,這部分可以被壓縮。資料存放在 Data 塊中,Data 塊的大小可以使用者指定,大的 Data 塊適合 Scan,小的 Data 塊適合隨機查詢。
  • Meta Block(可選):儲存使用者自定義的 Key-Value 對,可以被壓縮。HFile 裡面的每個 KeyValue 對就是一個簡單的 Byte 陣列。但是這個 Byte 陣列裡麵包含了很多項,並且有固定的結構。
  • File Info:HFile 的元資訊,不可被壓縮,使用者也可以在著一部分新增自己的元資訊。
  • Data Block Index:Data Block 的索引。每條索引的 Key 是被索引的 Block 的第一條記錄的 Key,同時需要將索引一次性讀入記憶體。
  • Meta Block Index:Meta Block 的索引,同 Data Block Index 段。
  • Trailer:這一段是定長的。儲存了每一段的偏移量,讀取一個 HFile 時,會首先讀取 Trailer,Trailer 儲存了每個段的起始位置(段的 Magic Number 用來做安全 Check),然後 DataBlock Index 會被讀取到記憶體中。DataBlock Index 採用 LRU 機制淘汰。

HFile 中 Block 儲存的資料
HFile 裡面的每個 KeyValue 對就是一個簡單的 Byte 陣列。但是這個 Byte 陣列裡包含了很多項,並且有固定結構。

開始是兩個固定長度的數值,分別表示 Key 的長度和 Value 的長度。緊接著是 Key,開始是固定長度的數值,表示 Rowkey 的長度,緊接著是 Rowkey,然後是固定長度的數值,表示 Family 的長度,然後是 Column Family,接著 Column Qualifier(限定符),然後是兩個固定長度的數值,表示 TimeStamp 和 Key Type(Put/Delete)。Value 部分沒有這麼複雜的結構,就是純粹的二進位制資料了。
在 HFile 中的資料是按 Rowkey、Column Family、Column 排序,對相同的 Cell(即這三個值都一樣),則按 TimeStamp 倒序排列

Store(HStore)
HFile 儲存在 Store 中,一個 Store 對應 HBase 表中的一個列族 Column Family,即每個 Column Family 就是一個集中的儲存單元,因此最好就具有相近 IO 特性的 Column 儲存在一個 Column Family,以實現高效讀取(資料區域性性原理,可以提高快取的命中率)。

一個 HRegion 由多個 Store 組成,一個 Store 由一個 MemStore 和 0 個或多個 HFile 組成,Store 包括記憶體的 MemStore 和位於硬碟的 StoreFile。

MemStore
記憶體儲存,位於記憶體中,用來儲存當前的資料操作。
每個 HStore 中都有一個 MemStore,即它是一個 HRegion 的一個 Column Family 對應一個例項。它的排列順序以 Rowkey、Column Family、Column 的順序以及 TimeStamp 的倒序(HFile 已經說過)。客戶端檢索資料時,先在 MemStore 找,找不到再找 StoreFile。

寫操作先寫入 MemStore,當 MemStore 中的資料量達到某個閾值(預設為 128M),或者 HRegionServer 上所有 MemStore 的大小超過了機器上預設 40% 的記憶體使用量,或者 WAL 過大這三種情況下,HRegionServer 啟動 Flashcache 程序寫入 StoreFile,每次寫入形成單獨一個 StoreFile,輸出多個 StoreFile 後,當 StoreFile 數量達到閾值時,將多個合併成一個大的 StoreFile。當 StoreFile 大小超過一定閾值後,會把當前的 Region 分割成兩個,並由 HMaster 分配給相應的 Region 伺服器,實現負載均衡。

HBase 物理結構

  1. Table 中的所有行都按照 Rowkey 的字典順序進行排列,HBase 就是一個龐大的 HashMap,Rowkey 字典順就是類似 HashMap 中的 Key 的雜湊演算法排序的。
  2. Table 在透過 Rowkey 來進行行的方向上分割為多個 HRegion,類似於 Hadoop 下 MapReduce 中的檔案切割。
  3. HRgion 是按大小分割的(預設為 10G),每個表一開始只有一個 HRegion,隨著表中的資料不斷增加,HRegion 不斷增大,當增大到一個閾值的時候,HRegion 就會分為兩個新的 HRegion,當表中的行不斷增多,就會有越來越多的 HRgion。
  4. HRegion 是 HBase 中分散式儲存和負載均衡的最小單元。最小單元表示不同 HRegion 可以分佈在不同的 HRegionServer 上。但是一個 HRegion 是不會拆分到多個 Server 上的。
  5. HRegion 雖然是負載均衡的最小單元,但並不是物理儲存的最小單元。事實上,HRegion 是由一個或多個 Store 組成,每個 Store 儲存一個 Column Family。每個 Store 又由一個 MemStore 和 0 到多個 StoreFile 組成。
HBase 術語解釋

NameSpace:名稱空間,類似關係型資料庫 DataBase。HBase 預設自帶兩個名稱空間,分別為 Hbase、default,hbase 中存放的是 HBase 內建系統表,default 表是使用者預設使用的名稱空間。

Table:表,類似關係型資料庫 Table。HBase 定義表只需要宣告列族即可,資料屬性比如超時時間(TTL),壓縮演算法(COMPRESSION)等,都在列族的定義中定義,不需要宣告具體的列,這意味著,往 HBase 寫入資料時,欄位可以動態、按需指定。

Row:行,HBase 的行資料都由一個 Rowkey 和多個 Column (列)組成。一個行包含了多個列,這些列透過列族來分類,行中的資料所屬列族只能從該表所定義的列族中選取,不能查詢這個表中不存在的列族,否則報錯。

Rowkey:行健,Rowkey 有使用者指定的一串不重複的字串定義,是一行的唯一標識!資料是按照 Rowkey 的字典順序儲存的,並且查詢資料時只能根據 Rowkey 進行檢索,所以 Rowkey 的設計十分重要,設計 Key 時,要充分考慮排序儲存這個特性,將經常一起讀取的行儲存放到一起。(位置相關性)
HRegion 大小達到一定值值時,會進行按 Rowkey 裂變,HBase Table 中的行的三種方式。

  1. 透過單個 Rowkey 訪問
  2. 透過 Rowkey 的 Range(正則)
  3. 全表掃描

Column Family:列族,是多個列的集合,一個列族可以動態地靈活定義多個列。表的相關屬性大部分都定義在列族上,同一個表裡的不同列族可以有完全不同的屬性配置,但是同一個列族內的所有列都會有相同的屬性。

每個列族對應一個 Store,也對應 HDFS 一個目錄,類似於 Hive 分割槽操作一樣,HBase 相當於按列族進行了分割槽。列族是表的 Schema 的一部分(而列不是,Schema 包含表名和列族)。

訪問控制、磁碟和記憶體的使用統計都是在列族層面進行的。列族越多,在取一行資料時所要參與 IO、搜尋的檔案就越多。如果沒有必要,不要設定太多列族。

Column Qualifier:列限定符,列是可以隨意定義的,一個行的列不限名字、不限數量,只限定列族。因此列必須依賴於列族存在!列的名稱前必須要戴著其所屬的列族!例如 info:name, info:age。

TimeStamp:時間戳,用於標識資料的不同版本(version)。時間戳預設由系統指定,讀取預設獲取最新版本的資料返回。

每個 Cell 都儲存著同一份資料的多個版本,版本透過時間戳來索引,時間戳的型別是 64 為整型。一定要用單 Cell 中不重複的時間戳。HBase 提供兩種機制:保留最新的 N 條資料,或保留截止當下多長時間的資料。

Region:域。
Region 由一個表若干行組成!在 Region 中行的排序按照行健(Rowkey)字典排序。
Region 不能跨 RegionServer,且當資料量大的時候,HBase 會拆分 Region。
Region 由 RegionServer 程序管理。HBase 在進行負載均衡的時候,一個 Region 有可能會從當前 RegionServer 移動到其他 RegionServer 上。
Region 是基於 HDFS 的,它的所有資料存取操作都是呼叫了 HDFS 的客戶端介面來實現的。

Cell:單元格,Cell 是儲存資料的最小單元Cell 由{Rowkey, Column Family: Column Qualifier, TimeStamp} 確定,Cell 中的資料是沒有型別的,全部是位元組碼形式存貯的。

VersionNum:版本號,每條資料可以有多個版本號,預設值為系統時間戳,型別為 Long。

WAL:WAL 意為 Write-Ahead logs,HLog 檔案就是一個普通的 Hadoop Sequence File,類似 MySQL 中的 BinLog,用來做災難恢復時用,HLog 記錄資料的所有變更,一旦資料修改,就可以從 Log 中進行恢復。

當對 HBase 讀寫資料的時候,資料不是直接寫進磁碟,她會在記憶體中保留一段時間(時間以及資料量閾值可以設定)。所有寫操作都會先保證將資料寫入這個 Log 檔案(每個 RegionServer 維護一個 HLog,每個 HRegionServer 只有一個)後,才會真正更新 MemStore,最後寫入 HFile 中。這樣即使 HRegionServer 當機,我們依然可以從 HLog 中恢復資料。
HLog 的切分機制:

  1. 當資料寫入 HLog 以後,HBase 發生異常,關閉當前的 HLog 檔案。
  2. 當日志的大小達到 HDFS 資料塊的 0.95 倍的時候,關閉當前日誌,生成新的日誌。
  3. 每隔一小時生成一個新的日誌檔案。

HBase 1.0 以後的版本,多個 WAL 並行寫(MultiWAL),實現採用 HDFS 的多個管道寫,以單個 HRegion 為單位。

HFile 內部最佳化
在最新版本的 HBase 中,為了解決 HFile 中不定長部分的記憶體佔用,特別是 Bloom File(海量資料 Block File 所佔記憶體空間)和 Block Index 過大。吧 Bloom File 和 Block Index 打散放入 Data,每次查詢不用載入全部資訊。它本質上就是一個多層的類B+樹索引,採用這種設計,可以實現不需要讀取整個檔案。

Data Block 中的 Cell 都是升序排列,每個 Block 都有它自己的 Leaf-Index,每個 Block 的最後一個 Key 被放入 Intermediate-Index 中,Root-Index 指向 Intermediate-Index。Bloom 過濾器用於快速定位沒有在 DataBlock 中的資料。

Store(HStore):
HFile 儲存在 Store

HBase 基礎架構

HBase 依然採用 Master/Worker 架構搭建叢集,它隸屬於 Hadoop 生態圈,依附於 Zookeeper 叢集的協調一致性服務,有HMaster 節點和 HRegionServer 節點組成。而在底層,將資料儲存在 HDFS 中,因而涉及到 HDFS 的 NameNode、DataNOde 等,總體結構如下:

Client 客戶端

HBase 有一張特殊的表 META 儲存了使用者 Table 的 RegionInfo 資訊,它可以被切分成多個 Region。
Zookeeper 也有一張特殊的表 ROOT 儲存了 META 表的 RegionInfo 資訊。 而 META 表則

Zookeeper 叢集協調一致性服務

  • 協調監督保障 HMaster 高可用,透過 Failover 競爭機制產生新的 HMaster。
  • 監控 HRegionServer 的狀態,HMaster 會透過 Zookeeper 收到 HRegionServer 上下線狀態。
  • 後設資料入口地址,ROOT 表在哪臺伺服器上,ROOT 這張表的位置資訊,儲存 HBase 的 Schema,包括有哪些 Table,每個 Table 有哪些 Column Family,包括具體的資料段放在哪個 RegionServer 上。Zookeeper 中記錄了讀取資料所需要的源資料表 hbase:meta,因此關閉 Zookeeper 後,客戶端無法實現讀操作的!

HMaster 主節點

  • 故障轉移:監控 HRegionServer,當某 HRegionServer 異常或死亡,將 HRegion 轉移到其他 HRegionServer 上執行(透過與 Zookeeper 的 HeartBeat 和監聽 Zookeeper 中的狀態,並https://img2024.cnblogs.com/blog/1644206/202405/1644206-20240520143213793-1512492846.png不直接和 Slave 相連)。
  • 新 HRegion:HRegion 分裂後的重新分配。
  • 後設資料變更(Admin 職能):增刪改 Table 操作:Create、Delete、alter,這些操作可能需要跨多個 RegionServer,需要 HMaster 來進行協調。
  • 資料負載均衡:空閒時在 HRegionServer 之間遷移 HRegion。
  • 傳送自己位置給 Client:透過 Zookeeper 實現。
    HMaster 主節點類似於 Hadoop 系統 Yarn 核心體系中的元件 ResourceManager 的 ResourceScheduler,進行資源分配和排程。
    即使 HMaster 程序當機,叢集依然可以執行資料的讀寫,只是不能進行表的建立和修改操作!

HRegionServer 節點

  • 處理分配的 HRegion,對於資料的操作:get、put、delete。
  • 重新整理 Cache(讀寫快取) 到 HDFS
  • 維護 WAL(Write Ahead Log, HLog)(高容錯)
  • 處理來自使用者 Client 的讀寫請求
  • 處理 HRegion 變大後的拆分 SplitRegion。
  • 負責 StoreFile 的合併工作 CompactRegion。
    Client 訪問 HBase 資料的過程不需要 HMaster 參與,從 Zookeeper 獲取 RegionServer 地址,HMaster 僅僅維護著 Table 和 Region 的後設資料資訊,負載很低。

BigTable 指出:一個 HRegionServer 可以存放 1000 個 HRegion(透過配置檔案更改)

HBase 使用 Rowkey 將表水平切割成多個 HRegion,從 HMaster 的角度,每個 HRegion 都紀錄了它的 StartKey 和 EndKey(第一個 HRegion 的 StartKey 為空,最後一個 HRegion 的 EndKey 為空,類似連結串列),由於 Rowkey 是排序的,因而 Client 可以透過 HMaster 快速定位每個 Rowkey 在哪個 HRegion 中。

底層 Table 資料儲存於 HDFS 中,而 HRegion所處理的資料儘量和資料所在的 DataNode 在一起,實現資料的本地化,資料本地化並不是總能實現,比如在 HRegion (因 Split)移動,需要等到下一次 Compact 才能繼續回到本地化。

HDFS

  • 提供後設資料和表資料的底層分散式儲存服務。
  • WAL(Write Ahead Log, HLog) 落盤。
  • 資料多副本,保證高可靠、高可用。

二、HBase 安裝

略(2024-09 補充)

三、HBase Shell 操作

其他操作
# 進入HBase Shell 命令列
hbase shell
# 檢視叢集狀態
status
# 檢視版本
version
# 檢視操作使用者及組資訊
whoami
# 檢視錶操作資訊
table help
# 檢視幫助資訊
help
# 檢視具體命令的幫助(引號是必須的)
help 'get'
表操作
# 列舉表(list 後可以使用 * 萬用字元來進行表的過濾)
list
# 建立表,需要指定表名和列族名,至少需要指定一個列族
# 可以指定表的列,表的列需要指定在列族上
create 'tablename',{}

附錄:概念介紹

HBase 大規模採用的原因。

關係型資料庫查詢瓶頸:
① 高併發的更新(插入、修改、刪除)
② 多表關聯後的複雜查詢,頻繁的 group by、order by。

CAP 定理

  • Consistency(強一致性):資料更新操作的一致性,所有資料變動都是同步的。
  • Availabbility(高可用性):良好的響應效能。
  • Partition tolerance:可靠性。
    Brewer 教授給出的定理是:任何分散式可同時滿足二點,沒法三者兼顧。
    Brewer 教授給出的忠告是:架構師不要將精力 浪費在如何設計能滿足三者的完美分散式系統,而是應該進行取捨。
NoSQL(分散式、不支援事務、鍵值對儲存)

最早出現於 1998 年,Carlo Strozzi 開發的一個輕量、開源、不提供 SQL 功能的資料庫。
NoSQL 被普遍理解為"Not Only SQL",NoSQL 和傳統的關係型資料庫在很多場景下是相輔相成的,誰也不能完全替代誰。
NoSQL 與 RDBMS 對比

HBase 起源

2006 年 Google 技術人員 Fay Chang 釋出了一篇文章 Bigtable:ADistributed Storage System for Structured Data。
2007 年 Powerset 公司基於此文研發了 BigTable 的 Java 開源版本,即 HBase。剛開始它只是 Hadoop 的一部分。
2008 年 HBase 成為了 Apache 頂級專案,HBase 幾乎實現了 BigTable 的所有特性。
2010 年 HBase 的開發速度打破了一直以來跟 Hadoop 版本一致的慣例。

HBase 生態全技術
  • Lily — 基於 HBase 的 CRM(客戶關係資料系統管理)
  • OpenTSDB — HBase 面向時間序列資料管理
  • Kylin — HHBase 上的 OLAP(聯機分析處理)
  • Phoenix — SQL 操作 HBase 工具
  • Splice Machine — 基於 HBase 的 OLTP(聯機事務處理)
  • APache Tephra — HBase 事務支援
  • TiDB — 分散式 SQL DB
  • Apache Omid — 最佳化事務管理
  • Yarn Application Timeline Server v.2 遷移到 HBase
  • Hive MetaData 儲存可以遷移到 HBase
  • Ambari Metrics Server 將使用 HBase 做資料儲存
HBase 特點
  1. 海量儲存:HBase 良好的擴充套件性,才為海量資料的儲存提供了便利。適合單表超千萬,上億,且高併發的場景,不適合實時性要求不高,資料規模不大,有資料分析的場景。
  2. 列式儲存:HBase 根據列族來儲存資料,列族下面可以有很多的列,列族在建立表時就必須指定。需要注意的是,列族理論上可以很多,但實際上建議不要超過 6 個。
  3. 極易擴充套件:基於上層處理能力(RegionServer)的擴充套件,基於儲存的擴充套件(HDFS)。
  4. 高併發:在高併發的情況下,HBase 單個 IO 延遲下降並不多,能獲得高併發、低延遲的服務。
  5. 稀疏:HBase 列的靈活性,在列族中,你可以指定任意多的列,在列資料為空的情況下,是不會佔用儲存空間的
HBase 優點
  1. 高容錯,高擴充套件。HBase 基於 HDFS 實現資料的儲存,擁有與生俱來的超強的擴充套件性和吞吐量。
  2. HBase 採用的是 Key/Value 的儲存方式,這意味著,即便面臨海量資料的增長,也不會導致查詢效能下降。
  3. HBase 是列式資料庫,可以將相同的列(以 Region 為單位)儲存到不同的服務示例上,分散負載壓力。
HBase 缺點
  1. 架構設計複雜,只適合儲存海量資料。
  2. HBase 不支援表的關聯操作,資料分析是 HBase 的弱項,常見的 group by 或者 order by 只能透過編寫 Spark、MapReduce 來實現!

相關文章