1. 程式人生 > >HBase概念學習(四)Java API之掃描和過濾器

HBase概念學習(四)Java API之掃描和過濾器

影響 產生 str 實例 分享 get 批量 java api track

HBase主要的CRUD操作就不多介紹了,無非就是Put,Get。Delete三個類的運用。

本文相當於是閱讀HBase權威指南的總結。


一、掃描(Scan)

如今看一下掃描技術,這樣的技術類似於關系型數據庫的遊標(cursor),並利用到了HBase底層順序存儲的特性。

使用掃描的一般步驟是:

1、創建Scan實例
2、為Scan實例添加掃描的限制條件
3、調用HTable的getScanner()方法獲取ResultScanner對象,假設通過HTablePool的方式,則是調用HTablePool的getScanner方法。(註意。HTable類實現了HTableInterface接口,這個接口用於與單個HBase表通信。

) 4、叠代ResultScanner對象中的Result對象訪問掃描結果行。


以下分別解說每個步驟:

(1)創建Scan實例:

構造方法例如以下:

技術分享

能夠創建定義了起始行健和結束行健的Scan對象,返回的包括定義的起始行。可是不包括結束行。

能夠創建定義了過濾器的Scan對象,過濾器的內容稍後介紹。

也能夠創建空白的Scan對象。


(2)創建好Scan對象之後,還能夠添加很多其它的掃描限制條件:

比方能夠限制返回數據的列族,也能夠限制返回數據的列:

技術分享


還能夠限制返回結果的時間戳,時間範圍,甚至限定僅僅返回每一列的一些特定版本號:

技術分享


除此之外還能夠設置過濾器,起始行,結束行等:

技術分享

註意:上述全部Scan類的方法返回的都是Scan對象,使用的是Builder模式。能夠再一行代碼中同一時候設置多個限制條件。


(3)以下就能夠獲取ResultScanner對象:

技術分享


(4)返回ResultScannner對象之後就能夠開始叠代了:

能夠直接轉換為叠代器叠代,也能夠直接用foreach語法叠代:

ResultScanner scanner=table.getScanner(scan);//運行掃描查找     
Iterator<Result> res=scanner.iterator( );//返回查詢遍歷器 

或者 
for(Result res: scanner)
{
    訪問Result獲取行數據
}
註意:掃描操作不會通過一次RPC操作返回全部匹配的行。而是會以行為單位進行返回。

由於一次PRC操作就返回全部匹配數據的話數據量太大。會占用大量的系統資源並花費大量的時間。


1、緩存

依據上面的介紹,叠代ResultScanner的時候每一次顯示或者隱式的next()方法的調用都會產生一次單獨RPC請求,顯然當單元格數據量較小是性能不好。

能夠讓一次RPC請求獲取很多其它的數據。這就是掃描器緩存(Scanner caching)的作用。默認是關閉的。


能夠再三個層面上打開掃描器緩存:

(1)表HTable的層面。這樣由該表產生的全部掃描器實例的緩存都會生效。

(2)掃描器Scanner的層面,這樣僅僅會影響當前的掃描器實例。

(3)整個client層面。須要改動hbase-site.xml配置文件,這樣針對全部的Scanner實例都會生效。

設置掃描器緩存的大小就能控制每次RPC請求取回的行數了!


可是掃描器緩存無疑會添加client和server端的內存消耗,用戶須要在少量的ROC請求次數和client以及服務端內存消耗之間找到平衡點。

假設掃描器緩存大小設置太大。每次next操作返回的時間就會變長,假設client的數據超過了堆的大小,就會得到一個OutOfMemoryException。


2、批量

另一個問題。有些行數據量很大,可能超過client進程內存的容量。能夠用批量(Batch)解決。

緩存是面向行一級的操作,而批量是面向列一級的操作。

批量能夠讓用戶選擇每一次ResultScanner實例的next操作要取回多少列。


二、過濾器(Filter)

過濾器提供了很強大的特性來幫助用戶提高處理表中數據的效率。用戶不僅能夠使用HBase中提前定義好的過濾器。還能夠實現自己定義的過濾器。


HBase中兩種基本的數據讀取機制是Get和Scan,都支持加入很多其它的限制條件來降低查詢得到的數據量,這些限制條件能夠是列族,列,時間戳及版本。

可是他們缺少一些細粒度的篩選功能,比方基於正則表達式的對於行健和值進行篩選,過濾器能夠做到。


Get和Scan兩個類都支持過濾器。全部過濾器都在服務端生效,這稱作謂詞下推(predicate push down),這樣能夠保證被過濾掉的數據不會被傳送到client。

技術分享


過濾器屬性和它們之間的兼容性:

技術分享

技術分享


很多其它具體介紹放到以後。。。


HBase概念學習(四)Java API之掃描和過濾器