【從零單排HBase 01】從一無所知到5分鐘快速瞭解HBase

最近公司正好準備投入HBase,因此做了一些基礎學習準備,所以先暫時停止MySQL的更新,把HBase的學習心得跟大家分享一下,接下來一段時間都會發布HBase相關內容。

在學的過程中,發現跟MySQL相互對比,能更深入地瞭解存儲組件的設計。有任何問題或者想看的知識點,歡迎留言跟我溝通。

1.前言

隨着公司業務不斷髮展,開始遇見越來越多的複雜存儲場景。我們在關係型數據庫上已經有了比較好的技術積累,但是並不能解決所有問題。

因此,需要對更多存儲類型做技術儲備。

HBase作爲nosql的典型代表,是一個分佈式的、面向列的開源數據庫,在大數據存儲上廣受歡迎,因此,第一站就來到這裏。

網絡上對於HBase的文檔有很多,但是看了一圈,沒有特別能讓一個小白快速入門的介紹。

本文作爲一個入門文檔,希望能通過自己的理解,來快速認識HBase到底是什麼,它的結構、特點、適用場景有哪些,但不會有深入的技術點的說明。

嗯,就是快速,非常快速並且絲滑地去理解HBase到底是啥。

2. 適用場景

一開始,我們肯定需要了解的是,爲什麼要用HBase。

存儲組件比較多,我們就簡單談談MySQL和HBase的主要對比。
在這裏插入圖片描述
可以看到,在面對海量數據場景時,如果沒有較強的事務要求,查詢比較簡單,那麼HBase是非常適合的。

2. 基本概念

2.1 表、行、列和單元格

爲什麼正文要從這裏開始呢?

因爲這個是一切的基礎,也是我們初次接觸HBase最先想到的問題,HBase的數據格式是怎樣的?

但是在入門HBase的過程中,發現一個小白想搞明白HBase到底是個什麼存儲格式還是挺費勁的。

比如給你這樣一個HBaes的數據結構,是不是比較難理解是一個怎樣的層級概念?
在這裏插入圖片描述
一個好的辦法就是做 知識的遷移。所以,從我們熟悉的Mysql來說,是個非常好的方式。

Mysql的表結構我們非常熟悉,所以第一個問題就是,Mysql的表記錄在HBase中是如何存儲呢?

我們來舉個例子,有兩張mysql的表,表名叫user和location,表記錄如下。

user表
在這裏插入圖片描述
location表
在這裏插入圖片描述
這樣的結構,在HBase中的邏輯存儲應該是這樣的。

在這裏插入圖片描述
抽象出來的概念如下
在這裏插入圖片描述
相信有了這樣直接的對比,不用我說,大家也能明白HBase的基本存儲概念了。

RowKey:是Byte array,是表中每條記錄的“主鍵”,方便快速查找,Rowkey的設計非常重要。
Column Family:列族,擁有一個名稱(string),包含一個或者多個相關列
Column:屬於某一個column family,familyName:columnName,每條記錄可動態添加
Value(Cell):Byte array
Version Number:類型爲Long,默認值是系統時間戳,可由用戶自定義(這個概念在上文的邏輯存儲中不太好遷移類比,所以上文的模型中沒有給出,可以理解爲mysql中的mvcc的版本號)
那麼,在HBase中確定一個值的方式就比較清楚了。
在這裏插入圖片描述
通過RowKey-CF-Column-Version我們就能找到Value,這樣就明白了KV的查詢的結構關係。

如果用代碼來簡單表示,可以這樣顯示:

SortedMap<RowKey, List<SortedMap<Column,List<Value,TimeStamp>>>>

做個小結:

最基本的單位是列(column)。一列或者多列形成行(row),並且由唯一的行鍵(row
key)來確定存儲。反過來,一個表(table)中由若干行,其中每列可能由多個版本(version),在每一個單元格(cell)中存儲了不同的值。

2.2 分區概念

上面對存儲結構做了比較直白的說明,下面介紹HBase另一個比較核心的概念:regin。

HBase中擴展和負載均衡的基本單位稱爲regin,regin本質上是以行鍵排序的連續存儲的區間。

如果regin太大,系統會自動進行拆分(在中間的行鍵進行一拆二),反之,會把多個regin合併(非自動),以減少存儲文件數量。

如果類比mysql,可以看作是分區表partition的概念。

每一個regin只能由一臺regin服務器(region server)加載,每一臺region server可以加載多個region。

3. 架構

這張圖是HBase非常經典的整體架構圖。圖中展示了HBase的各種組件。
在這裏插入圖片描述
1)Client
Client包含了訪問Hbase的接口,另外Client還維護了對應的cache來加速Hbase的訪問,比如cache的.META.元數據的信息。

2)Zookeeper
Hbase通過Zookeeper來做master的高可用、RegionServer的監控、元數據的入口以及集羣配置的維護等工作。具體工作如下:

  • 通過Zoopkeeper來保證集羣中只有1個master在運行,如果master異常,會通過競爭機制產生新的master提供服務
  • 通過Zoopkeeper來監控RegionServer的狀態,當RegionSevrer有異常的時候,通過回調的形式通知Master RegionServer上下線的信息
  • 通過Zoopkeeper存儲元數據的統一入口地址

3)HMaster

  • master節點爲RegionServer分配Region
  • 維護整個集羣的負載均衡
  • 維護集羣的元數據信息
  • 發現失效的Region,並將失效的Region分配到正常的RegionServer上
    當RegionSever失效的時候,協調對應Hlog的拆分

4)HReginServer
HregionServer直接對接用戶的讀寫請求,是真正的“幹活”的節點。它的功能概括如下:

  • 管理master爲其分配的Region 處理來自客戶端的讀寫請求
  • 負責和底層HDFS的交互,存儲數據到HDFS
  • 負責Region變大以後的拆分
  • 負責Storefile的合併工作

5)HDFS
HDFS爲Hbase提供最終的底層數據存儲服務,同時爲Hbase提供高可用(Hlog存儲在HDFS)的支持,具體功能概括如下:

  • 提供元數據和表數據的底層分佈式存儲服務
  • 數據多副本,保證的高可靠和高可用性

看到這裏了,原創不易,點個贊吧,你最好看了~

知識碎片重新梳理,構建Java知識圖譜:https://github.com/saigu/JavaKnowledgeGraph (歷史文章查閱非常方便)

掃碼關注我的公衆號“阿丸筆記”,第一時間獲取最新更新。同時可以免費獲取海量Java技術棧電子書、各個大廠面試題。
阿丸筆記

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