黑猴子的家:HBase 存儲剖析 與 數(shù)據(jù)遷移

1谎柄、概述

HBase的存儲結構和關系型數(shù)據(jù)庫不一樣阻星,HBase面向半結構化數(shù)據(jù)進行存儲朋鞍。所以,對于結構化的SQL語言查詢妥箕,HBase自身并沒有接口支持滥酥。在大數(shù)據(jù)應用中,雖然也有SQL查詢引擎可以查詢HBase畦幢,比如Phoenix坎吻、Drill這類。但是閱讀這類SQL查詢引擎的底層實現(xiàn)宇葱,依然是調(diào)用了HBase的Java API來實現(xiàn)查詢瘦真,寫入等操作。這類查詢引擎在業(yè)務層創(chuàng)建Schema來映射HBase表結構黍瞧,然后通過解析SQL語法數(shù)吗氏,最后底層在調(diào)用HBase的Java API實現(xiàn)。
本篇內(nèi)容筆者并不是給大家來介紹HBase的SQL引擎雷逆,我們來關注HBase更低層的東西,那就是HBase的存儲實現(xiàn)污尉。以及跨集群的HBase集群數(shù)據(jù)遷移膀哲。

2往产、內(nèi)容

HBase數(shù)據(jù)庫是唯一索引就是RowKey,所有的數(shù)據(jù)分布和查詢均依賴RowKey某宪。所以仿村,HBase數(shù)據(jù)庫在表的設計上會有很嚴格的要求,從存儲架構上來看兴喂,HBase是基于分布式來實現(xiàn)的蔼囊,通過Zookeeper集群來管理HBase元數(shù)據(jù)信息,比如表名就存放在Zookeeper的/hbase/table目錄下衣迷。如下圖所示


Architecture
HBase是一個分布式存儲系統(tǒng)畏鼓,底層數(shù)據(jù)存儲依賴Hadoop的分布式存儲系統(tǒng)(HDFS)。HBase架構分三部分來組成壶谒,它們分別是:ZooKeeper云矫、HMaster和HRegionServer。

ZooKeeper
HBase的元數(shù)據(jù)信息汗菜、HMaster進程的地址让禀、Master和RegionServer的監(jiān)控維護(節(jié)點之間的心跳,判斷節(jié)點是否下線)等內(nèi)容均需要依賴ZooKeeper來完成陨界。是HBase集群中不可缺少的核心之一巡揍。

HMaster
HMaster進程在HBase中承擔Master的責任,負責一些管理操作菌瘪,比如給表分配Region腮敌、和數(shù)據(jù)節(jié)點的心跳維持等。一般客戶端的讀寫數(shù)據(jù)的請求操作不會經(jīng)過Master麻车,所以在分配JVM內(nèi)存的適合缀皱,一般32GB大小即可。

HRegionServer
HRegionServer進程在HBase中承擔RegionServer的責任动猬,負責數(shù)據(jù)的存儲啤斗。每個RegionServer由多個Region組成,一個Region維護一定區(qū)間的RowKey的數(shù)據(jù)赁咙。如下圖所示

圖中Region(dn2:16030)維護的RowKey范圍為0001~0002钮莲。

HBase為了保證高可用性(HA),一般都會部署兩個Master節(jié)點彼水,其中一個作為主崔拥,另一個作為Backup節(jié)點。這里誰是主凤覆,誰是Backup取決于那個HMaster進程能從Zookeeper上對應的Master目錄中競爭到Lock链瓦,持有該目錄Lock的HMaster進程為主Master,而另外一個為Backup,當主Master發(fā)生意外或者宕機時慈俯,Backup的Master會立刻競爭到Master目錄下的Lock從而接管服務渤刃,成為主Master對外提供服務,保證HBase集群的高可用性贴膘。

RegionServer
HBase負責數(shù)據(jù)存儲的就是RegionServer卖子,簡稱RS。在HBase集群中刑峡,如果只有一份副本時洋闽,整個HBase集群中的數(shù)據(jù)都是唯一的,沒有冗余的數(shù)據(jù)存在突梦,也就是說HBase集群中的每個RegionServer節(jié)點上保存的數(shù)據(jù)都是不一樣的诫舅,這種模式由于副本數(shù)只有一份,即是配置多個RegionServer組成集群阳似,也并不是高可用的骚勘。這樣的RegionServer是存在單點問題的。雖然撮奏,HBase集群內(nèi)部數(shù)據(jù)有Region存儲和Region遷移機制俏讹,RegionServer服務的單點問題可能花費很小的代價可以恢復,但是一旦停止RegionServre上含有ROOT或者META表的Region畜吊,那這個問題就嚴重泽疆,由于數(shù)據(jù)節(jié)點RegionServer停止,該節(jié)點的數(shù)據(jù)將在短期內(nèi)無法訪問玲献,需要等待該節(jié)點的HRegionServer進程重新啟動才能訪問其數(shù)據(jù)殉疼。這樣HBase的數(shù)據(jù)讀寫請求如果恰好指向該節(jié)點將會收到影響,比如:拋出連接異常捌年、RegionServer不可用等異常瓢娜。

3、日志信息

HBase在實現(xiàn)WAL方式時會產(chǎn)生日志信息礼预,即HLog眠砾。每一個RegionServer節(jié)點上都有一個HLog,所有該RegionServer節(jié)點上的Region寫入數(shù)據(jù)均會被記錄到該HLog中托酸。HLog的主要職責就是當遇到RegionServer異常時褒颈,能夠盡量的恢復數(shù)據(jù)。

在HBase運行的過程當中励堡,HLog的容量會隨著數(shù)據(jù)的寫入越來越大谷丸,HBase會通過HLog過期策略來進行定期清理HLog,每個RegionServer內(nèi)部均有一個HLog的監(jiān)控線程应结。HLog數(shù)據(jù)從MemStore Flush到底層存儲(HDFS)上后刨疼,說明該時間段的HLog已經(jīng)不需要了,就會被移到“oldlogs”這個目錄中,HLog監(jiān)控線程監(jiān)控該目錄下的HLog揩慕,當該文件夾中的HLog達到“hbase.master.logcleaner.ttl”(單位是毫秒)屬性所配置的閥值后游两,監(jiān)控線程會立即刪除過期的HLog數(shù)據(jù)。

4漩绵、數(shù)據(jù)存儲

HBase通過MemStore來緩存Region數(shù)據(jù),大小可以通過“hbase.hregion.memstore.flush.size”(單位byte)屬性來進行設置肛炮。RegionServer在寫完HLog后止吐,數(shù)據(jù)會接著寫入到Region的MemStore。由于MemStore的存在侨糟,HBase的數(shù)據(jù)寫入并非是同步的碍扔,不需要立刻響應客戶端。由于是異步操作秕重,具有高性能和高資源利用率等優(yōu)秀的特性不同。數(shù)據(jù)在寫入到MemStore中的數(shù)據(jù)后都是預先按照RowKey的值來進行排序的,這樣便于查詢的時候查找數(shù)據(jù)溶耘。

5二拐、Region分割

在HBase存儲中,通過把數(shù)據(jù)分配到一定數(shù)量的Region來達到負載均衡凳兵。一個HBase表會被分配到一個或者多個Region百新,這些Region會被分配到一個或者多個RegionServer中。在自動分割策略中庐扫,當一個Region中的數(shù)據(jù)量達到閥值就會被自動分割成兩個Region饭望。HBase的表中的Region按照RowKey來進行排序,并且一個RowKey所對應的Region只有一個形庭,保證了HBase的一致性铅辞。
一個Region中由一個或者多個Store組成,每個Store對應一個列族萨醒。一個Store中包含一個MemStore和多個Store Files斟珊,每個列族是分開存放以及分開訪問的。自動分割有三種策略验靡,分別是

ConstantSizeRegionSplitPolicy
在HBase-0.94版本之前是默認和唯一的分割策略倍宾。當某一個Store的大小超過閥值時(hbase.hregion.max.filesize,默認時10G)胜嗓,Region會自動分割高职。

IncreasingToUpperBoundRegionSplitPolicy
在HBase-0.94中,這個策略分割大小和表的RegionServer中的Region有關系辞州。分割計算公式為:Min(RR'hbase.hregion.memstore.flush.size','hbase.hregion.max.filesize')怔锌,其中,R表示RegionServer中的Region數(shù)。
比如:hbase.hregion.memstore.flush.size=256MB埃元,hbase.hregion.max.filesize=20GB涝涤,那么第一次分割的大小為Min(11256,20GB)=256MB,也就是在第一次大到256MB會分割成2個Region岛杀,后續(xù)以此公式類推計算阔拳。

KeyPrefixRegionSplitPolicy
可以保證相同前綴的RowKey存放在同一個Region中,可以通過hbase.regionserver.region.split.policy屬性來指定分割策略类嗤。

6糊肠、磁盤合理規(guī)劃

部署HBase集群時,磁盤和內(nèi)存的規(guī)劃是有計算公式的遗锣。隨意分配可能造成集群資源利用率不高導致存在浪費的情況货裹。公式如下:

#通過磁盤維度的Region數(shù)和Java Heap維度的Region數(shù)來推導 
Disk Size/(RegionSize*ReplicationFactor)=Java Heap*HeapFractionForMemstore/(MemstoreSize/2)

公式中對應的hbase-site.xml文件中的屬性中,見下表

Key Property
Disk Size 磁盤容量大小精偿,一般一臺服務器有多塊磁盤
RegionSize hbase.hregion.max.filesize默認10G弧圆,推薦范圍在10GB~30GB
ReplicationFactor dfs.replication默認為3
Java Heap 分配給HBase JVM的內(nèi)存大小
HeapFractionForMemstore hbase.regionserver.global.memstore.lowerLimit默認為0.4
MemstoreSize hbase.hregion.memstore.flush.size默認為128M

在實際使用中,MemstoreSize空間打下只使用了一半(1/2)的容量笔咽。 舉個例子搔预,一個RegionServer的副本數(shù)配置為3,RegionSize為10G拓轻,HBase的JVM內(nèi)存分配45G斯撮,HBase的MemstoreSize為128M,那此時根據(jù)公式計算得出理想的磁盤容量為45G10240.4210G10243/128M=8.5T左右磁盤空間扶叉。如果此時勿锅,分配一個節(jié)點中掛載10個可用盤,共27T枣氧。那將有兩倍的磁盤空間不匹配造成浪費溢十。 為了提升磁盤匹配度,可以將RegionSize值提升至30G达吞,磁盤空間計算得出25.5T张弛,基本和27T磁盤容量匹配。

7酪劫、數(shù)據(jù)遷移

對HBase集群做跨集群數(shù)據(jù)遷移時吞鸭,可以使用Distcp方案來進行遷移。該方案需要依賴MapReduce任務來完成覆糟,所以在執(zhí)行遷移命令之前確保新集群的ResourceManager刻剥、NodeManager進程已啟動。同時滩字,為了查看遷移進度造虏,推薦開啟proxyserver進程和historyserver進程御吞,開啟這2個進程可以方便在ResourceManager業(yè)務查看MapReduce任務進行的進度。 遷移的步驟并不復雜漓藕,在新集群中執(zhí)行distcp命令即可陶珠。具體操作命令如下所示

# 在新集群的NameNode節(jié)點執(zhí)行命令
[hadoop@nna ~]$ hadoop distcp \
-Dmapreduce.job.queue.name=queue_0001_01 \
-update -skipcrccheck \
-m 100 hdfs://old_hbase:9000/hbase/data/tabname /hbase/data/tabname

為了遷移方便,可以將上述命令封裝成一個Shell腳本享钞。具體實現(xiàn)如下所示

#! /bin/bash
for i in `cat /home/hadoop/hbase/tbl`
do
echo $i
hadoop distcp -Dmapreduce.job.queue.name=queue_0001_01 -update -skipcrccheck -m 100 hdfs://old_hbase:9000/hbase/data/$i /hbase/data/$i
done
hbase hbck -repairHoles

將待遷移的表名記錄在/home/hadoop/hbase/tbl文件中揍诽,一行代表一個表。內(nèi)容如下所示:

[hadoop@nna ~]$ vi /home/hadoop/hbase/tbl
# 表名列表
tbl1
tbl2
tbl3
tbl4

最后栗竖,在循環(huán)迭代遷移完成后寝姿,執(zhí)行HBase命令“hbase hbck -repairHoles”來修復HBase表的元數(shù)據(jù),如表名划滋、表結構等內(nèi)容,會從新注冊到新集群的Zookeeper中埃篓。

修復HBase表的元數(shù)據(jù)

[hadoop@nna ~]$ hbase hbck -repairHoles

8处坪、總結

HBase集群中如果RegionServer上的Region數(shù)量很大,可以適當調(diào)整“hbase.hregion.max.filesize”屬性值的大小架专,來減少Region分割的次數(shù)同窘。在執(zhí)行HBase跨集群數(shù)據(jù)遷移時,使用Distcp方案來進行部脚,需要保證HBase集群中的表是靜態(tài)數(shù)據(jù)想邦,換言之,需要停止業(yè)務表的寫入委刘。如果在執(zhí)行HBase表中數(shù)據(jù)遷移時丧没,表持續(xù)有數(shù)據(jù)寫入,導致遷移異常锡移,拋出某些文件找不到。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市志于,隨后出現(xiàn)的幾起案子健芭,更是在濱河造成了極大的恐慌,老刑警劉巖施符,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件往声,死亡現(xiàn)場離奇詭異,居然都是意外死亡戳吝,警方通過查閱死者的電腦和手機浩销,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骨坑,“玉大人撼嗓,你說我怎么就攤上這事柬采。” “怎么了且警?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵粉捻,是天一觀的道長。 經(jīng)常有香客問我斑芜,道長肩刃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任杏头,我火速辦了婚禮盈包,結果婚禮上,老公的妹妹穿的比我還像新娘醇王。我一直安慰自己呢燥,他們只是感情好,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布寓娩。 她就那樣靜靜地躺著叛氨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棘伴。 梳的紋絲不亂的頭發(fā)上寞埠,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音焊夸,去河邊找鬼仁连。 笑死,一個胖子當著我的面吹牛阱穗,可吹牛的內(nèi)容都是我干的饭冬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼揪阶,長吁一口氣:“原來是場噩夢啊……” “哼伍伤!你這毒婦竟也來了?” 一聲冷哼從身側響起遣钳,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扰魂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蕴茴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劝评,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年倦淀,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒋畜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡撞叽,死狀恐怖姻成,靈堂內(nèi)的尸體忽然破棺而出插龄,到底是詐尸還是另有隱情,我是刑警寧澤科展,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布均牢,位于F島的核電站,受9級特大地震影響才睹,放射性物質(zhì)發(fā)生泄漏徘跪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一琅攘、第九天 我趴在偏房一處隱蔽的房頂上張望垮庐。 院中可真熱鬧,春花似錦坞琴、人聲如沸哨查。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽解恰。三九已至,卻和暖如春浙于,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挟纱。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工羞酗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人紊服。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓檀轨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親欺嗤。 傳聞我的和親對象是個殘疾皇子参萄,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 參考:http://www.reibang.com/p/569106a3008f 最近在逐步跟進Hbase的相關...
    博弈史密斯閱讀 859評論 1 1
  • 最近在逐步跟進Hbase的相關工作,由于之前對Hbase并不怎么了解煎饼,因此系統(tǒng)地學習了下Hbase讹挎,為了加深對Hb...
    飛鴻無痕閱讀 50,244評論 19 272
  • 本文首先簡單介紹了HBase,然后重點講述了HBase的高并發(fā)和實時處理數(shù)據(jù) 、HBase數(shù)據(jù)模型吆玖、HBase物理...
    達微閱讀 2,736評論 1 13
  • 比特科技: 存儲筒溃、數(shù)據(jù)庫、大數(shù)據(jù)技術 ? HBase原理和設計 http://www.bitstech.net/...
    葡萄喃喃囈語閱讀 729評論 0 11
  • 簡介 HBase —— Hadoop Database的簡稱沾乘,Google BigTable的另一種開源實現(xiàn)方式怜奖,...
    編碼前線閱讀 279評論 0 0