Hadoop學習筆記(四) HBase

2021-10-08 14:56:47 字數 3848 閱讀 6954

hbase是乙個高可靠性、高效能、面向列、可伸縮的分布式儲存系統,它是google bigtable的開源實現,執行於hdfs檔案系統之上,利用mapreduce處理資料,使用zookeeper作為協同服務,因此可以容錯地儲存海量稀疏的資料。

海量資料儲存,方便擴充套件

快速的隨機訪問,獨特的設計使得寫操作比讀操作有時更快

資料儲存在hdfs上,備份不用擔心

不適合做關聯查詢(join等)

client包含了訪問hbase的介面,另外client還維護了對應的cache來加速hbase的訪問,比如cache的.meta.元資料的資訊。

2. zookeeper

hbase通過zookeeper來做master的高可用、regionserver的監控、元資料的入口以及集群配置的維護等工作。通過zoopkeeper來保證集群中只有1個master在執行,如果master異常,會通過競爭機制產生新的master提供服務。

3. hmaster

為regionserver分配region

維護整個集群的元資料和負載均衡

發現失效的region,並分配到正常的regionserver上

當regionsever失效的時候,協調對應hlog的拆分

4. regionserver

處理來自客戶端的讀寫請求

與hdfs互動

負責region變大後的拆分

負責storefile的合併

5. region

hbase表的分片,hbase表會根據rowkey值被切分成不同的region儲存在regionserver中,在乙個regionserver中可以有多個不同的region。

6. store

hfile儲存在store中,乙個store對應hbase表中的乙個列族(列簇, column family)。

7. memstore

記憶體儲存,位於記憶體中,用來儲存當前的資料操作,所以當資料儲存在wal中之後,regsionserver會在記憶體中儲存鍵值對。

8. hfile

這是在磁碟上儲存原始資料的實際的物理檔案,是實際的儲存檔案。storefile是以hfile的形式儲存在hdfs的。

元件之間的關係

在hbase中,一張表由多個的hregion組成,乙個hregionserver中管理著多個hregion物件。而乙個hregion由多個hstore組成,每個hstore物件都對應著表的乙個列族(column family)。之後,乙個hstore又由乙個memstore和多個storefile組成。這些storefile就是hbase儲存在hdfs上的資料檔案,memstore表示還在記憶體中未重新整理到檔案上的那些資料。

合併與拆分:

memstore中的大小達到一定的量後,會將記憶體中的資料重新整理到磁碟,形成乙個新的storefile。隨著程式的不斷執行,storefile的數量會越來越多,所以hregionserver還需要定期的去合併這些storefile。

另外,當資料越來越多,乙個region下的storefile的總大小會越來越大,為了更好的查詢效能,hregionserver會負責將達到一定大小的region**成兩個region。

region的拆分明細

拆分公式math.min(tableregionscount^3 * initialsize, defaultregionmaxfilesize)

剛開始只有乙個region,上限為1^3 * 128 * 2=256m

當有2個region,上限為2^3 * 128 * 2=2048m

當有3個region,上限為3^3 * 128 * 2=6912m

以此類推當有4個region時候,為16g,上限達到了10gb,最大值就保持在了10g,region數量再增加也不會增加上限

面試題1. hbase 讀流程

client先訪問zookeeper,獲取meta表的(regionserver)位址,meta表中儲存了使用者表的資訊

根據namespace、表名和rowkey在meta表中找到對應的region資訊和對應regionserver的位址

查詢region,先從memstore找資料,若沒有,再到blockcache裡面讀

blockcache也沒有,則到storefile裡面讀

若是從storefile裡讀的資料,則先寫入blockcache再返回給客戶端

2. hbase 寫流程

client想regionserver傳送寫請求

regionserver先將資料寫到hlog(write ahead log),為了資料的持久化和恢復

regionserver將資料寫到記憶體memstore

通知client寫成功

3. 資料flush過程

當memstore資料達到閾值(預設是128m,老版本是64m),將記憶體中的資料刷寫到硬碟,然後刪除記憶體中的數和hlog中的歷史資料

將資料儲存到hdfs中

在hlog中做標記點

flush觸發條件:region中所有memstore占用記憶體超過相關閾值(hbase.hregion.memstore.flush.size * hbase.hregion.memstore.block.multiplier,128 * 4 = 512m)

整個regionserver的memstore占用記憶體總和大於相關閾值(整個 regionserver 的 memstore 占用記憶體總和大於堆記憶體的0.4*0.95 則開始刷寫,如果達到堆記憶體的0.4則阻塞客戶端對regionserver的寫入

)wal數量(hlog)大於相關閾值

定期自動刷寫,預設是1小時

手動刷寫(api介面或者在shell中執行刷寫命令)

4. 資料的合併過程當資料塊(hfile)達到3塊時,hmaster觸發合併操作,region將資料塊載入到本地,進行合併

當第一次合併的資料超過256m(此值是根據配置算出的),進行拆分,將拆分後的region分配給不同的regionserver管理

當regionserver宕機後,將regionserver上的hlog拆分,(hlog是之前同步到hdfs的),然後分配給不同的regionserver處理,修改meta元資料表

5. **成的兩個region大小一定一樣嗎?

不一定,因為切分region時,是根據rowkey來的,剛好中間的middlerowkey比較大的話,則包含middlerowkey的部分更大。

6. rowkey的設計原則:

長度原則:一般設計成定長,10-100byte,合理利用時間戳_|等字元

雜湊原則:盡量使rowkey均勻分布在各個hbase節點上

唯一原則:設計上必須保證rowkey的唯一性

排序原則:這個看情況使用,rowkey是按照ascii有序的,有時時間戳反轉也很有幫助

Hadoop學習筆記(四)Hadoop偽分布式配置

這一篇是介紹hadoop偽分布式的配置中的hadoop的配置。第一部分是hadoop1.0配置,第二部分是hadoop2.0的配置,大家可以自己選擇檢視。linux配置可以檢視hadoop學習筆記 三 linux環境配置 hadoop的五個核心守護程序有 namenode,secondaryname...

Hadoop學習筆記(四) Shuffle階段

1.定義 shuffle是指map任務輸出到reduce任務輸入的過程。2.目的 在hadoop集群中,大部分map任務與reduce任務在不同的節點執行。因此,reduce任務在執行時需要跨節點去獲取map的輸出結果。如果集群上有很多作業,那麼網路資源消耗會很嚴重,需要最大化減少不必要的資源。另外...

Hadoop學習筆記(四) HDFS概述

hdfs hadoop distributed file system 分布式檔案儲存系統。hdfs的架構 mapreduce的結構 namenode 是整個檔案系統的管理節點,它維護著整個檔案系統的檔案目錄樹,檔案 目錄的元資訊和每個檔案對應的資料塊列表。接收使用者的操作請求。檔案包括 fsima...