HBase 框架學(xué)習(xí)之路

1 背景知識

1.1 解決問題

解決HDFS不支持單條記錄的快速查找和更新的問題。

1.2 適用情況

  • 存在億萬條記錄的數(shù)據(jù)庫躬翁,只有千萬或者百萬條記錄使用RDBMS更加合適
  • 確保你的應(yīng)用不需要使用RDBMS的高級特性(第二索引山憨,事務(wù)機(jī)制查乒,高級查詢語言等)
  • 足夠的硬件配置弥喉,即節(jié)點(diǎn)數(shù)郁竟,HDFS在少于5個(gè)節(jié)點(diǎn)時(shí)并不會表現(xiàn)得很好,HBase也存在相同情況由境。

2 設(shè)計(jì)理念

2.1 概述

2.1.1 簡介

  • 使用Java語言開發(fā)的NoSQL類型的分布式數(shù)據(jù)庫
  • 不支持RDBMS的一些高級特性棚亩,如事務(wù)機(jī)制蓖议,第二索引,高級查詢語言等
  • 支持線性和模塊化擴(kuò)展讥蟆,可以通過在商用機(jī)器上增加RegionServer來線性提高性能

2.1.2 HBase特性:

  • 強(qiáng)讀寫一致性:適合高速計(jì)數(shù)聚合操作
  • 自動切分?jǐn)?shù)據(jù):分布式存儲數(shù)據(jù)勒虾,隨著數(shù)據(jù)增長進(jìn)行自動切片
  • RegionServer自動失效備援
  • 與HDFS集成
  • 支持MapReduce執(zhí)行大規(guī)模并行操作
  • 提供Java Client API
  • 提供Thrift/REST API
  • 針對大容量查詢優(yōu)化的塊緩存和Bloom Fliter
  • 可視化管理界面

2.1.3 劣勢

  • WAL的重新執(zhí)行速度緩慢
  • 故障恢復(fù)緩慢且復(fù)雜
  • 主壓縮會引起 I/O風(fēng)暴(大量的I/O操作)

2.2 設(shè)計(jì)架構(gòu)

2.2.1 基礎(chǔ)概念

概念 中文 解釋 備注 舉例
Table 由多行組成 ...
Row 由一個(gè)Key和一個(gè)或者多列組成
Column 由列族和列限定符組成 列族:列限定符 ;行與行之間的列可以相差很多
Column Family 列族 物理上存儲多個(gè)列瘸彤;為提高性能設(shè)計(jì)的修然; 表格創(chuàng)建時(shí)需要置頂 content
Column Qualifier 列限定符 列族中數(shù)據(jù)的索引 表格創(chuàng)建時(shí)不需要指定,可以在任何時(shí)候添加 content:html
Cell 單元 由行质况、列族愕宋、列限定符、值和代表版本的時(shí)間戳組成
TimeStamp 時(shí)間戳 用來表示數(shù)據(jù)的版本 可以使用系統(tǒng)時(shí)間也可以自己指定

2.2.1.2 例子本例子取自官方文檔

Row Key Time Stamp ColumnFamily contents ColumnFamily anchor ColumnFamily people
"com.cnn.www" t9 anchor:cnnsi.com = "CNN"
"com.cnn.www" t8 anchor:my.look.ca = "CNN.com"
"com.cnn.www" t6 contents:html = "<html>…?
"com.cnn.www" t5 contents:html = "<html>…?"
"com.cnn.www" t3 contents:html = "<html>…?
com.example.www t5 contents:html: "<html>..." people:author: "John Doe"

說明

  1. 表格格式不是唯一和最精確的表達(dá)方式结榄,還可以用Json格式來表達(dá)
  2. 表格中的空白單元不會占用物理存儲空間中贝,只是概念上存在

2.2.1.3 操作

操作 API 注意點(diǎn) 與版本的關(guān)系
Get Table.get 返回指定行的屬性;Scan的第一行 若沒有指定版本臼朗,則返回版本值最大(但可能不是最新的)的數(shù)據(jù)邻寿;可以通過設(shè)置MaxVersion的值修改返回的數(shù)據(jù)條數(shù)
Scan Table.scan 返回滿足條件的多行 同上
Put Table.put Key存在則更新Key不在則插入;通過 Table.put (寫緩存) 或者Table.batch (沒有寫緩存) 默認(rèn)使用系統(tǒng)時(shí)間;只要key、column和version相同就可以實(shí)現(xiàn)覆蓋视哑;插入時(shí)可以指定版本
Delete Table.delete 1.刪除指定列绣否;2.刪除列的所有版本;3.刪除特定列族的所有列 1. 刪除操作不會立刻執(zhí)行黎炉,而是給該數(shù)據(jù)設(shè)置墓碑標(biāo)簽枝秤,在空間清理的時(shí)候再執(zhí)行死亡數(shù)據(jù)和墓碑的清除工作;2.通過在 hbase-site.xml.中hbase.hstore.time.to.purge.deletes屬性來設(shè)置TTL(生存時(shí)間)

說明

  1. 版本數(shù)的最大值和最小值是可以指定的慷嗜,并且會影響操作
  2. 版本(時(shí)間戳)是用來管控?cái)?shù)據(jù)的存活時(shí)間的淀弹,最好不要手動設(shè)置

2.2.1.4 局限

1)Delete操作會影響Put操作:原因在于Delete操作并不是立刻執(zhí)行,而是給死亡數(shù)據(jù)設(shè)置墓碑標(biāo)簽庆械,那么如果當(dāng)你執(zhí)行了一個(gè)Delete版本低于等于T的操作薇溃,而后有插入Put了一個(gè)版本為T的數(shù)據(jù),此時(shí)新Put的數(shù)據(jù)也會被打上標(biāo)簽缭乘,那么會在系統(tǒng)的下一次清理工作中將打上標(biāo)簽的數(shù)據(jù)全部清理掉沐序,執(zhí)行查詢時(shí)則會獲取不到新Put的數(shù)據(jù),如果你不手動設(shè)置版本的話堕绩,版本采用系統(tǒng)默認(rèn)時(shí)間策幼,則不會出現(xiàn)這種情況。

2)清理工作會影響查詢:創(chuàng)建三個(gè)版本為t1,t2,t3的單元奴紧,并且設(shè)置最大版本數(shù)為2.所以當(dāng)我們查詢所有版本時(shí)特姐,只會返回t2和t3。但是當(dāng)你刪除版本t2和t3的時(shí)候黍氮,版本t1會重新出現(xiàn)唐含。顯然浅浮,一旦重要精簡工作運(yùn)行之后,這樣的行為就不會再出現(xiàn)捷枯。

查看更多關(guān)于數(shù)據(jù)模型的信息

2.2.2 架構(gòu)

2.2.2.1 架構(gòu)特點(diǎn)

1)主從架構(gòu)
2)有三個(gè)組件:

組件名稱 組件主要功能
HMaster 負(fù)責(zé)Region的分配和DDL操作(創(chuàng)建滚秩,刪除表)
HRegionServer RegionServer負(fù)責(zé)數(shù)據(jù)的讀寫;和客戶端通訊
ZooKeeper 維持集群的活動狀態(tài)

3)底層儲存是HDFS


HBase架構(gòu):圖片來自Map-R網(wǎng)站

2.2.2.2 組件

hbase:meta:所有region的信息

1)結(jié)構(gòu):

Key
  • 格式:([table],[region start key],[region id])
Values
  • info:regioninfo (序列化HRegionInfo實(shí)例)
  • info:server (包含此Region的RegionServer的server:端口)
  • info:serverstartcode (包含此Region的RegionServer的啟動時(shí)間)
hbase:meta結(jié)構(gòu)圖,圖片來自Map-R

2)存儲位置:ZooKeeper中

HMaster:控制者

  • 分配Region:啟動時(shí)分配淮捆,失效RegionServer上Region的再分配郁油,Region切分時(shí)分配
  • 監(jiān)控集群中的所有RegionServer,實(shí)現(xiàn)其負(fù)載均衡
  • DDL:Data Definition Language(表格的創(chuàng)建攀痊、刪除和更新-列族的更新)
  • 管理namespace和table的元數(shù)據(jù)
  • 權(quán)限管理(ACL)
  • HDFS上的垃圾文件回收
HMaster的功能:圖片來自Map-R網(wǎng)站

HRegionServer:HBase實(shí)際讀寫者

  • 響應(yīng)client的讀寫請求已艰,進(jìn)行I/O操作(直接繞過HMaster)
  • 與HDFS交互,管理table數(shù)據(jù)
  • 當(dāng)Region的大小到達(dá)閥值時(shí)切分Region
HRegionServer:圖片來自Map-R網(wǎng)站

本小節(jié)可參考Region Server詳解

ZooKeeper:協(xié)調(diào)者

  • 保證集群中有且只有一個(gè)HMaster為Active
  • 存儲hbase:meta蚕苇,即所有Region的位置信息
  • 存儲HBase中表格的元數(shù)據(jù)信息
  • 監(jiān)控RegionServer狀態(tài)哩掺,將RS的上下線情況匯報(bào)給HMaster
  • ZooKeeper集群本身使用一致性協(xié)議(PAXOS協(xié)議)保證每個(gè)節(jié)點(diǎn)狀態(tài)的一致性
ZooKeeper,圖片來自Map-R

Region:Region是HBase數(shù)據(jù)存儲和管理的基本單位

本小節(jié)可參考Region詳解

2.3 相關(guān)流程

2.3.1 首次讀寫流程

本小節(jié)可參看Region Server詳解中的首次讀寫流程

2.3.2 寫流程

本小節(jié)可參看Region Server詳解中的寫流程

2.3.2 讀流程

本小節(jié)可參看Region Server詳解中的讀流程

2.4 相關(guān)機(jī)制

2.4.1 Compaction機(jī)制(壓縮合并)

2.4.1.1 次壓縮

本小節(jié)可參看Region Server詳解中的次壓縮部分

2.4.1.2 主壓縮

本小節(jié)可參看Region Server詳解中的主壓縮部分

2.4.2 WAL Replay機(jī)制

本小節(jié)可參看Region Server詳解中的WAL Replay

2.5 版本更新內(nèi)容

2.5.1 .META表 =>hbase:meta

2.5.1.1 -ROOT-和.META

在0.96.x之前是存在-ROOT-和.META兩個(gè)表格來維持region的元數(shù)據(jù)

1)結(jié)構(gòu):
Key

? .META. region key (.META.,,1)

Values

? info:regioninfo (hbase:meta的序列化實(shí)例)
? info:server (存儲 hbase:meta的RegionServer的server:port)
? info:serverstartcode (存儲 hbase:meta的RegionServer的啟動時(shí)間)

-ROOT-與.META
2)讀取region位置信息的流程
  1. 從ZooKeeper中讀取-ROOT- Table所在HRegionServer
  2. 從該HRegionServer中根據(jù)請求的TableName涩笤,RowKey讀取.META. Table所在HRegionServer
  3. 從該HRegionServer中讀取.META. Table的內(nèi)容而獲取此次請求需要訪問的HRegion所在的位置
  4. 訪問該HRegionSever獲取請求的數(shù)據(jù)

2.5.1.2 hbase:meta

本小節(jié)可參考2.2.2.2 組件中的hbase:meta和2.3 相關(guān)流程中的首次讀寫流程進(jìn)行比較

2.5.1.3 升級的目的

1)0.96.x版本之前是參考Goole的BigTable設(shè)計(jì)的嚼吞,從讀取數(shù)據(jù)請求發(fā)起到真正讀取到數(shù)據(jù)要經(jīng)過4個(gè)步驟,Google設(shè)計(jì)BigTable的目的在于它的數(shù)據(jù)量巨大蹬碧,多層的schema結(jié)構(gòu)能夠存儲更多的Region舱禽,但是隨著而來的就是訪問性能的下降。
2)一般公司的數(shù)據(jù)量沒有Google那么大恩沽,所以去掉-ROOT-表誊稚,留下.META(hbase:meta)表,提高Region的大小罗心,不僅可以滿足存儲需求里伯,而且訪問性能得到提高。

2.5.2 HLog =>WAL

  • 0.94.x 之前HBase中的WAL實(shí)現(xiàn)稱為HLog渤闷,存儲在/hbase/.logs/目錄下
  • 0.94.x之后更名為WAL疾瓮,存儲在/hbase/WALs/目錄下

2.6 跟其他框架的聯(lián)系

待續(xù)...

2.7 性能調(diào)優(yōu)

待續(xù)...

2.8 高級特性

待續(xù)...

3 項(xiàng)目實(shí)戰(zhàn)

3.1 入門指南

3.1.1 環(huán)境搭建

本小節(jié)可參看HBase部署入門指南

3.1.2 入門程序

本小節(jié)可參考HBase Shell 練習(xí)HBase Java API 練習(xí)飒箭、使用MapReduce操作HBase

3.2 技術(shù)難點(diǎn)

待續(xù)...

3.3 開發(fā)中遇到的問題

待續(xù)...

3.4 應(yīng)用

3.4.1 OpenTSDB開發(fā)

待續(xù)...

4 聲明

待續(xù)部分將會后期不定期更新狼电,敬請期待。

參考文章:

Apache HBase Reference Guide
An In-Depth Look at the HBase Architecture

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弦蹂,一起剝皮案震驚了整個(gè)濱河市肩碟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凸椿,老刑警劉巖削祈,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異削饵,居然都是意外死亡岩瘦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門窿撬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來启昧,“玉大人,你說我怎么就攤上這事劈伴∶苣” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵跛璧,是天一觀的道長严里。 經(jīng)常有香客問我,道長追城,這世上最難降的妖魔是什么刹碾? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮座柱,結(jié)果婚禮上迷帜,老公的妹妹穿的比我還像新娘。我一直安慰自己色洞,他們只是感情好戏锹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著火诸,像睡著了一般锦针。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上置蜀,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天奈搜,我揣著相機(jī)與錄音,去河邊找鬼盯荤。 笑死媚污,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的廷雅。 我是一名探鬼主播耗美,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼航缀!你這毒婦竟也來了商架?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤芥玉,失蹤者是張志新(化名)和其女友劉穎蛇摸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灿巧,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赶袄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年揽涮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饿肺。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒋困,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敬辣,到底是詐尸還是另有隱情雪标,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布溉跃,位于F島的核電站村刨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏撰茎。R本人自食惡果不足惜嵌牺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望龄糊。 院中可真熱鬧髓梅,春花似錦、人聲如沸绎签。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诡必。三九已至奢方,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爸舒,已是汗流浹背蟋字。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扭勉,地道東北人鹊奖。 一個(gè)月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像涂炎,于是被迫代替她去往敵國和親忠聚。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

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