本次分享的內容主要分為以下五點:
- HBase基本知識;
- HBase讀寫流程;
- RowKey設計要點;
- HBase生態介紹;
- HBase典型案例分析,
首先我們簡單介紹一下 HBase 是什么,

HBase 最開始是受 Google 的 BigTable 啟發而開發的分布式、多版本、面向列的開源資料庫,其主要特點是支持上億行、百萬列,支持強一致性、并且具有高擴展、高可用等特點,
既然 HBase 是一種分布式的資料庫,那么其和傳統的 RMDB 有什么區別的呢?我們先來看看HBase表核心概念,理解這些基本的核心概念對后面我理解 HBase 的讀寫以及如何設計 HBase 表有著重要的聯系,

HBase 表主要由以下幾個元素組成:
- RowKey:表中每條記錄的主鍵;
- Column Family:列族,將表進行橫向切割,后面簡稱CF;
- Column:屬于某一個列族,可動態添加列;
- Version Number:型別為Long,默認值是系統時間戳,可由用戶自定義;
- Value:真實的資料,
大家可以從上面的圖看出:一行(Row)資料是可以包含一個或多個 Column Family,但是我們并不推薦一張 HBase 表的 Column Family 超過三個,Column 是屬于 Column Family 的,一個 Column Family 包含一個或多個 Column,
在物理層面上,所有的資料其實是存放在 Region 里面的,而 Region 又由 RegionServer 管理,其對于的關系如下:

- Region:一段資料的集合;
- RegionServer:用于存放Region的服務,
從上面的圖也可以清晰看到,一個 RegionServer 管理多個 Region;而一個 Region 管理一個或多個 Column Family,
到這里我們已經了解了 HBase 表的組成,但是 HBase 表里面的資料到底是怎么存盤的呢?

上面是一張從邏輯上看 HBase 表形式,這個和關系型資料庫很類似,那么如果我們再深入看,可以看出,這張表的劃分可以如下圖表示,

從上圖大家可以明顯看出,這張表有兩個 Column Family ,分別為 personal 和 office,而 personal 又有三列name、city 以及 phone;office 有兩列 tel 以及 address,由于存盤在 HBase 里面的表一般有上億行,所以 HBase 表會對整個資料按照 RowKey 進行字典排序,然后再對這張表進行橫向切割,切割出來的資料是存盤在 HFile 里面,而不同的 Column Family 雖然屬于一行,但是其在底層存盤是放在不同的 HFile 里,所以這張表我用了六種顏色表示,也就是說,這張表的資料會被放在六個 HFile 里面的,這就可以把資料盡可能的分散到整個集群,
在前面我們介紹了 HBase 其實是面向列的資料庫,所以說一行 HBase 的資料其實是分了好幾行存盤,一個列對應一行,HBase 的 KV 結構如下:

為了簡便起見,在后面的表示我們洗掉了類似于 Key Length 的屬性,只保留 Row Key、Column Family、Column Qualifier等資訊,所以 RowKey 為 Row1 的資料第一串列示為上圖最后一行的形式,以此類推,整個表的存盤就可以如下表示:

大家可以從上面的 kv 表現形式看出,Row11 的 phone 這列其實是沒有資料的,在 HBase 的底層存盤里面也就沒有存盤這列了,這點和我們傳統的關系型資料庫有很大的區別,有了這個特點, HBase 特別適合存盤稀疏表,
我們前面也將了 HBase 其實是多版本的,那如果我們修改了 HBase 表的一列,HBase 又是如何存盤的呢?

比如上如中我們將 Row1 的 city 列從北京修改為上海了,如果使用 KV 表示的話,我們可以看出其實底層存盤了兩條資料,這兩條資料的版本是不一樣的,最新的一條資料版本比之前的新,總結起來就是:
- HBase支持資料多版本特性,通過帶有不同時間戳的多個KeyValue版本來實作的;
- 每次put,delete都會產生一個新的Cell,都擁有一個版本;
- 默認只存放資料的三個版本,可以配置;
- 查詢默認回傳最新版本的資料,可以通過制定版本號或版本數獲取舊資料,
到這里我們已經了解了 HBase 表及其底層的 KV 存盤了,現在讓我們來了解一下 HBase 是如何讀寫資料的,首先我們來看看 HBase 的架構設計,這種圖來自于社區:

HBase 的寫程序如下:
- 先將資料寫到WAL中;
- WAL 存放在HDFS之上;
- 每次Put、Delete操作的資料均追加到WAL末端;
- 持久化到WAL之后,再寫到MemStore中;
- 兩者寫完回傳ACK到客戶端,

MemStore 其實是一種記憶體結構,一個Column Family 對應一個MemStore,MemStore 里面的資料也是對 Rowkey 進行字典排序的,如下:

HBase 在風控場景、車聯網/物聯網、廣告推薦、電子商務等行業有這廣泛的使用,下面是四個典型案例的架構,由于圖片里有詳細的文字,我就不再打出來了,




轉存失敗重新上傳取消
轉存失敗重新上傳取消
轉存失敗重新上傳取消
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280655.html
標籤:其他
