HBase应用快速学习
HBase是一個高性能、面向列、可伸縮的開源分布式NoSQL數(shù)據(jù)庫,是Google Bigtable的開源實(shí)現(xiàn)。?
HBase的思想和應(yīng)用和傳統(tǒng)的RDBMS,NoSQL等有比較大的區(qū)別,這篇文章從HBase的架構(gòu)和關(guān)鍵的Rowkey設(shè)計(jì)入手,快速學(xué)習(xí)相關(guān)應(yīng)用。
?
一、 HBase設(shè)計(jì)特性
HBase概述
HBase是一個構(gòu)建在HDFS上的分布式列存儲系統(tǒng),將數(shù)據(jù)按照表、行和列進(jìn)行存儲,與hadoop一樣,Hbase目標(biāo)主要依靠橫向擴(kuò)展,通過不斷增加廉價的商用服務(wù)器,來增加計(jì)算和存儲能力。
HBase與HDFS區(qū)別
HDFS是Hadoop Distribute File System 的簡稱,也就是Hadoop的一個分布式文件系統(tǒng)。
實(shí)際應(yīng)用中,Spark以及 Hadoop 的 MapReduce,可以理解為一種計(jì)算框架。
而 HDFS 可以認(rèn)為是為計(jì)算框架服務(wù)的存儲層。HBase 是一種列式的分布式數(shù)據(jù)庫,類似于 Hive,HBase 底層依賴 HDFS 來作為其物理存儲。
?
二、 HBase數(shù)據(jù)模型
HBase是基于Google BigTable模型開發(fā)的,典型的key/value系統(tǒng)。
Hbase邏輯視圖
- RowKey:是Byte array,是表中每條記錄的“主鍵”,方便快速查找,Rowkey的設(shè)計(jì)非常重要。
- Column Family:列族,擁有一個名稱(string),包含一個或者多個相關(guān)列
- Column:屬于某一個columnfamily,familyName:columnName,每條記錄可動態(tài)添加
- Value:Byte array
Hbase支持的操作
所有操作均是基于rowkey的;?
支持CRUD( Create、 Read、 Update和Delete)和Scan;?
-
單行操作 Put Get Scan?
-
多行操作 Scan MultiPut?
沒有內(nèi)置join操作,可使用MapReduce解決。
?
三、 HBase物理結(jié)構(gòu)
Region雖然是分布式存儲的最小單元,但并不是存儲的最小單元。Region由一個或者多個Store組成,每個store保存一個columns family,每個Strore又由一個memStore和0至多個StoreFile組成,StoreFile包含HFile;memStore存儲在內(nèi)存中,StoreFile存儲在HDFS上。
Region的存儲策略
- Table中所有行都按照row key的字典序排列;
- Table在行的方向上分割為多個Region;
- Region按大小分割的,每個表開始只有一個region,隨著數(shù)據(jù)增多,region不斷增大,當(dāng)增大到一個閥值的時候,region就會等分會兩個新的region,之后會有越來越多的region;
- Region是Hbase中分布式存儲和負(fù)載均衡的最小單元,不同Region分布到不同RegionServer上。
HFile的結(jié)構(gòu)
HFile是HBase中KeyValue數(shù)據(jù)的存儲格式,HFile是Hadoop的二進(jìn)制格式文件,實(shí)際上StoreFile就是對HFile做了輕量級包裝,即StoreFile底層就是HFile。
除了HFile,HBase還有HLog File。
HLog File是HBase中WAL(Write Ahead Log) 的存儲格式,物理上是Hadoop的Sequence File。
?
四、 HBase設(shè)計(jì)與架構(gòu)
整體架構(gòu)
HBase采用Master/Slave架構(gòu)搭建集群,整體架構(gòu)包括HMaster節(jié)點(diǎn)、HRegionServer節(jié)點(diǎn)、ZooKeeper集群,底層的數(shù)據(jù)存儲于HDFS中,涉及到HDFS的NameNode、DataNode等。
HMaster解析
HMaster是HBase主/從集群架構(gòu)中的中央節(jié)點(diǎn),通常一個HBase集群存在多個HMaster節(jié)點(diǎn),其中一個為Active Master,其余為Backup Master。HMaster管理HRegionServer,實(shí)現(xiàn)其負(fù)載均衡,負(fù)責(zé)管理和分配HRegion,比如在HRegion split時分配新的HRegion。
?
- 發(fā)現(xiàn)失效的Region server并重新分配其上的region
- 實(shí)現(xiàn)DDL操作(Data Definition Language,namespace和table的增刪改,column familiy的增刪改等)
- 管理namespace和table的元數(shù)據(jù)(實(shí)際存儲在HDFS上)
- 處理schema更新請求
?
HRegionServer解析
HRegionServer存放和管理本地HRegion,讀寫HDFS,管理Table中的數(shù)據(jù)。 Client直接通過HRegionServer讀寫數(shù)據(jù)(從HMaster中獲取元數(shù)據(jù),找到RowKey所在的HRegion/HRegionServer后)。
- 維護(hù)master分配給他的region,處理對這些region的io請求
- 負(fù)責(zé)切分正在運(yùn)行過程中變的過大的region
ZooKeeper集群
ZooKeeper是協(xié)調(diào)系統(tǒng),用于存放整個HBase集群的元數(shù)據(jù)以及集群的狀態(tài)信息。 實(shí)現(xiàn)HMaster主從節(jié)點(diǎn)的failover。
HBase Client通過RPC方式和HMaster、HRegionServer通信,一個HRegionServer可以存放1000個HRegion。 底層Table數(shù)據(jù)存儲于HDFS中,而HRegion所處理的數(shù)據(jù)盡量和數(shù)據(jù)所在的DataNode在一起,實(shí)現(xiàn)數(shù)據(jù)的本地化,在HRegion移動(如因Split)時,需要等下一次Compact才能繼續(xù)回到本地化。
?
五、 HBase最佳實(shí)踐
?
HBase適合的場景
- 大數(shù)據(jù)量存儲,大數(shù)據(jù)量高并發(fā)操作
- 讀寫訪問均是非常簡單的操作
?
Rowkey如何設(shè)計(jì)
(1)針對查詢優(yōu)化
除了全表掃描以外,HBase的查詢實(shí)現(xiàn)只支持兩種方式:
- get:指定rowkey獲取唯一一條記錄
- scan:按指定的條件獲得一批記錄,通過rowKey的range匹配一個范圍,然后通過多種filter在范圍內(nèi)篩選
如果我們想提升查詢效率,必須在rowKey的設(shè)計(jì)上下功夫。
HBase的rowKey是基于字典排序的,具體來說是基于key的ASCII碼來排序,一般的rowkey是通過業(yè)務(wù)上的多個因素相互組合,一步步確定查找范圍。
比如時間肯定是我們應(yīng)該加到rowKey里的一個查詢因子,一個開始時間跟一個截止時間就形成了一個時間段范圍,就能固定一個結(jié)果集范圍。
(2)合適的長度
rowkey是一個二進(jìn)制碼流,可以是任意字符串,最大長度64kb,實(shí)際應(yīng)用中一般為10-100bytes,以byte[]形式保存,一般設(shè)計(jì)成定長。
- 數(shù)據(jù)的持久化文件HFile中是按照KeyValue存儲的,如果Rowkey過長比如100個字節(jié),在上億級別的海量數(shù)據(jù)下,會造成存儲空間的浪費(fèi)
- MemStore將緩存部分?jǐn)?shù)據(jù)到內(nèi)存,如果Rowkey字段過長內(nèi)存的有效利用率會降低,系統(tǒng)將無法緩存更多的數(shù)據(jù),這會降低檢索效率
- 目前操作系統(tǒng)是都是64位系統(tǒng),內(nèi)存8字節(jié)對齊,可以控制在16個字節(jié)或者32字節(jié)等
(3)更好的散列設(shè)計(jì)
如果rowkey按照時間戳的方式遞增,不要將時間放在二進(jìn)制碼的前面,建議將rowkey的高位作為散列字段,由程序隨機(jī)生成,低位放時間字段,這樣將提高數(shù)據(jù)均衡分布在每個RegionServer,以實(shí)現(xiàn)負(fù)載均衡的幾率。如果沒有散列字段,字段前綴部分直接是時間信息,大量數(shù)據(jù)數(shù)據(jù)都會集中在一個RegionServer上,造成熱點(diǎn)問題,降低查詢效率。
?
Region分區(qū)優(yōu)化
(1)避免熱點(diǎn)Region
HBase中的行是按照rowkey的字典順序排序的,這種設(shè)計(jì)將相關(guān)的行以及會被一起讀取的行存取在臨近位置,便于scan。
HBase中,表會被劃分為n個Region,托管在RegionServer中,StartKey與EndKey表示這個Region維護(hù)的rowKey范圍。
默認(rèn)的策略是當(dāng)一個Region過大時,進(jìn)行一次分裂(region-split)操作,后續(xù)的rowkey會被分配到新的Region。
明顯這種策略很容易出現(xiàn)熱點(diǎn)Region,大量訪問會使熱點(diǎn)region所在的單個機(jī)器響應(yīng)緩慢,引起性能下降甚至region不可用,
同時會影響同一個RegionServer上的其他region,由于主機(jī)無法服務(wù)其他region的請求。
在設(shè)計(jì)Region時應(yīng)該設(shè)計(jì)良好的數(shù)據(jù)訪問模式以使集群被充分,均衡的利用。
(2)預(yù)分區(qū)設(shè)計(jì)
解決熱點(diǎn)Region問題的一個策略就是通過對rowkey進(jìn)行Hash進(jìn)行預(yù)分區(qū)。
這里又設(shè)計(jì)到rowkey的設(shè)計(jì)問題,設(shè)計(jì)rowkey時盡量把前綴部分打散,可以使用隨機(jī)數(shù)等, 只要region所管理的start-end keys范圍比較隨機(jī),那么就可以解決寫熱點(diǎn)問題。
更進(jìn)一步,可以預(yù)估系統(tǒng)的容量,規(guī)劃可能的Region數(shù)量,通過一個路由算法進(jìn)行負(fù)載均衡。
?
?
總結(jié)
以上是生活随笔為你收集整理的HBase应用快速学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件操作之按照字符读写文件
- 下一篇: 为什么百度首页的HTML源代码最后一行要