最近公司正好準備投入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技術棧電子書、各個大廠面試題。