《HBase权威指南》学习总结
Hbase學(xué)習(xí)總結(jié)
1.HBase概述及部分存儲(chǔ)知識(shí)概述:
架構(gòu)簡介:
簡述: Hbase基于hadoop的HDFS系統(tǒng),其文件存儲(chǔ)都是存儲(chǔ)在HDFS上的。由上圖看到HBase主要處理兩種文件:一種是預(yù)寫日志(Write-Ahead Log,WAL)即圖中的HLog。另一種文件是實(shí)際的數(shù)據(jù)文件HFile(HFile本事就是HDFS的文件,文件格式遵循HBase可導(dǎo)入的格式)。預(yù)寫日志W(wǎng)AL是可開關(guān)的,器主要保障數(shù)據(jù)的穩(wěn)定性。當(dāng)機(jī)器結(jié)點(diǎn)掛掉,可以通過回放日志達(dá)到數(shù)據(jù)恢復(fù)的目的。
HBase中最核心的HRegion模塊如下圖:
簡述:上圖就是HRegionServer的具體的系統(tǒng)的架構(gòu)。具體的關(guān)系一目了然。各個(gè)部件的主要功能如下: HMaster:
HMaster沒有單點(diǎn)問題,HBase中可以啟動(dòng)多個(gè)HMaster,通過Zookeeper的Master Election機(jī)制保證總有一個(gè)Master在運(yùn)行,主要負(fù)責(zé)Table和Region的管理工作:
(1)管理用戶對表的增刪改查操作
(2)管理HRegionServer的負(fù)載均衡,調(diào)整Region分布
(3)Region Split后,負(fù)責(zé)新Region的分布
(4)在HRegionServer停機(jī)后,負(fù)責(zé)失效HRegionServer上Region遷移
Client:
(1)使用HBase RPC機(jī)制與HMaster和HRegionServer進(jìn)行通信
(2)Client與HMaster進(jìn)行通信進(jìn)行管理類操作
(3)Client與HRegionServer進(jìn)行數(shù)據(jù)讀寫類操作
Zookeeper:
(1)Zookeeper Quorum存儲(chǔ)-ROOT-表地址、HMaster地址
(2)HRegionServer把自己以Ephedral方式注冊到Zookeeper中,HMaster隨時(shí)感知各個(gè)HRegionServer的健康狀況
(4)Zookeeper避免HMaster單點(diǎn)問題 ps:HRegionServer管理一些列HRegion對象;每個(gè)HRegion對應(yīng)的Table中一個(gè)Region,HRegion有多個(gè)HStore組成;每個(gè)HStore對應(yīng)Table中一個(gè)Column Family的存儲(chǔ);
2.存儲(chǔ)架構(gòu):
HBase的存儲(chǔ)系統(tǒng)簡單描述一下,HBase和BigTable(BigTable的論文如下:http://box.cloud.taobao.com/file/downloadFile.htm?shareLink=1G0bDlGn)一樣,都是基于LSM樹的系統(tǒng)。
下面簡述一下LSM樹:
在LSM樹系統(tǒng)中:輸入數(shù)據(jù)首先被存儲(chǔ)在日志文件,這些文件內(nèi)的數(shù)據(jù)完全有序。當(dāng)有日志文件被修改時(shí),對應(yīng)的更新會(huì)被保存在內(nèi)存中來加速查詢。從宏觀上來說,LSM樹原理是把一個(gè)大樹拆分成N棵小樹,它首先寫入內(nèi)存中,對著小樹越來越大,內(nèi)存中的小樹會(huì)flush到磁盤中,磁盤定期可以做merge操作,合并成一棵大樹,以優(yōu)化讀性能。
附稿:
BigTable論文中關(guān)鍵信息總結(jié):
3.WAL:WAL是標(biāo)準(zhǔn)的Hadoop SequenceFile,并且存儲(chǔ)了HLogKey實(shí)例。這些鍵包括序列號和實(shí)際數(shù)據(jù),所以在服務(wù)器崩潰時(shí)可以回滾還沒有持久化的數(shù)據(jù)。
ps:一旦數(shù)據(jù)被寫入WAL中,數(shù)據(jù)就會(huì)被放到MemStore中。同時(shí)還會(huì)檢查Memstore是否已經(jīng)滿了,如果滿了,就會(huì)被請求刷寫到磁盤中去。
4.Table&Region:(1)Table隨著記錄增多不斷變大,會(huì)自動(dòng)分裂成多份Splits,成為Regions。(2)一個(gè)region由[startkey,endkey)表示。(3)不同region會(huì)被Master分配給相應(yīng)的RegionServer進(jìn)行管理。
5.數(shù)據(jù)訪問結(jié)構(gòu):
?首先會(huì)有zookeeperfile獲取-ROOT-結(jié)點(diǎn)的地址,-ROOT-是一張?zhí)厥獾谋?#xff0c;并且只會(huì)存在一個(gè)Region上,記錄著.META.表的位置,.META.用戶表的region信息,.META.本身可以橫跨多個(gè)Region。客戶請求獲取地址信息的過程,就是這樣一個(gè)樹狀結(jié)構(gòu),逐級請求。
6.HBase的一個(gè)特殊的功能是,能為一個(gè)單元格(一個(gè)特定列的值)存儲(chǔ)多個(gè)版本的數(shù)據(jù)。這是通過每個(gè)版本使用一個(gè)時(shí)間戳。并且按照降序存儲(chǔ)來實(shí)現(xiàn)的。每個(gè)時(shí)間戳是一個(gè)長整型值,以毫秒為單位。
2.客戶端API:
Hbase客戶端簡單的CRUD操作:
(1) put方法,一類作用于單行,另一類作用于多行。 ps:當(dāng)每一次不指定時(shí)間戳調(diào)用Put類的add方法時(shí),Put實(shí)例會(huì)使用來自構(gòu)造函數(shù)的可選的時(shí)間戳參數(shù)(也稱作ts),如果用戶在構(gòu)造Put實(shí)例時(shí)也沒有時(shí)間指定時(shí)間戳,則時(shí)間戳將會(huì)有Region服務(wù)器設(shè)定。
(2) 原子性的put操作(compare-and-set):
(3) get方法:
I.get方法分為兩類,一類是一次獲取一行數(shù)據(jù);另一類是一次獲取多行數(shù)據(jù)。獲取數(shù)據(jù)時(shí)可以獲取一個(gè)或多個(gè)列族的數(shù)據(jù),也可以指定獲取的列族內(nèi)數(shù)據(jù)的特定的列。或者指定時(shí)間戳范圍或者版本數(shù)目進(jìn)行查詢。
II.獲取多行數(shù)據(jù)get方法的方法簽名如下:
ps:用戶可以一次請求獲取多行數(shù)據(jù)。它允許用戶快速高效地從遠(yuǎn)程服務(wù)器獲取相關(guān)的或完全隨機(jī)的多行數(shù)據(jù)。
(4) exists方法通過RPC驗(yàn)證請求的數(shù)據(jù)是否存在,但不會(huì)從遠(yuǎn)程服務(wù)器返回請求的數(shù)據(jù),只返回一個(gè)布爾值表示這個(gè)結(jié)果。
ps:用戶通過這種方法只能避免網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)拈_銷,不過需要檢查或頻繁檢查一個(gè)比較大的列時(shí),這種方法還是十分實(shí)用的。 (5) Delete 方法:
Delete方法可以刪除一列中特定的版本,一列中全部版本,給定版本或更舊的版本,刪除整個(gè)列族,或者刪除列族中所有列的給定版本或更舊的版本。
另外和Put方法類似,也可以刪除一個(gè)Delete列表對象:
接口如下:
(5) 原子性操作 compare-and-delete:
方法簽名如下:
(6) 批量操作:
上面總結(jié)了對Hbase單行的操作,Hbase還提供了批量操作的接口,可以對多行進(jìn)行操作,并且可以實(shí)現(xiàn)多行的Put,Get或Delete操作。
方法簽名如下:
(7) 數(shù)據(jù)掃描 Scan:
顧名思義Scan操作能掃描遍歷Hbase數(shù)據(jù)庫中的數(shù)據(jù),掃描器的獲取通過 HTable.getScanner()獲取,此方法返回真正的掃描器實(shí)例的同時(shí),用戶也可以使用它迭代獲取數(shù)據(jù),方法簽名如下:
同時(shí)Scan類擁有以下構(gòu)造器:
(8) ResultScanner:
掃描操作一次可能請求大量的行,如果全部返回可能占用大量的內(nèi)存和帶寬,ResultScanner把掃描操作轉(zhuǎn)換為類似get操作,將每一行數(shù)據(jù)封裝成一個(gè)Result實(shí)例。
ResultScanner的一些方法如下:
2.過濾器:
Hbase過濾器(filter)提供了非常強(qiáng)大的特性來幫助用戶提高其處理表中數(shù)據(jù)的效率。用戶不僅可以使用Hbase中預(yù)定義好的過濾器,而且可以實(shí)現(xiàn)自定義的過濾器。
Get和Scan兩個(gè)類都支持過濾器,理由如下:這類對象不能對行鍵、列名或列值進(jìn)行過濾,但是通過過濾器可以達(dá)到這個(gè)目的。除了Hbase內(nèi)置的filter外,用戶可以實(shí)現(xiàn)Filter接口來自定義需求。所有過濾器都在服務(wù)器端生效,叫做謂詞下推。
(1)比較過濾器 CompareFilter:
方法簽名:
用戶使用時(shí)需要傳入操作符,和待比較的值,比如大于或小于多少才從服務(wù)器端返回?cái)?shù)據(jù)。
(2)行過濾器 RowFilter:
方法簽名:
可以過濾大于、小于或等于指定行鍵的數(shù)據(jù)。
(3)列族過濾器(FamilyFilter):
方法簽名和行過濾器類似:
用來過濾滿足條件的列族。
(4)值過濾器(ValueFilter):
方法簽名:
用來過濾滿足條件的列值。
(5)參考過濾器(DependentColumnFilter):
簡述:這個(gè)是一種特殊的過濾器,這個(gè)過濾器的比較傳入的參考值不再是指定的常量,而是相對于Hbase自身的某一行做比較。
方法簽名如下:
方法參數(shù)分別是參考列的列族和列名,如果某列和該列含有不同的時(shí)間戳,則被丟棄掉。
+++ DependentColumnFilter(byte[] family,byte[] qualifiter,boolean dropDependentColumn) 這個(gè)方法和上面的方法類似,只不過增加了一個(gè)布爾值定義是否包含參考咧。 +++
這個(gè)方法定義了所有列和指定列的值的比較。 這個(gè)過濾器從參數(shù)名稱上不太好理解,可以參考官網(wǎng)的wiki(http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/filter/DependentColumnFilter.html)
(6)單列值過濾器(SingleColumnValueFilter):
簡述:用戶針對如下情況是可以使用該過濾器:用一列的值決定是否一行數(shù)據(jù)被過濾。首先設(shè)定待檢查的列,然后設(shè)置待檢查的列的對應(yīng)值。方法簽名如下:
(7)單列值排除過濾器(SingleColumnValueExcludeFilter):
簡述:單列值排除過濾器集成自SingleColumnValueFilter,經(jīng)過拓展后提供一種略微不同的語意:參考列不被包括在結(jié)果中。
(8)前綴過濾器(PrefixFilter):
簡述:當(dāng)構(gòu)造當(dāng)前過濾器時(shí)傳入一個(gè)前綴,所有與前綴匹配的行都會(huì)被返回客戶端。構(gòu)造函數(shù)如下:
(9)分頁過濾器(PageFilter):
簡述:用戶可以使用這個(gè)過濾器對結(jié)果按行分頁。當(dāng)用戶創(chuàng)建當(dāng)前過濾器實(shí)例時(shí)需要指定pagesize參數(shù),這個(gè)參數(shù)可以控制每頁返回的行數(shù)。
實(shí)例代碼如下:
ps:Hbase中的行鍵是按字典序排列的,因此返回的結(jié)果也是如此排序的,并且起始行是被包括在結(jié)果中的。
(10)行鍵過濾器(KeyOnlyFilter):
簡述:在一些應(yīng)用中只需要將結(jié)果中的KeyValue中的鍵返回,而不需要返回實(shí)際的數(shù)據(jù)。利用這個(gè)過濾器可以實(shí)現(xiàn)這個(gè)目的。
(11)首次行鍵過濾器(FirstKeyOnlyFilter):
簡述:這個(gè)類使用了過濾器框架提供的另一個(gè)優(yōu)化特性:他在檢查完第一列之后會(huì)通知region服務(wù)器結(jié)束對當(dāng)前列的掃描,并跳到下一行,與全表掃描相比,其性能得到了提升。
這種過濾器通常在行數(shù)統(tǒng)計(jì)(row counter)的應(yīng)用場景中使用。具體使用參考blog:http://blog.csdn.net/liuxiaochen123/article/details/7878580?
(12)包含結(jié)束過濾器(InclusiveStopFilter):
簡述:掃描操作中的開始行被包含在結(jié)果中,但終止行被排除在外。使用這個(gè)過濾器是,用戶也可以將結(jié)束行包含到結(jié)果中。
(13)時(shí)間戳過濾器(TimeStampsFilter):
簡述:當(dāng)用戶需要在掃描結(jié)果中對版本進(jìn)行細(xì)粒度的控制時(shí),這個(gè)過濾器可以滿足需求。用戶需要傳入一個(gè)裝載了時(shí)間戳list實(shí)例。
(14)列計(jì)數(shù)過濾器(ColumnCountGetFilter):
簡述:用戶可以使用這個(gè)過濾器來限制每行最多取回多少列。當(dāng)一行列的列數(shù)達(dá)到設(shè)定的最大值時(shí),這個(gè)過濾器會(huì)停止這個(gè)掃描操作,所以它不太適合掃描操作,反而比較適合在get()方法中使用。
(15)列前綴過濾器(ColumnPrefixFilter):
簡述:類似于PrefixFilter,這個(gè)過濾器通過列名稱進(jìn)行前綴匹配過濾。用戶需要指定一個(gè)前綴來創(chuàng)建過濾器。所有與設(shè)定前綴匹配的列都會(huì)包含在結(jié)果中。
(16)隨機(jī)行過濾器(RandomRowFilter):
簡述:這個(gè)過濾器可以讓結(jié)果中包含隨機(jī)的行。構(gòu)造函數(shù)需要傳入?yún)?shù)chance,chance取值區(qū)間在0.0和1.0之間。其內(nèi)部實(shí)現(xiàn)原理用到了java 的 Random.nextFloat,當(dāng)chance取負(fù)數(shù)時(shí),將包含排除所有的行,但取值大于1.0時(shí),將包含所有的行。
(17)跳轉(zhuǎn)過濾器(SkipFilter):
簡述:這個(gè)過濾器包裝了一個(gè)用戶提供的過濾器,當(dāng)被包裝的過濾器遇到一個(gè)需要過濾的KeyValue實(shí)例時(shí),用戶可以拓展并過濾掉整行數(shù)據(jù)。換句話說,當(dāng)過濾器發(fā)現(xiàn)某一行中的一列需要過濾時(shí),那么整行數(shù)據(jù)將被過濾掉。
(18)全匹配過濾器(WhileMatchFilter):
簡述:當(dāng)被過濾的數(shù)據(jù)中,遇到一行不匹配時(shí),則放棄整個(gè)過濾操作。即列匹配才會(huì)繼續(xù)執(zhí)行,遇到不匹配的列則中斷執(zhí)行(估計(jì)也是性能優(yōu)化點(diǎn))。
(19)FilterList:
簡述:實(shí)際應(yīng)用中,用戶可能需要多個(gè)過濾器共同限制返回到客戶端的結(jié)果,FilterList(過濾器列表)提供了這項(xiàng)功能。
(20)自定義過濾器:
簡述:最后,用戶可能需要按各自的需求實(shí)現(xiàn)自定義過濾器。用戶可以實(shí)現(xiàn)Filter接口或者直接繼承FilterBase類,后者已經(jīng)為接口中所有成員方法提供了默認(rèn)實(shí)現(xiàn)。
ps:過濾器設(shè)在在Scan和Get對象當(dāng)中,具體過濾器的執(zhí)行全部多事在服務(wù)端執(zhí)行,用以減少服務(wù)端和客戶端的網(wǎng)絡(luò)IO。
3.計(jì)數(shù)器:
Hbase內(nèi)部提供了計(jì)數(shù)器,可以用來統(tǒng)計(jì)Hbase表的一些信息,例如:用于記錄某個(gè)列值的個(gè)數(shù)。
4.客戶端管理API:
除了進(jìn)行數(shù)據(jù)處理的客戶端API,HBase還提供了數(shù)據(jù)描述的API,類似于傳統(tǒng)RDBMS中的DDL和DML。因?yàn)樯a(chǎn)環(huán)境,作為基于Hbase的開發(fā)人員基本無法獲取HBaseAdmin的管理權(quán)限,針對DDL和DML的API就不詳細(xì)介紹了,這部分內(nèi)容了解一下就可以了。
3.HBase涉及的技術(shù)亮點(diǎn):
(1)事物型HBase:帶索引的事物型HBase項(xiàng)目有一些取代默認(rèn)客戶端類和服務(wù)端類的擴(kuò)展類,它們增加了跨行跨表的事物支持。在Region服務(wù)器中,更準(zhǔn)確的說,每個(gè)Region都保持了一個(gè)事物的列表。該列表是有beginTransaction()調(diào)用初始化,并且相應(yīng)的commit()調(diào)用結(jié)束。每次讀寫操作都有一個(gè)事物ID,以保護(hù)調(diào)用不受其他事物影響。
(2)用Zookeeper來維持事物:Zookeeper也提供了一個(gè)能夠被用于實(shí)現(xiàn)兩階段提交的事務(wù)鎖解決方案。
7.布隆過濾器(Bloom Filter):布隆過濾器可以用于檢索一個(gè)元素是否在一個(gè)集合中。它的優(yōu)點(diǎn)是空間效率和查詢時(shí)間都遠(yuǎn)遠(yuǎn)超過一般的算法,缺點(diǎn)是有一定的誤識(shí)別率和刪除困難。布隆過濾器的原理是Hash表,其用Hash函數(shù)將某個(gè)元素映射成位列陣中的某個(gè)點(diǎn),用以高效的識(shí)別集合是否包含這個(gè)元素。而HBase中也內(nèi)置了布隆過濾器的功能,例如可以快速的判斷某個(gè)列簇文件中是否包含某個(gè)值。
8.Bulkload數(shù)據(jù)導(dǎo)入,HBase提供了Bulkload數(shù)據(jù)導(dǎo)入的方式,可以通過Hbase自帶的工具和利用其API自己寫MR的方式將HDFS文件轉(zhuǎn)換成HFILE的文件格式,其實(shí)其還是HDFS文件,不過文件格式變成了HBase的存儲(chǔ)文件,然后通過其load API就能導(dǎo)入到數(shù)據(jù)庫中。
Hfile文件格式如下圖:
ps:可見其存儲(chǔ)都是keyvalue的形式,還沒完全包明白暫時(shí)不詳細(xì)總結(jié)了。
HBase內(nèi)置的用于生成HFILE的API是:org.apache.hadoop.hbase.mapreduce.ImportTsv
具體的調(diào)用方式如下:
ps: HFILEPATH:就是生成的Hfile的存儲(chǔ)路徑。SEPATATER就是數(shù)據(jù)行的分隔符。COLUMNS就是需要導(dǎo)入的列名,這個(gè)比較講究,這個(gè)是根據(jù)HDFS的列的數(shù)據(jù)來定義的,比如寫成:HBASEROW_KEY,cf:value1,cf:value2 就表示HDFS的第一列作為ROWKEY,這個(gè)HBASEROWKEY是約定好的關(guān)鍵字,這個(gè)關(guān)鍵字放在什么位置就表示HDFS的第幾列作為rowkey,同時(shí)也就要求被轉(zhuǎn)換的HDFS文件必須某一列可以作為rowkey(可能需要預(yù)處理)。然后cf就是列族,value就是對應(yīng)的列名。
總結(jié)
以上是生活随笔為你收集整理的《HBase权威指南》学习总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis简单案例(四) Session
- 下一篇: AOP切入同类调用方法不起作用,AopC