1. 程式人生 > >分散式儲存HBASE原理學習

分散式儲存HBASE原理學習

HBase定義 HBase 是一個高可靠、高效能、面向列、可伸縮的分散式儲存系統,利用Hbase技術可在廉價PC Server上搭建 大規模結構化儲存叢集。 HBase 是Google Bigtable 的開源實現,與Google Bigtable 利用GFS作為其檔案儲存系統類似, HBase 利用Hadoop HDFS 作為其檔案儲存系統;Google 執行MapReduce 來處理Bigtable中的海量資料, HBase 同樣利用Hadoop MapReduce來處理HBase中的海量資料;Google Bigtable 利用Chubby作為協同服務, HBase 利用Zookeeper作為對應。 HBase簡介

Hbase-Hadoop Database是一個高可用、高效能、面向列、可伸縮、實時讀寫的分散式資料庫 。 可伸縮:可根據負載增減節點。 面向列:相對於行式資料庫,空間利用率高。 利用HadoopHDFS作為其檔案儲存系統,利用Hadoop MapReduce來處理HBase中的海量資料,利用Zookeeper作為分散式協同服務。 主要用來儲存非結構化和半結構化資料。 HBase 儲存結構 從HBase的架構圖上可以看出,HBase中的儲存包括HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog等,本課程統一介紹他們的作用即儲存結構。 以下是 HBase 儲存架構圖: Hbase
HBase中的每張表都通過行鍵按照一定的範圍被分割成多個子表(HRegion),預設一個HRegion超過256M就要被分割成兩個,這個過程由HRegionServer管理,而HRegion的分配由HMaster管理。 HMaster 1、 為Region server分配region。 2、 負責Region server的負載均衡。 3、發現失效的Region server並重新分配其上的region。 4、 HDFS上的垃圾檔案回收。 5、 處理schema更新請求。 HRegionServer 可以看到,client訪問hbase上的資料並不需要master參與(定址訪問zookeeper和region server,資料讀寫訪問region server),master僅僅維護table和region的元資料資訊(table的元資料資訊儲存在zookeeper上),負載很低。 HRegionServer存取一個子表時,會建立一個HRegion物件,然後對錶的每個列族建立一個Store例項,每個Store都會有一個MemStore和0個或多個StoreFile與之對應,每個StoreFile都會對應一個HFile, HFile就是實際的儲存檔案。因此,一個HRegion有多少個列族就有多少個Store。 一個HRegionServer會有多個HRegion和一個HLog。
HRegion table在行的方向上分隔為多個Region。Region是HBase中分散式儲存和負載均衡的最小單元,即不同的region可以分別在不同的Region Server上,但同一個Region是不會拆分到多個server上。 Region按大小分隔,每個表一般是隻有一個region。隨著資料不斷插入表,region不斷增大,當region的某個列族達到一個閾值(預設256M)時就會分成兩個新的region。 每個region由以下資訊標識: 1、< 表名,startRowkey,建立時間> 2、由目錄表(-ROOT-和.META.)記錄該region的endRowkey HRegion定位:Region被分配給哪個Region Server是完全動態的,所以需要機制來定位Region具體在哪個region server。 HBase使用三層結構來定位region: 1、 通過zk裡的檔案/hbase/rs得到-ROOT-表的位置。-ROOT-表只有一個region。 2、通過-ROOT-表查詢.META.表的第一個表中相應的region的位置。其實-ROOT-表是.META.表的第一個region;.META.表中的每一個region在-ROOT-表中都是一行記錄。 3、通過.META.表找到所要的使用者表region的位置。使用者表中的每個region在.META.表中都是一行記錄。 -ROOT-表永遠不會被分隔為多個region,保證了最多需要三次跳轉,就能定位到任意的region。client會將查詢的位置資訊儲存快取起來,快取不會主動失效,因此如果client上的快取全部失效,則需要進行6次網路來回,才能定位到正確的region,其中三次用來發現快取失效,另外三次用來獲取位置資訊。 table 和region 的關係 table 預設最初只有一個region,隨著記錄數的不斷增加而變大,起初的region會逐漸分裂成多個region,一個region有【startkey,endkey】表示,不同的region會被master分配給相應的regionserver管理 region 是hbase分散式儲存和負載均衡的最小單元,不同的region分不到不同的regionserver 注意:region 雖然是分散式儲存的最小單元,但並不是儲存的最小單元 region 是由一個或者多個store 組成的,每個store就是一個 column family 每個stroe 又由一個memstore 和 1至多個store file組成(memstore 到一個閾值會重新整理,寫入到storefile,有hlog 來保證資料的安全性,一個 regionserver 有且只有一個hlog) Store 每一個region由一個或多個store組成,至少是一個store,hbase會把一起訪問的資料放在一個store裡面,即為每個ColumnFamily建一個store,如果有幾個ColumnFamily,也就有幾個Store。一個Store由一個memStore和0或者多個StoreFile組成。 HBase以store的大小來判斷是否需要切分region。 MemStore memStore 是放在記憶體裡的。儲存修改的資料即keyValues。當memStore的大小達到一個閥值(預設64MB)時,memStore會被flush到檔案,即生成一個快照。目前hbase 會有一個執行緒來負責memStore的flush操作。 StoreFile memStore記憶體中的資料寫到檔案後就是StoreFile,StoreFile底層是以HFile的格式儲存。 HFile HBase中KeyValue資料的儲存格式,是hadoop的二進位制格式檔案。 首先HFile檔案是不定長的,長度固定的只有其中的兩塊:Trailer和FileInfo。Trailer中有指標指向其他資料塊的起始點,FileInfo記錄了檔案的一些meta資訊。 Data Block是hbase io的基本單元,為了提高效率,HRegionServer中有基於LRU的block cache機制。每個Data塊的大小可以在建立一個Table的時候通過引數指定(預設塊大小64KB),大號的Block有利於順序Scan,小號的Block利於隨機查詢。每個Data塊除了開頭的Magic以外就是一個個KeyValue對拼接而成,Magic內容就是一些隨機數字,目的是防止資料損壞,結構如下。 HFile結構圖如下: 在這裡插入圖片描述 Data Block段用來儲存表中的資料,這部分可以被壓縮。 Meta Block段(可選的)用來儲存使用者自定義的kv段,可以被壓縮。 FileInfo段用來儲存HFile的元資訊,不能被壓縮,使用者也可以在這一部分新增自己的元資訊。 Data Block Index段(可選的)用來儲存Meta Blcok的索引。 Trailer這一段是定長的。儲存了每一段的偏移量,讀取一個HFile時,會首先讀取Trailer,Trailer儲存了每個段的起始位置(段的Magic Number用來做安全check),然後,DataBlock Index會被讀取到記憶體中,這樣,當檢索某個key時,不需要掃描整個HFile,而只需從記憶體中找到key所在的block,通過一次磁碟io將整個 block讀取到記憶體中,再找到需要的key。DataBlock Index採用LRU機制淘汰。 HFile的Data Block,Meta Block通常採用壓縮方式儲存,壓縮之後可以大大減少網路IO和磁碟IO,隨之而來的開銷當然是需要花費cpu進行壓縮和解壓縮。目標HFile的壓縮支援兩種方式:gzip、lzo。 HLog 其實HLog檔案就是一個普通的Hadoop Sequence File, Sequence File的value是key時HLogKey物件,其中記錄了寫入資料的歸屬資訊,除了table和region名字外,還同時包括sequence number和timestamp,timestamp是寫入時間,sequence number的起始值為0,或者是最近一次存入檔案系統中的sequence number。 Sequence File的value是HBase的KeyValue物件,即對應HFile中的KeyValue。 HLog(WAL log):WAL意為write ahead log,用來做災難恢復使用,HLog記錄資料的所有變更,一旦region server 宕機,就可以從log中進行恢復。