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" |
說明:
- 表格格式不是唯一和最精確的表達(dá)方式结榄,還可以用Json格式來表達(dá)
- 表格中的空白單元不會占用物理存儲空間中贝,只是概念上存在
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í)間) |
說明:
- 版本數(shù)的最大值和最小值是可以指定的慷嗜,并且會影響操作
- 版本(時(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)捷枯。
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
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í)間)
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上的垃圾文件回收
HRegionServer:HBase實(shí)際讀寫者
- 響應(yīng)client的讀寫請求已艰,進(jìn)行I/O操作(直接繞過HMaster)
- 與HDFS交互,管理table數(shù)據(jù)
- 當(dāng)Region的大小到達(dá)閥值時(shí)切分Region
本小節(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)的一致性
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í)間)
2)讀取region位置信息的流程
- 從ZooKeeper中讀取-ROOT- Table所在HRegionServer
- 從該HRegionServer中根據(jù)請求的TableName涩笤,RowKey讀取.META. Table所在HRegionServer
- 從該HRegionServer中讀取.META. Table的內(nèi)容而獲取此次請求需要訪問的HRegion所在的位置
- 訪問該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