Hbase原理分享

一、HBase簡介

Hbase是什么
HBase是一種構建在HDFS之上的分布式、面向列、多版本、非關系型的數據庫。在需要實時讀寫、隨機訪問超大規模數據集時,可以使用HBase。HBase 是Google Bigtable 的開源實現。

HBase的特點
大:一個表可以有上億行,上百萬列。
面向列:面向列(組)的存儲和權限控制,列(組)獨立檢索。
稀疏:對于為空(NULL)的列,并不占用存儲空間,因此,表可以設計的非常稀疏。
無模式:每一行都有一個可以排序的主鍵和任意多的列,列可以根據需要動態增加,同一張表中不同的行可以有截然不同的列。
數據多版本:每個單元中的數據可以有多個版本,默認情況下,版本號自動分配,版本號就是單元格插入時的時間戳。
數據類型單一:HBase中的數據都是字符串,沒有類型,存儲在hbase上的都是字節數組。

二、HBase數據模型

HBase 以表的形式存儲數據。表由行和列組成。列劃分為若干個列族(row family),如下圖所示。


1) HBase的邏輯數據模型

image.png

2) HBase的物理數據模型

image.png

邏輯數據模型中空白cell在物理上是不存儲的,因此若一個請求為要獲取t8時間的contents:html,他的結果就是空。相似的,若請求為獲取t9時間的anchor:my.look.ca,結果也是空。但是,如果不指明時間,將會返回最新時間的行,每個最新的都會返回

  • Row Key
    與 NoSQL 數據庫一樣,Row Key 是用來檢索記錄的主鍵。幾種訪問 HBase table 中的行方式:
    1)通過單個 Row Key 訪問。
    2)通過 Row Key 的 range 全表掃描。
    3)Row Key 可以使任意字符串(最大長度是64KB,實際應用中長度一般為 10 ~ 100bytes),在HBase 內部,Row Key 保存為字節數組。

  • 列族
    HBase 表中的每個列都歸屬于某個列族。列族是表的 Schema 的一部分(而列不是),必須在使用表之前定義。列名都以列族作為前綴,例如 courses:history、courses:math 都屬于 courses 這個列族。
    訪問控制、磁盤和內存的使用統計都是在列族層面進行的。在實際應用中,列族上的控制權限能幫助我們管理不同類型的應用, 例如,允許一些應用可以添加新的基本數據、一些應用可以讀取基本數據并創建繼承的列族、 一些應用則只允許瀏覽數據(甚至可能因為隱私的原因不能瀏覽所有數據)。

  • Cell
    時間戳HBase 中通過 Row 和 Columns 確定的一個存儲單元稱為 Cell。每個 Cell 都保存著同一份數據的多個版本。 版本通過時間戳來索引,時間戳的類型是 64 位整型。時間戳可以由HBase(在數據寫入時自動)賦值, 此時時間戳是精確到毫秒的當前系統時間。時間戳也 可以由客戶顯示賦值。如果應用程序要避免數據版本沖突,就必須自己生成具有唯一性的時間戳。每個 Cell 中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。
    為了避免數據存在過多版本造成的管理(包括存儲和索引)負擔,HBase 提供了兩種數據版本回收方式。 一是保存數據的最后 n 個版本,二是保存最近一段時間內的版本(比如最近七天)。用戶可以針對每個列族進行設置。

3) HBase物理存儲
Table 在行的方向上分割為多個HRegion,每個HRegion分散在不同的RegionServer中。


每個HRegion由多個Store構成,每個Store由一個memStore和0或多個StoreFile組成,每個Store保存一個Columns Family

三、HBase系統架構

1) HBase架構圖


從HBase的架構圖上可以看出,HBase中的組件包括Client、Zookeeper、HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog等,接下來介紹他們的作用。
HBase中的每張表都通過行鍵按照一定的范圍被分割成多個子表(HRegion),默認一個HRegion超過256M就要被分割成兩個,這個過程由HRegionServer管理,而HRegion的分配由HMaster管理。

  • Client
    包含訪問HBase的接口,并維護cache來加快對HBase的訪問。

  • Zookeeper
    HBase依賴Zookeeper,默認情況下HBase管理Zookeeper實例(啟動或關閉Zookeeper),Master與RegionServers啟動時會向Zookeeper注冊。
    保證任何時候,集群中只有一個master
    實時監控Region server的上線和下線信息。并實時通知給master
    存儲HBase的schema和table元數據

  • HMaster
    為Region server分配region
    負責Region server的負載均衡
    發現失效的Region server并重新分配其上的region。
    處理schema更新請求。

  • HRegionServer
    維護master分配給他的region,處理對這些region的io請求。
    負責切分正在運行過程中變的過大的region。
    注意:client訪問hbase上的數據時不需要master的參與,因為數據尋址訪問zookeeper和region server,而數據讀寫訪問region server。master僅僅維護table和region的元數據信息,而table的元數據信息保存在zookeeper上,因此master負載很低。

  • HRegion
    table在行的方向上分隔為多個Region。Region是HBase中分布式存儲和負載均衡的最小單元,即不同的region可以分別在不同的Region Server上,但同一個Region是不會拆分到多個server上。
    Region按大小分隔,每個表一般是只有一個region。隨著數據不斷插入表,region不斷增大,當region的某個列族達到一個閾值時就會分成兩個新的region。
    每個region由以下信息標識:< 表名,startRowkey,創建時間>
    由目錄表(-ROOT-和.META.)記錄該region的endRowkey

  • Store
    每一個region由一個或多個store組成,至少是一個store,hbase會把一起訪問的數據放在一個store里面,即為每個 ColumnFamily建一個store,如果有幾個ColumnFamily,也就有幾個Store。一個Store由一個memStore和0或者 多個StoreFile組成。 HBase以store的大小來判斷是否需要切分region

  • MemStore
    memStore 是放在內存里的。保存修改的數據即keyValues。當memStore的大小達到一個閥值(默認128MB)時,memStore會被flush到文 件,即生成一個快照。目前hbase 會有一個線程來負責memStore的flush操作。

  • StoreFile
    memStore內存中的數據寫到文件后就是StoreFile,StoreFile底層是以HFile的格式保存。

  • HFile
    HBase中KeyValue數據的存儲格式,HFile是Hadoop的 二進制格式文件,實際上StoreFile就是對Hfile做了輕量級包裝,即StoreFile底層就是HFile
    HFile的存儲格式如下:



    HFile由多個Data Block、Meta Block、FileInfo、Data Index、Meta Index、Trailer組成,其中Data Block是HBase的最小存儲單元,在前文中提到的BlockCache就是基于Data Block的緩存的。一個Data Block由一個魔數和一系列的KeyValue(Cell)組成,魔數是一個隨機的數字,用于表示這是一個Data Block類型,以快速監測這個Data Block的格式,防止數據的破壞。Data Block的大小可以在創建Column Family時設置(HColumnDescriptor.setBlockSize()),默認值是64KB,大號的Block有利于順序Scan,小號Block利于隨機查詢,因而需要權衡。Meta塊是可選的,FileInfo是固定長度的塊,它紀錄了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。Data Index和Meta Index紀錄了每個Data塊和Meta塊的其實點、未壓縮時大小、Key(起始RowKey?)等。Trailer紀錄了FileInfo、Data Index、Meta Index塊的起始位置,Data Index和Meta Index索引的數量等。其中FileInfo和Trailer是固定長度的。
    HFile里面的每個KeyValue對就是一個簡單的byte數組。但是這個byte數組里面包含了很多項,并且有固定的結構。我們來看看里面的具體結構:



    上圖可知,開始是兩個固定長度的數值,分別表示key的長度和alue的長度。緊接著是Key,開始是固定長度的數值,表示RowKey的長度,緊接著是RowKey,然后是固定長度的數值,表示Family的長度,然后是Family,接著是Qualifier,然后是兩個固定長度的數值,表示Time Stamp和Key Type(Put/Delete)。Value部分沒有那么復雜的結構,就是純粹的二進制數據。
  • HLog
    HLog(WAL log):WAL意為write ahead log,用來做災難恢復使用,HLog記錄數據的所有變更,一旦region server 宕機,就可以從log中進行恢復。
    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文件的結構,其實HLog文件就是一個普通的Hadoop Sequence File,Sequence File的Key是HLogKey對象,HLogKey中記錄了寫入數據的歸屬信息,除了table和Region名字外,同時還包括sequence number和timestamp,timestamp是”寫入時間”,sequence number 的起始值為0,或者是最近一次存入文件系統中的sequence number。
    HLog Sequence File 的Value是HBase的KeyValue對象昂,即對應HFile中的KeyValue。

2) HRegion定位


通過zk里的文件/hbase/rs得到-ROOT-表的位置。-ROOT-表只有一個region。
通過-ROOT-表查找.META.表的第一個表中相應的region的位置。其實-ROOT-表是.META.表的第一個region;.META.表中的每一個region 在-ROOT-表中都是一行記錄。
通過.META.表找到所要的用戶表region的位置。用戶表中的每個region在.META.表中都是一行記錄。

-ROOT-表永遠不會被分隔為多個region,保證了最多需要三次跳轉,就能定位到任意的region。client會將查詢的位置 信息保存緩存起來,緩存不會主動失效,因此如果client上的緩存全部失效,則需要進行6次網絡來回,才能定位到正確的region,其中三次用來發現 緩存失效,另外三次用來獲取位置信息。

提示:
-ROOT-表:表包含.META.表所在的region列表,該表只有一個Region;Zookeeper中記錄了-ROOT-表的location
.META.表:表包含所有的用戶空間region列表,以及Region Server的服務器地址
hbase:meta表:高版本中已經舍棄了ROOT和META表了,采用了這個表

四、HBase工作流程

HBase的流程圖


  • Client
    首先當一個請求產生時,HBase Client使用RPC(遠程過程調用)機制與HMaster和HRegionServer進行通信,對于管理類操作,Client與HMaster進行RPC;對于數據讀寫操作,Client與HRegionServer進行RPC。

  • Zookeeper
    HBase Client使用RPC(遠程過程調用)機制與HMaster和HRegionServer進行通信,但如何尋址呢?由于Zookeeper中存儲了-ROOT-表的地址和HMaster的地址,所以需要先到Zookeeper上進行尋址。
    HRegionServer也會把自己以Ephemeral方式注冊到Zookeeper中,使HMaster可以隨時感知到各個HRegionServer的健康狀態。此外,Zookeeper也避免了HMaster的單點故障。

  • HMaster
    當用戶需要進行Table和Region的管理工作時,就需要和HMaster進行通信。HBase中可以啟動多個HMaster,通過Zookeeper的Master Eletion機制保證總有一個Master運行。
    管理用戶對Table的增刪改查操作
    管理HRegionServer的負載均衡,調整Region的分布
    在Region Split后,負責新Region的分配
    在HRegionServer停機后,負責失效HRegionServer上的Regions遷移

  • HRegionServer
    當用戶需要對數據進行讀寫操作時,需要訪問HRegionServer。HRegionServer存取一個子表時,會創建一個HRegion對象,然后對表的每個列族創建一個Store實例,每個Store都會有一個 MemStore和0個或多個StoreFile與之對應,每個StoreFile都會對應一個HFile, HFile就是實際的存儲文件。因此,一個HRegion有多少個列族就有多少個Store。 一個HRegionServer會有多個HRegion和一個HLog。

  • 注意:HStore存儲由兩部分組成:MemStore和StoreFiles。 MemStore是Sorted Memory Buffer,用戶 寫入數據首先 會放在MemStore,當MemStore滿了以后會Flush成一個 StoreFile(實際存儲在HDHS上的是HFile),當StoreFile文件數量增長到一定閥值,就會觸發Compact合并操作,并將多個StoreFile合并成一個StoreFile,合并過程中會進行版本合并和數據刪除,因此可以看出HBase其實只有增加數據,所有的更新和刪除操作都是在后續的compact過程中進行的,這使得用戶的 讀寫操作*只要進入內存中就可以立即返回,保證了HBase I/O的高性能。

五、HBase的高可用

  • HDFS機架識別策略:當數據文件損壞時,會找相同機架上備份的數據文件,如果相同機架上的數據文件也損壞會找不同機架備份數據文件。
  • HBase的Region快速恢復:當regionserver損壞時,master會對該regionserver上的region進行重新分配,遷移到其他可用的regionserver上并恢復region。
  • Master節點的HA機制:Master為一主多備。當Master主節點宕機后,剩下的備節點通過選舉,產生主節點。

六、HBase運維

  • 時鐘同步
  • 手動majorcompact
  • region hole修復
  • region overlap修復
  • 讀寫集群配置要區分
  • memstore flush時機

七、新特性

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • 一、HBase簡介 Hbase是什么 HBase是一種構建在HDFS之上的分布式、面向列、多版本、非關系型的數據庫...
    便利蜂數據平臺閱讀 985評論 0 4
  • HBase存儲架構圖 HBase Master 為Region server分配region 負責Region s...
    kimibob閱讀 5,600評論 0 52
  • HBase Architectural Components(HBase架構組件) HBase架構也是主從架構,由...
    陌上疏影涼閱讀 2,412評論 0 7
  • Hbase架構與原理 HBase是一個分布式的、面向列的開源數據庫,該技術來源于 Fay Chang所撰寫的Goo...
    全能程序猿閱讀 86,305評論 2 37
  • 1. HBase介紹,Hbase是什么? HBase -- Hadoop Database ,是一個高可靠、高性能...
    奉先閱讀 3,766評論 1 36