1. 程式人生 > >Hbase 筆記(4) 客戶端API高階效能

Hbase 筆記(4) 客戶端API高階效能

1、比較運算子 

CompareFilter.CompareOp.LESS

CompareFilter.CompareOp.LESS_OR_EQUAL

CompareFilter.CompareOp.EQUAL

CompareFilter.CompareOp.NOT_EQUAL

CompareFilter.CompareOp.GREATER_OR_EQUAL

CompareFilter.CompareOp.GREATER

2、比較器

BinaryComparator :              使用Bytes.compareTo()

BinaryPrefixComparator :    

使用Bytes.compareTo() 字首匹配

NullComparator:                   判斷是不是Null   

BitComparator:                      使用And、Or、Xor 方法。只能用EQUAL、NOT_EQUAL

RegexStringComparator:     正則表示式。只能用EQUAL、NOT_EQUAL

SubstringComparator:         使用String的contains 方法。只能用EQUAL、NOT_EQUAL 

3、比較過濾器

(1)、行過濾器 RowFilter extends CompareFilter

        Scan scan = new Scan();  
        Filter filter = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, 
                new BinaryComparator(Bytes.toBytes("row-22")));
        scan.setFilter(filter);        
        scan.addColumn(Bytes.toBytes("CF1"), Bytes.toBytes("A"));
        scan.addColumn(Bytes.toBytes("CF1"), Bytes.toBytes("B"));
        scan.addColumn(Bytes.toBytes("CF2"), Bytes.toBytes("C"));
        scan.addColumn(Bytes.toBytes("CF2"), Bytes.toBytes("D"));
        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            System.out.println(result);
        }
        scanner.close();

正則表示式:

        Filter filter2 = new RowFilter(CompareFilter.CompareOp.EQUAL, 
                new RegexStringComparator(".*-.5"));

子串匹配:

        Filter filter3 = new RowFilter(CompareFilter.CompareOp.EQUAL, 
                new SubstringComparator("-5"));

(2)、列族過濾器 FamilyFilter extends CompareFilter

(3)、列名過濾器 QualifierFilter extends CompareFilter

(4)、值過濾器 ValueFilter extends CompareFilter

(5)、參考列過濾器  DependentColumnFilter extends CompareFilter

4、專用過濾器

(1)、單列值過濾器 SingleColumnValueFilter extends FilterBase

(2)、單列排除過濾器 SingleColumnValueExcludeFilter extends FilterBase

(3)、字首過濾器 PrefixFilter extends FilterBase   , 指的是行健

(4)、分頁過濾器  PageFilter extends FilterBase  

        HConnection connection = HConnectionManager.createConnection(conf);
        HTableInterface table = connection.getTable("T1");

        Filter filter = new PageFilter(15);
        int totalRows = 0;
        byte[] lastRow = null;
        while (true) {
            Scan scan = new Scan();
            scan.setFilter(filter);
            if (lastRow != null) {
                byte[] startRow = Bytes.add(lastRow, Bytes.toBytes("1"));
                scan.setStartRow(startRow);
                System.out.println("startRow = " + (startRow == null ? "null" : Bytes.toStringBinary(startRow)));
            }
            ResultScanner scanner = table.getScanner(scan);
            int localRows = 0;
            for (Result result : scanner) {
                lastRow = result.getRow();
                String a = Bytes.toStringBinary(result.getValue(Bytes.toBytes("CF1"), Bytes.toBytes("A")));
                String b = Bytes.toStringBinary(result.getValue(Bytes.toBytes("CF1"), Bytes.toBytes("B")));
                String c = Bytes.toStringBinary(result.getValue(Bytes.toBytes("CF2"), Bytes.toBytes("C")));
                String d = Bytes.toStringBinary(result.getValue(Bytes.toBytes("CF2"), Bytes.toBytes("D")));
                System.out.println(Bytes.toStringBinary(lastRow) + ":" + a + "\t" + b + "\t" + c + "\t" + d);
                totalRows++;
                localRows++;
            }
            scanner.close();
            System.out.println("localRows = " + localRows);
            if (localRows == 0) {
                break;
            }
        }
        System.out.println("totalRows = " + totalRows);

輸出:

...............................................................

startRow = 14158629376111
1415862937612:414640825158
1415862937613:493546309995
1415862937614:45480972112
1415862937615:58421259102
1415862937616:5474179822
1415862937617:542328667462
1415862937618:136584924733
1415862937619:273168955625
1415862937620:6270878826
1415862937621:797623335373
1415862937622:6651407711
1415862937623:839440240934
1415862937624:81690707793
1415862937625:77154547073
1415862937626:272104116875
localRows = 15
startRow = 14158629376261
1415862937627:890720832180
1415862937628:149552435772
1415862937629:30797998922
1415862937630:955886243264
1415862937631:729952261271
1415862937632:218986103193
1415862937633:981331668843
1415862937634:782721794512
localRows = 8
startRow = 14158629376341
localRows = 0
totalRows = 698

(5)、行健過濾器  KeyOnlyFilter extends FilterBase  

(6)、首次行健過濾器  FirstKeyOnlyFilter extends FilterBase  

(7)、包含結束過濾器  InclusiveStopFilter extends FilterBase   

(8)、時間戳過濾器  TimestampFilter extends FilterBase  
(9)、列計數過濾器  ColumnCountFilter extends FilterBase   

(10)、列分頁過濾器  ColumnPagingFilter extends FilterBase  

看起來不是很有用


(11)、列字首過濾器  ColumnPrefixFilter extends FilterBase   

(12)、隨機行過濾器  RandomFilter extends FilterBase   

5、附加過濾器

(1)、跳轉過濾器  SkipFilter extends FilterBase

當過濾器發現某一行中的一列需要過濾時,這一行行資料都將過濾掉。

(2)、全匹配過濾器  WhileMatchFilter extends FilterBase  

逐漸遍歷資料,當其中一條資料被過濾時,將直接放棄本次掃描結果,而在放棄之前的結果操作是有效的。

 
6、過濾器List

多個過濾器連用:

(1)、過濾某一個條件(MUST_PASS_ONE) 或者所有條件(MUST_PASS_ALL) 

(2)、使用ArrayList可以保證Filter順序 

        List<Filter>  filters = new ArrayList<Filter>();
        filters.add(filter1);
        filters.add(filter2);
        filters.add(filter3);
        filters.add(filter4);
        filters.add(filter5); 
        
        FilterList filterList1 = new FilterList(Operator.MUST_PASS_ALL,filters);  
        FilterList filterList2 = new FilterList(Operator.MUST_PASS_ONE,filters);

7、自定義過濾器

實現Filter 或者繼承 FilterBase

ReturnCode 的型別:

INCLUDE、SKIP、NEXT_COL、NEXT_ROW、SEEK_NEXT_USING_HINT

過濾器相容性:

不能使用Batch 的 :           DependentColumnFilter,FilterList視情況而定

不用被SkipFilter包裝的:  PrefixFilterPageFilterInclusiveStopFilter,(SkipFilter、WhileMatchFilter、FilterList)視情況而定

不用被WhileMatchFilter包裝的:(SkipFilter、WhileMatchFilter、FilterList)視情況而定

不能在Get中使用的:  RowFilter,SingleColumnValueFilter,SingleColumnValueExcludeFilter,PrefixFilter,PageFilter,InclusiveStopFilter,RandomFilter,SkipFilter,WhileMatchFilter 不能在Scan中使用的:ColumnCountFilter 為了優化效能可以提前結束掃描的:RowFilter,PrefixFilter,PageFilter,InclusiveStopFilter, WhileMatchFilter,FilterList視情況而定 所有Filter 都可以加入 FilterList

8、計數器

(1)、單計數器

(2)、多計數器

9、協處理器

(1)、基礎

協處理器允許使用者在Region伺服器上執行自己的程式碼。

使用場景:維護輔助索引、維護資料完整性、聚合函式sum、avg()等、SQL。

型別:

observer,回撥函式在一些特定事件發生時候被執行,類似觸發器;

endpoint,新增一些RPC來動態擴充套件RPC協議,類似儲存過程。

(2)、Coprocessor介面

需實現方法 public void start(CoprocessorEnvironment ce), public void stop (CoprocessorEnvironment ce) 方法。

協處理器執行順序:先系統級協處理器,後用戶級協處理器,按照載入順序執行。

(3)、協處理器載入

a、hbase-site.xml 中配置屬性 hbase.coprocessor.region.classes, hbase.coprocessor.master.classes, hbase.coprocessor.wal.classes

b、從表描述符載入:,格式:<path-to-jar>|<className>|<SYSTEM or USER>。程式碼中設定屬性 COPROCESSOR$1

(4)、RegionObserver

a、處理 Region 生命週期事件

pending open 狀態 :               preOpen / postOpen,  preWALRestore / postWALRestore,  

open 狀態 :                               preFlush / postFlush,  preCompact / postCompact,  preSplit / postSplit,  

pending  close 狀態 :             preClose / postClose  

b、處理客戶端 API 事件:   Get,  Put,  Delete,  CheckAndPut,  CheckAndDelete, GetClosestRowBefore, Exists 等等

c、RegionCoprocessorEnvironment :getRegion、getRegionServerServices、getSharedData

d、ObserverContext:獲得上下文

e、BaseRegionObserver:監聽協處理器的基類

(5)、MasterObserver

處理DDL操作,如 preCreateTable / postCreateTable,  preModifyTable / postModifyTable  等

(6)、endpoint

在各個region之間操作

10、HTablePool

用法:

        Configuration conf = HBaseConfiguration.create();  
        int maxSize = 100;
        HTablePool pool = new HTablePool(conf, maxSize);
        //............
        String strTableName = "T1";
        HTableInterface table = pool.getTable(strTableName);
        // CRUD
        table.close();
        //.............
        pool.close();

Hbase 0.98 將HTablePool廢除, 新版用法:
        Configuration conf = HBaseConfiguration.create();
        HConnection connection = HConnectionManager.createConnection(conf);
        //..............
        HTableInterface table = connection.getTable("T1");
        //CRUD
        table.close();
        //.............
        connection.close();

11、連線管理

HConnection 細節:共享ZooKeeper 連線,快取通用資源

好處:快取-ROOT-、和 .META. 表資訊,resion地址定位,減少網路呼叫次數。HTable多個例項共享一個連線。

缺點: 如果使用者不顯示關係連線,其將一直存在,直到客戶端退出。將耗盡連線控制代碼、記憶體,IO異常。故必須呼叫close顯示關閉連線。