一文講清HBase存儲結構

image

前言

Hbase 是一個分佈式的、多版本、面向列的開源 KV 數據庫。運行在 HDFS 的基礎上,支持 PB 級別、百萬列的數據存儲。做爲性能如此強大的KV數據庫,HBase的存儲結構到底是怎樣的呢?面向列的存儲結構究竟有什麼樣的不一樣之處呢?接下來會詳細講解這部分。數據庫

HBase的存儲結構

爲了清晰地表述這個,咱們把HBase的存儲結構分爲邏輯結構物理結構兩個部分來描述。緩存

邏輯存儲結構

經過下圖直觀地展現 HBase 的邏輯存儲結構:服務器

HBase 邏輯視圖

在本圖中,列簇(Column Family)對應的值就是 infoarea ,列( Column 或者稱爲 Qualifier )對應的就是 nameagecountrycityRow key 對應的就是 Row 1Row 2Cell 對應的就是具體的值。架構

  • Row key :表的主鍵,按照字典序排序。
  • 列簇:在 HBase 中,列簇將表進行橫向切割。
  • 列:屬於某一個列簇,在 HBase 中能夠進行動態的添加。
  • Cell : 是指具體的 Value
  • Version :在這張圖裏面沒有顯示出來,這個是指版本號,用時間戳(TimeStamp )來表示。

看完這張圖,是否是有點疑惑,怎麼獲取其中的一條數據呢?既然 HBaseKV 的數據庫,那麼固然是以獲取 KEY 的形式來獲取到 Value 啦。在 HBase 中的 KEY 組成是這樣的:負載均衡

Key 和 Value 圖

KEY 的組成是以 Row keyCF(Column Family)ColumnTimeStamp 組成的。分佈式

TimeStampHBase 中充當的做用就是版本號,由於在 HBase 中有着數據多版本的特性,因此同一個 KEY 能夠有多個版本的 Value 值(能夠經過配置來設置多少個版本)。查詢的話是默認取回最新版本的那條數據,可是也能夠進行查詢多個版本號的數據,在接下來的進階操做文章中會有演示。性能

Region Server 和 Region 的關係

Region Server 和 Region 關係圖

  • 一個 Region Server 就是一個機器節點(服務器)
  • 一個 Region Server 包含着多個 Region
  • 一個 Region 包含着多個列簇 (CF)
  • 一個 Region Server 中能夠有多張 Table,一張 Table 能夠有多個 Region

物理存儲結構

先來看這張圖:3d

Hbase架構圖

爲了避免混淆,咱們能夠先把如下的概念一一對應起來code

邏輯結構 物理結構
Region Server HRegion Server
Region HRegion
CF HStore(這裏指的是Store)

在具體的物理結構中cdn

  • HRegion Server 就是一個機器節點,包含多個 HRegion ,可是這些 HRegion 不必定是來自於同一個 Table ,負責響應的是用戶的 IO 請求,和 HDFS 進行交互,是服務器中的一個進程。
  • HRegion 包含多個 HStore
  • 一個 CF 組成一個 HStore ,默認是 10 G,若是大於 10G 會進行分裂。HStoreHBase 的核心存儲單元,一個 HStoreMemStoreStoreFile 組成。
  • MemStore 是一塊內存,默認大小是 128M,若是超過了這個大小,那麼就會進行刷盤,把內存裏的數據刷進到 StoreFile 中。
  • HStore 對應着的是 Table 裏面的 Column Family,無論有 CF 中有多少的數據,都會存儲在 HStore 中,爲了不訪問不一樣的 HStore 而致使的效率低下。
  • HRegionHbase 中分佈式存儲和負載均衡的最小單元,但不是存儲的最小單元。
  • 一個 Hstore 能夠有多個 StoreFile

在HBase中查找不一樣的CF的數據

從不一樣的 CF 中查詢 Row 3 主鍵的數據,結果集以下:

查找Row 3的數據

更加直觀地顯示,在 HBase 中是以 CF 爲單元的存儲結構。

HBase的架構

以下圖,HBase 的架構圖,在 HBase 中咱們看到有 ClientZookeeperHMasterHRegion

HBase的架構圖

  • Client 是客戶端,要求讀寫數據的發起者。
  • ZK 集羣是負責轉發 Client 的請求和提供心跳機制,會讓 HRegion ServerHRegion 註冊進來,同時保存着 RowkeyRegion 的映射關係。
  • HMaster 中能夠有多個待命,只有一個在活躍。

Hbase讀取數據的過程

Client 請求讀取數據時,先轉發到 ZK 集羣,在 ZK 集羣中尋找到相對應的 Region Server,再找到對應的 Region,先是查 MemStore,若是在 MemStore 中獲取到數據,那麼就會直接返回,不然就是再由 Region 找到對應的 Store File,從而查到具體的數據。

在整個架構中,HMasterHRegion Server 能夠是同一個節點上,能夠有多個 HMaster 存在,可是隻有一個 HMaster 在活躍。

Client 端會進行 rowkey-> HRegion 映射關係的緩存,下降下次尋址的壓力。

HBase 寫入數據的過程

在HBase中寫入數據的過程

先是 Client 進行發起數據的插入請求,若是 Client 自己存儲了關於 RowkeyRegion 的映射關係的話,那麼就會先查找到具體的對應關係,若是沒有的話,就會在ZK中進行查找到對應 Region server,而後再轉發到具體的 Region 上。全部的數據在寫入的時候先是記錄在 WAL 中,同時檢查關於 MemStore 是否滿了,若是是滿了,那麼就會進行刷盤,輸出到一個 Hfile 中,若是沒有滿的話,那麼就是先寫進 Memstore 中,而後再刷到 WAL 中。

PS:畫圖的過程是真滴累啊!!!

題圖:chichimaru

image
相關文章
相關標籤/搜索