HBase學習記錄 Day01 2022/2/22
- 為什么選擇HBase
- HBase邏輯結構
- HBase物理結構
- HBase架構
- HBase詳細架構
- HBase三層結構
- HBase寫流程
- HBase讀流程
- 為什么選擇HBase
1、海量存盤
Hbase適合存盤PB級別的海量資料,在PB級別的數,能在幾十到幾百毫秒內回傳資料,這與Hbase的極 易擴展性息息相關,正是因為Hbase良好的擴展性,才為海量資料的存盤提供了便利,
2、列式存盤
這里的列式存盤其實說的是列族存盤,Hbase是根據列族來存盤資料的,HBase中的每個列都由Column Family(列族)和Column Qualifier(列限定符)進行限定,例如info:name,info:age,
3、極易擴展
Hbase的擴展性主要體現在兩個方面,一個是基于上層處理能力(RegionServer)的擴展,一個是基于 存盤的擴展(HDFS), 通過橫向添加RegionSever的機器,進行水平擴展,提升Hbase上層的處理能力,提升Hbsae服務更多 Region的能力,
4、稀疏
稀疏主要是針對Hbase列的靈活性,在列族中,你可以指定任意多的列,在列資料為空的情況下,是不 會占用存盤空間的,
5、 資料多版本
資料多版本:每個單元中的資料可以有多個版本,默認情況下,版本號自動分配,版本號就是單元格插 入時的時間戳,
- HBase邏輯結構

- HBase物理結構

資料模型
1)Name Space
命名空間,類似于關系型資料庫的 DatabBase 概念,每個命名空間下有多個表,HBase 有兩個自帶的命名空間,分別是 hbase 和 default,hbase 中存放的是 HBase 內置的表, default 表是用戶默認使用的命名空間,
2)Region
類似于關系型資料庫的表概念,不同的是,HBase 定義表時只需要宣告列族即可,不需 要宣告具體的列,這意味著,往 HBase 寫入資料時,欄位可以動態、按需指定,因此,和關 系型資料庫相比,HBase 能夠輕松應對欄位變更的場景,
3)Row HBase
表中的每行資料都由一個 RowKey 和多個 Column(列)組成,資料是按照 RowKey 的字典順序存盤的,并且查詢資料時只能根據 RowKey 進行檢索,所以 RowKey 的設計十分重 要,
4)Column
HBase 中的每個列都由 Column Family(列族)和 Column Qualifier(列限定符)進行限 定,例如 info:name,info:age,建表時,只需指明列族,而列限定符無需預先定義,
5)Time Stamp
用于標識資料的不同版本(version),每條資料寫入時,如果不指定時間戳,系統會 自動為其加上該欄位,其值為寫入 HBase 的時間,
- HBase架構

架構角色:
1)Region Server
Region Server 為 Region 的管理者,其實作類為 HRegionServer,主要作用如下: 對于資料的操作:get, put, delete; 對于 Region 的操作:splitRegion、compactRegion,
2)Master
Master 是所有 Region Server 的管理者,其實作類為 HMaster,主要作用如下: 對于表的操作:create, delete, alter 對于 RegionServer的操作:分配 regions到每個RegionServer,監控每個 RegionServer 的狀態,負載均衡和故障轉移,
3)Zookeeper
HBase 通過 Zookeeper 來做 Master 的高可用、RegionServer 的監控、元資料的入口以及 集群配置的維護等作業,
4)HDFS
HDFS 為 HBase 提供最終的底層資料存盤服務,同時為 HBase 提供高可用的支持,
- HBase詳細架構

- HBase三層結構
| Zookeeper檔案 | 記錄-ROOT-表的位置資訊 |
| -ROOT-表 | 記錄.META表的Region位置資訊 |
| .MATE表 | 記錄用戶資料表的Region位置資訊 |
- HBase寫流程

寫流程:
1)Client 先訪問 zookeeper,獲取 hbase:meta 表位于哪個 Region Server,
2)訪問對應的 Region Server,獲取 hbase:meta 表,根據讀請求的 namespace:table/rowkey, 查詢出目標資料位于哪個 Region Server 中的哪個 Region 中,并將該 table 的 region 資訊以 及 meta 表的位置資訊快取在客戶端的 meta cache,方便下次訪問,
3)與目標 Region Server 進行通訊;
4)將資料順序寫入(追加)到 WAL;
5)將資料寫入對應的 MemStore,資料會在 MemStore 進行排序;
6)向客戶端發送 ack;
7)等達到 MemStore 的刷寫時機后,將資料刷寫到 HFile,
- MemStore Flush

MemStore 刷寫時機:
1.當某個 memstroe 的大小達到了 hbase.hregion.memstore.flush.size(默認值 128M), 其所在 region 的所有 memstore 都會刷寫,
當 memstore 的大小達到了 hbase.hregion.memstore.flush.size(默認值 128M) * hbase.hregion.memstore.block.multiplier(默認值 4) 時,會阻止繼續往該 memstore 寫資料,
2.當 region server 中 memstore 的總大小達到 java_heapsize *hbase.regionserver.global.memstore.size(默認值 0.4) *hbase.regionserver.global.memstore.size.lower.limit(默認值 0.95), region 會按照其所有 memstore 的大小順序(由大到小)依次進行刷寫,直到 region server 中所有 memstore 的總大小減小到上述值以下,
當 region server 中 memstore 的總大小達到 java_heapsize*hbase.regionserver.global.memstore.size(默認值 0.4) 時,會阻止繼續往所有的 memstore 寫資料,
3. 到達自動刷寫的時間,也會觸發 memstore flush,自動重繪的時間間隔由該屬性進行 配置 hbase.regionserver.optionalcacheflushinterval(默認 1 小時),
4.當 WAL 檔案的數量超過 hbase.regionserver.max.logs,region 會按照時間順序依次進行刷寫,直到 WAL 檔案數量減小到 hbase.regionserver.max.log 以下(該屬性名已經廢棄, 現無需手動設定,最大值為 32),
- HBase讀流程

讀流程
1)Client 先訪問 zookeeper,獲取 hbase:meta 表位于哪個 Region Server,
2)訪問對應的 Region Server,獲取 hbase:meta 表,根據讀請求的 namespace:table/rowkey, 查詢出目標資料位于哪個 Region Server 中的哪個 Region 中,并將該 table 的 region 資訊以 及 meta 表的位置資訊快取在客戶端的 meta cache,方便下次訪問,
3)與目標 Region Server 進行通訊;
4)分別在 Block Cache(讀快取),MemStore 和 Store File(HFile)中查詢目標資料,并將 查到的所有資料進行合并,此處所有資料是指同一條資料的不同版本(time stamp)或者不 同的型別(Put/Delete),
5) 將從檔案中查詢到的資料塊(Block,HFile 資料存盤單元,默認大小為 64KB)快取到 Block Cache,
6)將合并后的最終結果回傳給客戶端,
- StoreFile Compaction
由于memstore每次刷寫都會生成一個新的HFile,且同一個欄位的不同版本(timestamp) 和不同型別(Put/Delete)有可能會分布在不同的 HFile 中,因此查詢時需要遍歷所有的 HFile,為了減少 HFile 的個數,以及清理掉過期和洗掉的資料,會進行 StoreFile Compaction,
Compaction 分為兩種,分別是 Minor Compaction 和 Major Compaction,Minor Compaction 會將臨近的若干個較小的 HFile 合并成一個較大的 HFile,但不會清理過期和洗掉的資料, Major Compaction 會將一個 Store 下的所有的 HFile 合并成一個大 HFile,并且會清理掉過期 和洗掉的資料,

- Region Split
默認情況下,每個 Table 起初只有一個 Region,隨著資料的不斷寫入,Region 會自動進 行拆分,剛拆分時,兩個子 Region 都位于當前的 Region Server,但處于負載均衡的考慮, HMaster 有可能會將某個 Region 轉移給其他的 Region Server,
Region Split 時機:
1.當1個region中的某個Store下所有StoreFile的總大小超過hbase.hregion.max.filesize, 該 Region 就會進行拆分(0.94 版本之前),
2. 當 1 個 region 中 的 某 個 Store 下所有 StoreFile 的 總 大 小 超 過 Min(R^2 * "hbase.hregion.memstore.flush.size",hbase.hregion.max.filesize"),該 Region 就會進行拆分,其 中 R 為當前 Region Server 中屬于該 Table 的個數(0.94 版本之后),

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/435413.html
標籤:大數據
