溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

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

發(fā)布時(shí)間:2020-07-07 13:23:39 來(lái)源:網(wǎng)絡(luò) 閱讀:528 作者:張立達(dá) 欄目:關(guān)系型數(shù)據(jù)庫(kù)

1 背景知識(shí)

1.1 解決問(wèn)題

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

1.2 適用情況

  • 存在億萬(wàn)條記錄的數(shù)據(jù)庫(kù),只有千萬(wàn)或者百萬(wàn)條記錄使用RDBMS更加合適

  • 確保你的應(yīng)用不需要使用RDBMS的高級(jí)特性(第二索引,事務(wù)機(jī)制,高級(jí)查詢(xún)語(yǔ)言等)

  • 足夠的硬件配置,即節(jié)點(diǎn)數(shù),HDFS在少于5個(gè)節(jié)點(diǎn)時(shí)并不會(huì)表現(xiàn)得很好,HBase也存在相同情況。

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

2.1 概述

2.1.1 簡(jiǎn)介

  • 使用Java語(yǔ)言開(kāi)發(fā)的NoSQL類(lèi)型的分布式數(shù)據(jù)庫(kù)

  • 不支持RDBMS的一些高級(jí)特性,如事務(wù)機(jī)制,第二索引,高級(jí)查詢(xún)語(yǔ)言等

  • 支持線(xiàn)性和模塊化擴(kuò)展,可以通過(guò)在商用機(jī)器上增加RegionServer來(lái)線(xiàn)性提高性能

2.1.2 HBase特性:

  • 強(qiáng)讀寫(xiě)一致性:適合高速計(jì)數(shù)聚合操作

  • 自動(dòng)切分?jǐn)?shù)據(jù):分布式存儲(chǔ)數(shù)據(jù),隨著數(shù)據(jù)增長(zhǎng)進(jìn)行自動(dòng)切片

  • RegionServer自動(dòng)失效備援

  • 與HDFS集成

  • 支持MapReduce執(zhí)行大規(guī)模并行操作

  • 提供Java Client API

  • 提供Thrift/REST API

  • 針對(duì)大容量查詢(xún)優(yōu)化的塊緩存和Bloom Fliter

  • 可視化管理界面

2.1.3 劣勢(shì)

  • WAL的重新執(zhí)行速度緩慢

  • 故障恢復(fù)緩慢且復(fù)雜

  • 主壓縮會(huì)引起 I/O風(fēng)暴(大量的I/O操作)

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

2.2.1 基礎(chǔ)概念

概念中文解釋備注舉例
Table由多行組成...
Row由一個(gè)Key和一個(gè)或者多列組成

Column由列族和列限定符組成列族:列限定符 ;行與行之間的列可以相差很多
Column Family列族物理上存儲(chǔ)多個(gè)列;為提高性能設(shè)計(jì)的;表格創(chuàng)建時(shí)需要置頂content
Column Qualifier列限定符列族中數(shù)據(jù)的索引表格創(chuàng)建時(shí)不需要指定,可以在任何時(shí)候添加content:html
Cell單元由行、列族、列限定符、值和代表版本的時(shí)間戳組成

TimeStamp時(shí)間戳用來(lái)表示數(shù)據(jù)的版本可以使用系統(tǒng)時(shí)間也可以自己指定

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

Row KeyTime StampColumnFamily contentsColumnFamily anchorColumnFamily people
"com.cnn.www"t9
anchor:cnnsi.com = "CNN"
"com.cnn.www"t8
anchor:my.look.ca = "CNN.com"
"com.cnn.www"t6contents:html = "…

"com.cnn.www"t5contents:html = "…"

"com.cnn.www"t3contents:html = "…

com.example.wwwt5contents:html: "..."
people:author: "John Doe"

說(shuō)明

  1. 表格格式不是唯一和最精確的表達(dá)方式,還可以用Json格式來(lái)表達(dá)

  2. 表格中的空白單元不會(huì)占用物理存儲(chǔ)空間,只是概念上存在

2.2.1.3 操作

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

說(shuō)明

  1. 版本數(shù)的最大值和最小值是可以指定的,并且會(huì)影響操作

  2. 版本(時(shí)間戳)是用來(lái)管控?cái)?shù)據(jù)的存活時(shí)間的,最好不要手動(dòng)設(shè)置

2.2.1.4 局限

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

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

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

2.2.2 架構(gòu)

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

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

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

3)底層儲(chǔ)存是HDFS

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的啟動(dòng)時(shí)間)

2)存儲(chǔ)位置:ZooKeeper中

HMaster:控制者

  • 分配Region:?jiǎn)?dòng)時(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上的垃圾文件回收

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

  • 響應(yīng)client的讀寫(xiě)請(qǐng)求,進(jìn)行I/O操作(直接繞過(guò)HMaster)

  • 與HDFS交互,管理table數(shù)據(jù)

  • 當(dāng)Region的大小到達(dá)閥值時(shí)切分Region

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

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

  • 保證集群中有且只有一個(gè)HMaster為Active

  • 存儲(chǔ)hbase:meta,即所有Region的位置信息

  • 存儲(chǔ)HBase中表格的元數(shù)據(jù)信息

  • 監(jiān)控RegionServer狀態(tài),將RS的上下線(xiàn)情況匯報(bào)給HMaster

  • ZooKeeper集群本身使用一致性協(xié)議(PAXOS協(xié)議)保證每個(gè)節(jié)點(diǎn)狀態(tài)的一致性

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

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

2.3 相關(guān)流程

2.3.1 首次讀寫(xiě)流程

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

2.3.2 寫(xiě)流程

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

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è)表格來(lái)維持region的元數(shù)據(jù)

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

Key

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

Values

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

2)讀取region位置信息的流程

  1. 從ZooKeeper中讀取-ROOT- Table所在HRegionServer

  2. 從該HRegionServer中根據(jù)請(qǐng)求的TableName,RowKey讀取.META. Table所在HRegionServer

  3. 從該HRegionServer中讀取.META. Table的內(nèi)容而獲取此次請(qǐng)求需要訪(fǎng)問(wèn)的HRegion所在的位置

  4. 訪(fǎng)問(wèn)該HRegionSever獲取請(qǐng)求的數(shù)據(jù)

2.5.1.2 hbase:meta

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

2.5.1.3 升級(jí)的目的

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

2.5.2 HLog =>WAL

  • 0.94.x 之前HBase中的WAL實(shí)現(xiàn)稱(chēng)為HLog,存儲(chǔ)在/hbase/.logs/目錄下

  • 0.94.x之后更名為WAL,存儲(chǔ)在/hbase/WALs/目錄下

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

待續(xù)...

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

待續(xù)...

2.8 高級(jí)特性

待續(xù)...

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

3.1 入門(mén)指南

3.1.1 環(huán)境搭建

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

3.1.2 入門(mén)程序

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

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

待續(xù)...

3.3 開(kāi)發(fā)中遇到的問(wèn)題

待續(xù)...

3.4 應(yīng)用

3.4.1 OpenTSDB開(kāi)發(fā)

待續(xù)...

4 聲明

待續(xù)部分將會(huì)后期不定期更新,敬請(qǐng)期待。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI