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