1,hbase讀流程
首先通過meta表找到要讀數(shù)據(jù)的region所在的RegionServer,然后去BlockCash中讀取,如果沒有就去Memstore中讀取,如果也沒有,那就去Hfile中去讀
(1) 客戶端訪問Zookeeper,獲取存放目標數(shù)據(jù)的Region信息,從而找到對應(yīng)的RegionServer。
(2) 通過RegionServer獲取需要查找的數(shù)據(jù)。
(3) Regionserver的內(nèi)存分為MemStore和BlockCache兩部分,MemStore主要用于寫數(shù)據(jù),BlockCache主要用于讀數(shù)據(jù)。讀請求先到BlockCache中查數(shù)據(jù),查不到就到MemStore中查,再查不到就會到StoreFile上讀,并把讀的結(jié)果放入BlockCache。
尋址過程:client-->Zookeeper-->.META.表-->RegionServer-->Region-->client
2,hbase寫流程
1,首先找到要寫數(shù)據(jù)的region所在的RegionServer,然后先將數(shù)據(jù)寫入到WAL中,再將數(shù)據(jù)寫到Menstore中等待刷新,最后回復(fù)客戶端寫入完成
2,當客戶端發(fā)起一個Put請求時,首先它從hbase:meta表中查出該Put數(shù)據(jù)最終需要去的
HRegionServer。然后客戶端將Put請求發(fā)送給相應(yīng)的HRegionServer,在HRegionServer中它首先會將該Put操作寫入WAL日志文件中(Flush到磁盤中)。
3,訪問hbase中行的三種方式
與nosql數(shù)據(jù)庫們一樣,row key是用來檢索記錄的主鍵。只有3中方式:
1 通過單個row key訪問(get訪問單行數(shù)據(jù))
2 通過row key的range(訪問某個區(qū)間內(nèi)的rowkey,訪問多行數(shù)據(jù))
3 全表掃描 (scan訪問全本的數(shù)據(jù))
4, rowkey設(shè)計的三大要點
1,長度:rowkey是一個二進制碼流,最大長度是64kb,內(nèi)部存儲為字節(jié)數(shù)組。如果太大的話,會浪費空間,一般是越短越好。一般不要超過16個字節(jié)。
2, 散列:Hbase中的數(shù)據(jù)是按照RowKey的字典順序排列的; rowkey由兩部分組成,高位是程序自動生成的無規(guī)律+自己設(shè)計的遞增規(guī)則。散列就是讓rowkey分散在集群的各個機器上,盡量不要讓它集中在一個地方。因為不管你設(shè)計的是何種自增,遞增的部分都是有規(guī)律的,如果把他放高位,就會不可避免的出現(xiàn)熱點,所以才把程序生成部分放在rowkey高位,低位放例如時間字段。熱點排序是Hbase的一大缺點,一般會讓集群失效。
3,唯一性:需要用其來定位數(shù)據(jù),必須唯一。
5, Hbase基本概念
1, RowKey(行鍵)
相當于關(guān)系型數(shù)據(jù)庫中的主鍵,具有唯一性,在內(nèi)部被存為字節(jié)數(shù)組,最大不超過64k,一般是16個字節(jié)(一個漢字=2個字母=2個字節(jié)(Byte)=8個bit位),1kb=1024Byte;按照字典序排列,注意避免數(shù)據(jù)熱點問題
2, Column Family(列族)
是表Schema的一部分,包含一個或者多個列,是列的前綴,Hbase中每個列都歸屬于某個列族,需要在創(chuàng)建表的時候就需要指定好;一個Schema一般有一到三個列族;一個列族包含的所有列在物理存儲上都是在同一個底層的存儲文件當中。
3,Cell(單元格)
一個單元格就是由前面說的行鍵、列標示、版本號唯一確定的字節(jié)碼
Hbase表的索引是行鍵、列族、列限定符和時間戳
4,Version Number(版本號)
默認是時間戳,降序排列,最后寫入的值會被優(yōu)先讀取
5,HRegion
Table在行的方向上分割為多個HRegion,Hregion是按照大小分割的,每個表一開始只有一個Hregion,隨著數(shù)據(jù)不斷插入表,它越來越大,默認10G,達到閾值的時候會分裂split為兩個HRegion;HRegion是Hbase擴展和負載均衡的基本單元,是分布式存儲的最小單元;不同的HRegion分布到不同的RegionServer上;
一個HRegion有一個或者多個HStore組成,每一個HStore保存一個列族;每個HStore又是有一個MemStore和0或多個HFile組成,Memstore是存儲在內(nèi)存中,HFile存儲在HDFS上,數(shù)據(jù)都會先寫入到MemStore上,一旦MenStore達到閾值,就會持久化到HFile中去;
6,三大組件
Client: 它包含訪問Hbase的接口,維護這一些緩存來加快對hbase的訪問,比如緩存中記錄著Region的位置信息
Master節(jié)點: 主要為各個RegionServer分配Region,負責RegionServer的負載均衡,管理用戶對Table的CRUD操作
RegionServer節(jié)點: 維護Region,處理Region的IO請求,負責在運行過程中變得過大的Region進行拆分
6, Hbase特點
1,擴展性好
去掉關(guān)系型數(shù)據(jù)庫的關(guān)系特性,數(shù)據(jù)之間是弱關(guān)系,非常容易擴展,
2,面向列
只訪問查詢涉及的列,去掉冗余列,大量降低IO;而且支持動態(tài)添加列
對于為Null的列,不占用存儲空間,表可以設(shè)計的非常稀疏
列存儲每一列數(shù)據(jù)類型一致,而行存儲在一行記錄中保存了多種類型的數(shù)據(jù),數(shù)據(jù)解析需要在多種數(shù)據(jù)類型之間頻繁轉(zhuǎn)換,影響性能,增加時間
3,以Hdfs作為文件存儲系統(tǒng),支持分布式的海量存儲,達到PB級別
4,并發(fā)性能好
通過MapReduce支持大并發(fā)處理,海量數(shù)據(jù);在大數(shù)據(jù)量下具有非常好的讀寫性能,
7, Hbase數(shù)據(jù)熱點 (讀)
熱點:檢索habse的記錄首先要通過row key來定位數(shù)據(jù)行。當大量的client訪問hbase集群的一個或少數(shù)幾個節(jié)點,造成少數(shù)region server的讀/寫請求過多、負載過大,而其他region server負載卻很小,就造成了“熱點”現(xiàn)象
HBase中,表會被劃分為1…n個Region,被托管在RegionServer中。Region有二個重要的屬性:StartKey與EndKey表示這個Region維護的rowKey范圍,當我們要讀/寫數(shù)據(jù)時,如果rowKey落在某個start-end key范圍內(nèi),那么就會定位到目標region并且讀/寫到相關(guān)的數(shù)據(jù)。
8, Hbase數(shù)據(jù)傾斜 (寫)
數(shù)據(jù)傾斜:Hbase中數(shù)據(jù)是按照字典順序排列的,當大量連續(xù)的rowkey集中寫在某一個Hregion上,各個Hregion之間數(shù)據(jù)就會分布不均勻
默認的情況下,創(chuàng)建一張表是,只有1個region,start-end key沒有邊界,所有數(shù)據(jù)都在這個region里裝,然而,當數(shù)據(jù)越來越多,region的size越來越大時,大到一定的閥值,hbase認為再往這個region里塞數(shù)據(jù)已經(jīng)不合適了,就會找到一個midKey將region一分為二,成為2個region,這個過程稱為分裂(region-split)。而midKey則為這二個region的臨界(這個中間值這里不作討論是如何被選取的)。
此時,我們假設(shè)假設(shè)rowkey小于midKey則為會被塞到1區(qū),大于等于midKey則會被塞到2區(qū),如果rowkey還是順序增大的,那數(shù)據(jù)就總會往2區(qū)里面寫數(shù)據(jù),而1區(qū)現(xiàn)在處于一個被冷落的狀態(tài),而且是半滿的。2區(qū)的數(shù)據(jù)滿了會被再次分裂成2個區(qū),如此不斷產(chǎn)生被冷落而且不滿的Region,當然,這些region有提供數(shù)據(jù)查詢的功能。
這種設(shè)計是分布式系統(tǒng)一個很大的弊端,而且這樣導(dǎo)致數(shù)據(jù)傾斜和熱點問題,從而導(dǎo)致集群的資源得不到很好的利用。
解決:預(yù)分區(qū),加鹽,哈希,反轉(zhuǎn)