HBase 快速入門

使用HBase已有半年時(shí)間均蜜,最近在公司內(nèi)部組織了一場(chǎng)HBase的分享會(huì)但绕,沒(méi)想到引起了很多同學(xué)的熱烈討論却特。但是由于功課沒(méi)做好扶供,加之底層的原理沒(méi)有完全搞懂,很多同學(xué)的提問(wèn)不能很好的給予解答裂明,不免有些遺憾椿浓。

今天特地整理一下ppt上的內(nèi)容,希望能給第一次接觸HBase的同學(xué)一點(diǎn)幫助闽晦。

HBase 官方文檔 https://hbase.apache.org/book.html

本文主要從以下幾個(gè)方面介紹下HBase

1.基本概念

HBase 是建立在HDFS之上扳碍,提供高可靠、高性能仙蛉、列存儲(chǔ)笋敞、可伸縮、實(shí)時(shí)讀寫NoSql的分布式數(shù)據(jù)庫(kù)系統(tǒng)荠瘪。

  • HDFS為HBase提供底層數(shù)據(jù)存儲(chǔ)服務(wù)
  • Zookeeper為HBase提供穩(wěn)定服務(wù)和fail-over機(jī)制
  • LSM提供了高性能支持
  • WAL提供了可靠性
2.HBase 特性
  • 面向列夯巷,面向列(族)的存儲(chǔ)和權(quán)限控制,列(族)獨(dú)立檢索
  • 容量巨大哀墓,單表可以有百億行趁餐,百萬(wàn)列
  • 無(wú)模式,同一張表中不同的行可以有截然不同的列
  • LSM數(shù)據(jù)結(jié)構(gòu)(Log-Structured Merge-Tree)
  • WAL(Write-Ahead-Log)預(yù)寫日志機(jī)制
  • Row Key有序排列(字典排序)
  • 稀疏性篮绰,空值不占用存儲(chǔ)空間
  • TTL(Time to Live)
  • 數(shù)據(jù)多版本后雷,每個(gè)單元中的數(shù)據(jù)可以有多個(gè)版本,默認(rèn)情況下版本號(hào)自動(dòng)分配吠各,是單元格插入時(shí)的時(shí)間戳
  • 數(shù)據(jù)類型單一臀突,Hbase中的數(shù)據(jù)都是字符串(byte[])
3.HBase 架構(gòu)
圖片來(lái)源網(wǎng)絡(luò)
Client
  • 包含訪問(wèn)HBase的接口,并維護(hù)cache來(lái)加快對(duì)HBase的訪問(wèn)走孽,比如region的位置信息
Master
  • 為Region server分配region
  • 負(fù)責(zé)Region server的負(fù)載均衡
  • 發(fā)現(xiàn)失效的Region server并重新分配其上的region
  • 管理用戶對(duì)table的增刪改查操作
Region Server
  • Regionserver維護(hù)region惧辈,處理對(duì)這些region的IO請(qǐng)求
  • Regionserver負(fù)責(zé)切分在運(yùn)行過(guò)程中變得過(guò)大的region
4.HBase 邏輯視圖
圖片來(lái)源網(wǎng)絡(luò)
  • 隱形主鍵,rowkey
  • 數(shù)據(jù)單一磕瓷,type[]
  • 無(wú)模式盒齿,列不固定,列由列族管理和檢索
  • 多版本困食,一個(gè)單元列內(nèi)不同時(shí)間戳對(duì)應(yīng)不同的數(shù)值
5.HBase 物理模型
圖片來(lái)源網(wǎng)絡(luò)
  • Table中所有行都按照row key的字典序排列
  • Table在行的方向上分割為多個(gè)Region
  • Region按大小分割的边翁,每個(gè)表開(kāi)始只有一個(gè)region,隨著數(shù)據(jù)增多硕盹,region不斷增大符匾,當(dāng)增大到一個(gè)閾值的時(shí)候,region就會(huì)等分會(huì)兩個(gè)新的region瘩例,之后會(huì)有越來(lái)越多的region
  • Region是Hbase中分布式存儲(chǔ)和負(fù)載均衡的最小單元啊胶,不同Region分布到不同RegionServer上
  • Region雖然是分布式存儲(chǔ)的最小單元甸各,但并不是存儲(chǔ)的最小單元
6.HBase 容錯(cuò)和恢復(fù)WAL
圖片來(lái)源網(wǎng)絡(luò)
Store

每一個(gè)region由一個(gè)或多個(gè)store組成,至少是一個(gè)store焰坪,hbase會(huì)把一起訪問(wèn)的數(shù)據(jù)放在一個(gè)store里面趣倾,即為每個(gè)ColumnFamily建一個(gè)store,如果有幾個(gè)ColumnFamily某饰,也就有幾個(gè)Store儒恋。一個(gè)Store由一個(gè)memStore和0或者多個(gè)StoreFile組成。 思考:為什么不建議一張表創(chuàng)建多個(gè)列族黔漂?

MemStore

memStore 是放在內(nèi)存里的诫尽。保存修改的數(shù)據(jù)即keyValues。當(dāng)memStore的大小達(dá)到一個(gè)閾值時(shí)炬守,memStore會(huì)被flush到文件牧嫉,即生成一個(gè)快照。目前hbase 會(huì)有一個(gè)線程來(lái)負(fù)責(zé)memStore的flush操作减途。

StoreFile

memStore內(nèi)存中的數(shù)據(jù)寫到文件后就是StoreFile驹止,StoreFile底層是以HFile的格式保存。

HFile

HBase中KeyValue數(shù)據(jù)的存儲(chǔ)格式观蜗,是hadoop的二進(jìn)制格式文件臊恋。HBase 的寫入最先會(huì)放入內(nèi)存中,提供實(shí)時(shí)的查詢墓捻,當(dāng) Memstore 中數(shù)據(jù)達(dá)到一定量的閾值(128MB)抖仅,會(huì)通過(guò) Flush 操作生成 HFile 持久化到 HDFS 中,隨著用戶的寫入砖第,生成的 HFile 數(shù)目會(huì)逐步增多撤卢,這會(huì)影響用戶的讀操作,同時(shí)也會(huì)系統(tǒng)占用(HDFS 層 block 的數(shù)目梧兼, regionserver 服務(wù)器的文件描述符占用)放吩, region split 操作,region reopen 操作也會(huì)受到不同程度影響羽杰。 HBase 通過(guò) Compaction 機(jī)制將多個(gè) HFile 合并成一個(gè) HFile 以控制每個(gè) Region 內(nèi)的 HFile 的數(shù)目在一定范圍內(nèi)

HLog

HLog文件就是一個(gè)普通的Hadoop Sequence File渡紫, Sequence File的key是HLogKey對(duì)象,其中記錄了寫入數(shù)據(jù)的歸屬信息考赛,除了table和region名字外惕澎,還同時(shí)包括sequence number和timestamp,timestamp是寫入時(shí)間颜骤,sequence number的起始值為0唧喉,或者是最近一次存入文件系統(tǒng)中的sequencenumber。 Sequence File的value是HBase的KeyValue對(duì)象,即對(duì)應(yīng)HFile中的KeyValue八孝。

LogFlusher

定期將內(nèi)存中kv數(shù)據(jù)同步到hlog

LogRoller

定期滾動(dòng)更新日志董朝,刪除舊日志。每個(gè)regionserver維護(hù)一個(gè)HLog干跛,而不是每一個(gè)region一個(gè)益涧,這樣不同region(來(lái)自不同的table)的日志會(huì)混在一起,這樣做的目的是不斷追加單個(gè)文件相對(duì)于同時(shí)寫多個(gè)文件而言驯鳖,可以減少磁盤尋址次數(shù),因此可以提高table的寫性能久免。帶來(lái)麻煩的時(shí)浅辙,如果一個(gè)regionserver下線,為了恢復(fù)其上的region阎姥,需要將region server上的log進(jìn)行拆分记舆,然后分發(fā)到其他regionserver上進(jìn)行恢復(fù)。

容錯(cuò)

每個(gè)HRegionServer中都有一個(gè)HLog對(duì)象呼巴,HLog是一個(gè)實(shí)現(xiàn)Write Ahead Log的類泽腮。在每次用戶操作寫入MemStore的同時(shí),也會(huì)寫一份數(shù)據(jù)到HLog文件中衣赶。HLog文件定期會(huì)滾動(dòng)更新诊赊,并刪除舊的文件(已持久化到StoreFile中的數(shù)據(jù))。

恢復(fù)

當(dāng)HRegionServer意外終止后府瞄,HMaster會(huì)通過(guò)Zookeeper感知到碧磅,HMaster首先會(huì)處理遺留的 HLog文件,將其中不同Region的Log數(shù)據(jù)進(jìn)行拆分遵馆,分別放到相應(yīng)region的目錄下鲸郊,然后再將失效的region重新分配,領(lǐng)取到這些region的HRegionServer在Load Region的過(guò)程中货邓,會(huì)發(fā)現(xiàn)有歷史HLog需要處理秆撮,因此會(huì)Replay HLog中的數(shù)據(jù)到MemStore中,然后flush到StoreFiles换况,完成數(shù)據(jù)恢復(fù)职辨。

7.HBase 一次查詢過(guò)程
圖片來(lái)源網(wǎng)絡(luò)

-ROOT-表和.META.表是hbase內(nèi)置的兩張表,結(jié)構(gòu)相同戈二。

一張表可能有多個(gè)分區(qū)拨匆,Hbase查詢一條數(shù)據(jù)首先要知道這條記錄存放在哪個(gè)分區(qū)region,.META.表就是記錄用戶信息與分區(qū)的關(guān)系數(shù)據(jù)挽拂。

.META.表由regionServer 管理惭每,當(dāng)分區(qū)足夠多時(shí).META.也會(huì)分區(qū),這就意味著可能有多個(gè)regionServer在管理.META.信息,要想知道是哪個(gè)分區(qū)存儲(chǔ)了這條記錄台腥,就要先知道這個(gè).META.由哪個(gè)regionServer 管理宏赘。

-ROOT-表有著和meta表一樣的數(shù)據(jù)結(jié)構(gòu),它是用來(lái)存儲(chǔ)meta 與分區(qū)關(guān)系的表黎侈,-ROOT-表只有一份察署,由zk管理地址。

8.HBase 應(yīng)用場(chǎng)景
  • 大數(shù)據(jù)量存儲(chǔ)峻汉,大數(shù)據(jù)量高并發(fā)操作
  • 高并發(fā)寫入贴汪,瞬間寫入量很大
  • 業(yè)務(wù)場(chǎng)景簡(jiǎn)單(無(wú)交叉列,交叉表休吠,事務(wù)扳埂, 連接等)
  • 可以優(yōu)雅的數(shù)據(jù)擴(kuò)展
9.HBase RowKey設(shè)計(jì)

參見(jiàn)文章:RowKey行鍵設(shè)計(jì)規(guī)范

最后補(bǔ)充一些分享會(huì)上別人提出的問(wèn)題

Q:HBase為什么寫入會(huì)有熱點(diǎn),不應(yīng)該是負(fù)載均衡嗎瘤礁?
A:HBase 寫入不是直接負(fù)載均衡到各個(gè)節(jié)點(diǎn)的阳懂,而是去META表查詢各個(gè)region的開(kāi)始結(jié)束區(qū)間,以及對(duì)應(yīng)的regionServer柜思,符合某個(gè)region區(qū)間岩调,就去連接這個(gè)region所在的server,當(dāng)前綴都相同時(shí)(日期打頭)赡盘,數(shù)據(jù)都在相鄰位置号枕,很容易寫在同一個(gè)region,所以就造成了某個(gè)server熱點(diǎn)

Q:數(shù)據(jù)在HFile中存儲(chǔ)陨享,有更小的rowkey寫入磁盤時(shí)堕澄,是插入到前面的HFile還是追加在后面的HFile?
A:追加在后面的HFile霉咨,多個(gè)HFile之間是允許有rowkey 交叉存儲(chǔ)的蛙紫,也就是無(wú)序的。當(dāng)HFile數(shù)量到達(dá)一定閾值途戒,就會(huì)啟動(dòng)合并排序坑傅,將多個(gè)小HFile合并并排序成一個(gè)大的HFile。最后刪除舊的HFile喷斋。

Q:regionServer 往HLog寫日志是同步的嗎唁毒?如果同步寫怎么做到高并發(fā)的?
A:是同步的星爪。昨天我有說(shuō)有緩沖區(qū)浆西,這個(gè)是不對(duì)的,抱歉顽腾!因?yàn)閷憀og數(shù)據(jù)是只追加近零,不更新诺核,因此io的消耗并不大,足夠支撐hbase高并發(fā)久信。

參考資料:
HBase原理窖杀、基本概念、基本架構(gòu) https://blog.csdn.net/woshiwanxin102213/article/details/17584043
HBase基本概念
https://www.cnblogs.com/SuKiWX/p/8861993.html
HBase -ROOT-和.META.表結(jié)構(gòu)(region定位原理) https://blog.csdn.net/chlaws/article/details/16918913

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末裙士,一起剝皮案震驚了整個(gè)濱河市入客,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腿椎,老刑警劉巖桌硫,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異啃炸,居然都是意外死亡铆隘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門肮帐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人边器,你說(shuō)我怎么就攤上這事训枢。” “怎么了忘巧?”我有些...
    開(kāi)封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵恒界,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我砚嘴,道長(zhǎng)十酣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任际长,我火速辦了婚禮耸采,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘工育。我一直安慰自己虾宇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布如绸。 她就那樣靜靜地躺著嘱朽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怔接。 梳的紋絲不亂的頭發(fā)上搪泳,一...
    開(kāi)封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音扼脐,去河邊找鬼岸军。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凛膏。 我是一名探鬼主播杨名,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼猖毫!你這毒婦竟也來(lái)了台谍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吁断,失蹤者是張志新(化名)和其女友劉穎趁蕊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體仔役,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掷伙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了又兵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片任柜。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沛厨,靈堂內(nèi)的尸體忽然破棺而出宙地,到底是詐尸還是另有隱情,我是刑警寧澤逆皮,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布宅粥,位于F島的核電站,受9級(jí)特大地震影響电谣,放射性物質(zhì)發(fā)生泄漏秽梅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一剿牺、第九天 我趴在偏房一處隱蔽的房頂上張望企垦。 院中可真熱鬧,春花似錦晒来、人聲如沸竹观。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)臭增。三九已至,卻和暖如春竹习,著一層夾襖步出監(jiān)牢的瞬間誊抛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工整陌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拗窃,地道東北人瞎领。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像随夸,于是被迫代替她去往敵國(guó)和親九默。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348