Hbase原理簡介

HBase簡介

HBase是一個構建在HDFS上的、分佈式的、面向列的開源數據庫,它是Apache Hadoop生態系統中的重要一員。

 

與mysql、oracle等關係型數據庫RDBMS基於行模式的存儲不同,HBase是基於列模式進行存儲的,這使得它非常適合於存儲海量非結構化或者半結構化的數據。通常HBase 需要構建在HDFS之上,並將其內部管理的數據文件全部存儲在HDFS中。

HBase與RDBMS比較

 

RDBMS

HBase

存儲模式

面向行

面向列(族)

事務支持

多行ACID

單行

查詢語言

SQL

提供簡單的查詢API,get/put/scan ...

索引支持

任意列可添加索引

Row key索引

數據規模

TB

PB

讀寫效率

1000/s

百萬/s

表結構

數萬行,上千列

數億行,百萬列

數據結構

每行的列完全相同

每行的列可以不同

數據佈局

空列也佔用存儲空間,緊湊

空列不佔用存儲空間,稀疏

數據多版本

不支持

支持,默認以時間戳作爲版本號

數據類型

多種類型

僅支持字符串(Byte array )

HBase與HDFS比較

相同點

HBase與HDFS都具有良好的容錯性和擴展性,都可以擴展到成百上千個節點。

不同點

HDFS適合批處理場景,不支持數據隨機查找、不適合增量數據處理、不支持數據更新。而這些HDFS不適用的這些場景剛好HBase都能滿足。

Hbase數據模型

HBase是基於Google BigTable模型開發的,典型的key/value系統。

Row Key

Row Key 可以看作是表中每條記錄的“主鍵”。

Column Family

Column Family 包含一個或者多個相關Column(列)。

Column

Column 屬於某一個 Column Family,包含在某一列中: familyName:columnName。

Version Number

每個唯一的 Row Key 可以同時保存多個版本的記錄,默認以系統時間戳作爲版本號,類型爲Long。Version Number也可由用戶指定,無需以遞增的順序插入。

Hbase物理模型

每個Column Family存儲在HDFS上的一個單獨文件中,Row Key和 Version Number在每個 Column Family中均有一份。

例如,上例中的多版本數據在Hbase中其實是這麼存儲的。

HBase 爲每個值維護了多級索引,即:<key, column family, column name, timestamp>。

物理存儲

Hbase會將Table中的所有行都按照row key的字典序排列,並將Table 在行的方向上分割爲多個Region。

Region會按大小進行分割,每個表開始只有一個Region,隨着數據增多, Region不斷增大,當增大到一個閥值的時候,Region就會等分成兩個新的region,之後會有越來越多的Region。

Region是HBase中分佈式存儲和負載均衡的最小單元。不同Region分佈到不同RegionServer上。

Region雖然是分佈式存儲的最小單元,但並不是存儲的最小單元。

每個Region由一個或者多個Store組成,每個store保存一個Column Family,每個Strore又由一個memStore和0至多個StoreFile組成。memStore 存儲在內存中, StoreFile存儲在HDFS或者磁盤上。用戶寫入的數據最先會保存在memStore 中,當memStore 中存儲的數據大小達到一定閾值的時候會將其寫入到StoreFile。

HBase架構

Client

Client包含訪問HBase的接口,並維護cache來加快對HBase的訪問。

Zookeeper

HBase 使用 ZooKeeper 來實現 Master的高可用。Master與RegionServers啓動時會向ZooKeeper進行註冊。當Master不可用時,ZooKeeper 會自動選舉一個RegionServer作爲新的Master,避免Master單點故障。

在HBase中ZooKeeper 主要的職責如下:

  • 保證任何時候,集羣中有且只有一個Master
  • 保存所有Region的尋址入口
  • 實時監控Region server的上線和下線信息,並實時通知給Master
  • 存儲HBase的schema和table元數據

默認情況下, HBase 管理ZooKeeper 實例,比如, 啓動或者停止ZooKeeper。

Master

  • 爲Region server分配region
  • 負責Region server的負載均衡
  • 發現失效的Region server並重新分配其上的region
  • 管理用戶對table的增刪改查操作

Region Server

  • 維護region,處理對這些region的IO請求
  • 負責切分在運行過程中變得過大的region

Write-Ahead-Log( WAL)

WAL(Write-Ahead-Log)預寫日誌是Hbase的RegionServer在處理數據插入和刪除的過程中用來記錄操作內容的一種日誌。

Client 向RegionServer提交數據的時候,RegionServer首先會將操作日誌寫入到HLog文件中去,只有當WAL日誌寫入成功的時候,客戶端纔會被告訴提交數據成功,然後再真正提交操作。這樣做的好處是,即使數據寫入Region失敗,也能夠根據WAL日誌中的記錄進行重試,防止數據丟失。

HBase容錯性

Master容錯

當Master不可用時,Zookeeper會重新選擇一個新的Master。

  • 無Master過程中,數據讀取仍照常進行;
  • 無master過程中, Region切分、負載均衡等無法進行;

RegionServer容錯

RegionServer定時向Zookeeper彙報心跳,如果一段時間內未出現心跳,Master會將該RegionServer上的Region重新分配到其他RegionServer上,並將失效服務器上WAL“預寫”日誌由主服務器進行分割並派送給其他RegionServer。

Region定位

當用戶通過 Row Key 檢索某一條記錄時,Hbase需要先定位到記錄所在的Region,然後再進行查找。

  • 從 ZooKeeper 獲取到 -ROOT- 表所在的Location,-ROOT-表包含.META.表所在的Region列表,這個表只會有一個Region;
  • 從.META.表中獲取到要檢索的記錄所在的Region,.META.表包含所有的用戶表的Region列表,以及RegionServer的服務器地址;
  • 在Region中檢索出相應的數據;

Hbase支持的操作

Hbase所有操作均是基於Row Key的,支持CRUD( Create、 Read、 Update和Delete)和Scan。Hbase沒有內置Join操作,可使用MapReduce解決。

單行操作:

  • Put
  • Get
  • Scan

多行操作:

  • Scan
  • MultiPut

 

 

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