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)
當有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)4. 資料的合併過程當資料塊(hfile)達到3塊時,hmaster觸發合併操作,region將資料塊載入到本地,進行合併整個regionserver的memstore占用記憶體總和大於相關閾值(整個 regionserver 的 memstore 占用記憶體總和大於堆記憶體的0.4*0.95 則開始刷寫,如果達到堆記憶體的0.4則阻塞客戶端對regionserver的寫入
)wal數量(hlog)大於相關閾值
定期自動刷寫,預設是1小時
手動刷寫(api介面或者在shell中執行刷寫命令)
當第一次合併的資料超過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...