HBase概念學習(四)Java API之掃描和過濾器
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獲取行數據 }
由於一次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之掃描和過濾器