慕課網《HBase 存儲原理剖析》學習總結
說明:本文部分內容來自https://www.imooc.com/article/details/id/38969
學習視頻:https://www.imooc.com/learn/996
視頻案例演示源碼:https://github.com/wind-free/springboot-HBaseDemo1.git
作者:喵手空空
鏈接:https://www.imooc.com/article/details/id/38969
來源:慕課網
作者:喵手空空
鏈接:https://www.imooc.com/article/details/id/38969
來源:慕課網
作者:喵手空空
鏈接:https://www.imooc.com/article/details/id/38969
來源:慕課網
作者:喵手空空
鏈接:https://www.imooc.com/article/details/id/38969
來源:慕課網
一、HBase的存儲模式
1.行式存儲與列式存儲介紹

列簇式存儲:概念
- 列簇(多個數據列的組合),HBase表中的每個列都歸屬於某個列簇
- 列簇是表的schame的一部分,但是列並不是
- 創建表時,需要給出列簇的名稱,不需要給出列的名稱
- 列名都是以列簇作為前綴
- 訪問控制磁盤和內存的使用統計都是在列簇層面進行
- HBase准確的說是列簇數據庫,而不是列數據庫
- 列簇數據庫將列組織為列簇,每列都必須是某個列簇的一部分
- 訪問數據的單元也是列
作者:喵手空空
鏈接:https://www.imooc.com/article/details/id/38969
來源:慕課網
2.行式存儲與列式存儲各自的特點
(1)行式存儲
維護大量的索引;
存儲成本高
不能夠做到線性擴展
隨機讀取效率非常高
對事務的支持非常好
(2)列式存儲
根據同一列數據的相似性原理,利於對數據進行壓縮
存儲成本低
由於每列數據分開存儲,可以並行查找多列的數據
3.行式存儲與列式存儲場景
(1)行式存儲
表與表之間有關聯關系,數據量不大(小於千萬量級)
強事務關聯的特性
(2)列式存儲
對於單列或者相對比較少的列獲取頻率較高
針對多列查詢,使用並行處理的查詢
利於數據壓縮和線性擴展的存儲
事務使用率不高,讀取的場景頻率不高,同時數據量非常大
隨機更新某一行的頻率不高
4.HBase的列族式存儲
(1)列族式存儲概念
列簇(多個數據列的組合),HBase表中的每個列都歸屬於某個列簇
列簇是表的schame的一部分,但是列並不是
創建表時,需要給出列簇的名稱,不需要給出列的名稱
列名都是以列簇作為前綴
訪問控制磁盤和內存的使用統計都是在列簇層面進行
HBase准確的說是列簇數據庫,而不是列數據庫
列簇數據庫將列組織為列簇,每列都必須是某個列簇的一部分
訪問數據的單元也是列
HBase表的組成

RowKey :HBase中用RowKey去標識唯一的一行數據,一行數據中包含多個列簇
Family:多個列簇。每一列簇包含多個列
Column:列標識符。每一列數據包含了版本和值
Timestamp:版本。可以理解為時間戳,也可以理解為一個數據的版本
Value:數據值。數據本身的值
數據存儲模式

其實就是HBase表反過來看的樣子
更抽象一點,其實HBase表數據就是Key-Value結構的
HBase表的組成
- Table = RowKey + Family + Column + Timestamp + Value
- RowKey :HBase中用RowKey去標識唯一的一行數據,一行數據中包含多個列簇
- Family:多個列簇。每一列簇包含多個列
- Column:列標識符。每一列數據包含了版本和值
- Timestamp:版本。可以理解為時間戳,也可以理解為一個數據的版本
- Value:數據值。數據本身的值
作者:喵手空空
鏈接:https://www.imooc.com/article/details/id/38969
來源:慕課網
圖解

HBase表的組成
- Table = RowKey + Family + Column + Timestamp + Value
- RowKey :HBase中用RowKey去標識唯一的一行數據,一行數據中包含多個列簇
- Family:多個列簇。每一列簇包含多個列
- Column:列標識符。每一列數據包含了版本和值
- Timestamp:版本。可以理解為時間戳,也可以理解為一個數據的版本
- Value:數據值。數據本身的值
作者:喵手空空
鏈接:https://www.imooc.com/article/details/id/38969
來源:慕課網
(2)列數據屬性

(3)數據存儲原型

(4)存儲示例

二、HBase數據表解析
1.HBase建表語句解析

關鍵字說明

壓縮算法

2.HBase數據存儲目錄解析
在hbase-site.xml文件中配置或查看存儲目錄的節點
<property>
<name>hbase.rootdir</name>
<value>/home/hbase_data</value>
</property>
進入到HBase系統目錄
-
- temp
當對表做創建或刪除操作時,將表移動到tmp目錄下,然后再進行處理
臨時交換的表,臨時存儲一些當前需要修改的數據結構
-
- WALs
預寫日志,被HLog實例管理的WAL文件
可以理解為存儲HBase的日志,HBase分布式數據庫系統的操作日志
-
- archive
存儲表的歸檔和快照
HBase在做分割或合並操作完成后,會將Hfile文件移動到該目錄中,然后將之前的Hfile刪除掉
是由Master上的定時任務定期去處理,這個目錄的作用可以簡單理解為去管理HBase的數據
-
- corrupt
用於存放損壞的日志文件,一般是空的
-
- data
HBase存儲數據的核心目錄
系統表和用戶表數據都存儲在這里
-
- hbase.id
HBase啟動運行后,是集群中的唯一ID,用來標識HBase進程用的
-
- hbase.version
表明了集群的文件格式版本信息
其實就是表明了Hfile的版本信息
-
- oldWALs
備份WALs中的日志文件
data目錄解析

3.HBase元信息表

三、HBase存儲設計
1.HBase中的LSM存儲思想
(1)LSM樹概念
LSM日志結構合並樹,有兩個或兩個以上存儲數據的結構組成的,每一個數據結構各自對應自己的存儲介質
(2)LSM樹的簡易模型

(3)LSM思想在HBase中的實現

2.HBase數據存儲模塊簡介
RegionServer = Region + Store + MemStore + StoreFile + HFile + HLog

3.HBase Region解析
(1)什么是Region
每一個Region都會存儲於確定的RegionServer上

(2)Region特點
-
-
- 是HBase中分布式存儲和負載均衡的最小單元
- Region的數據不能低於集群中節點的數量
- RegionServer對Region進行拆分
- 盡量讓Row key分散到不同的Region
-
4.HBase HFile 解析
Store + MemStore + StoreFile
-
- Store與列簇是一對一的關系
- MemStore是一個內存數據結構,保存修改的數據
- StoreFile是由內存數據寫入到文件后形成的

HFile 文件
-
- 是HBase存儲數據文件的最基本的組織形式
- 底層是Hadoop的二進制格式文件
- 是用戶數據的實際載體,存儲Key-Value的數據
- Scanned block section:會被讀取,主要是存儲用戶數據
- Nonscanned block section:不會被讀取,主要包含元數據塊
- Load-on-open section:RegionServer啟動時加載,主要是HFile的元數據
- Trailer:HFile的基本信息,HFile元數據的一部分

Data Block
-
- HBase中數據的最基本的存儲單元
- 是實際存儲用戶數據的數據結構
- 包含很多Key-Value

5.HBase WAL解析
(1)WAL介紹(預寫日志)
-
-
- WAL最重要的功能就是災難恢復
- WAL解決了什么問題:HA(高可用)問題
- 解決:遠程備份
-

(2)HLog
-
-
- WAL是通過HLog模塊實現的
- HLog是什么:HLog是實現WAL的類,一個RegionServer對應一個HLog實例
-

(3)HLogKey
WAL使用Hadoop的序列化文件將記錄存儲為Key-Value的數據集,Key就是HLog的Key

(4)HLogSyncer(日志同步刷寫類)

(5)HLogRoller
-
-
- 特點的時間去滾動日志,形成新的日志,避免單個日志文件過大
- 根據HLog的序列化的number對比已經持久化的HFile的序列號,刪除舊的,不需要的日志
-

6.HBase Compaction解析
(1)Compaction介紹
Compaction會從一個Region的Store中選擇一些HFile文件進行合並
(2)Compaction作業
隨着系統不停的刷寫,會導致存儲目錄中有過多的數據文件
(3)Compaction分類
-
-
- MinorCompaction:小合並
- MajorCompaction:大合並
-

(4)Compaction的觸發時機
MemStore 內存數據寫入到硬盤上

四、Hbase數據存取解析
1.HBase數據存取流程解析
(1)數據存儲
客戶端:HBase Client
-
-
- 請求Zookeeper,確定 MetaTable所在RegionServer的地址
- 在根據RowKey找到歸屬的RegionServer
- HBase Client Put(Delete)數據,提交到RegionServer
-

服務器:HBase Server
-
-
- Region Server 去獲取行鎖,Region更新共享鎖
- 寫HLog,WAL
- 寫緩存,MemStore
- 將日志同步到HDFS
- 寫滿緩存后,啟動異步線程將數據寫入到硬盤上
- 可能觸發Compaction或拆分
-

(2)數據獲取
客戶端:HBase Client
-
-
- 請求Zookeeper,確定 MetaTable所在RegionServer的地址
- 去對應的RegionServer地址拿到對應數據
-

服務端:HBase Server
-
-
- Region Server 構建RegionScanner准備進行檢索
- 有多少個列簇就構建多少個StoreScanner,用於對確定的列簇數據檢索
-

2.HBase數據存取優化
(1)存儲優化
(2)檢索(獲取)優化


3.HBase數據存取api介紹
(1)存儲數據api介紹

