Hbase中Scan資料時的快取優化以scan 過濾器的使用
阿新 • • 發佈:2019-01-02
1.快取優化
在hbase的java api 中,預設在scan 過程中scan.next一次進行一次rpc請求,這導致scan的效率很低,設定scan的快取優化很有必要
1.scan.setBatch(int 10),設定一次next 返回的列數的快取,針對表中的資料有多列的時候應設定此項.
2.scan.setCaching(10); 十次next,一次rpc請求,通過此項的設定可以減少rpc的請求
2.scan過濾器
過濾器相當於資料庫中的where子句,比較的方式有
1)二進位制比較 大於、小於。。。。
new BinaryComparator(Bytes.toBytes("xxx"));
2)正則比較 等於或不等於
new RegexStringComparator();
3)子串比較 等於或不等於
過濾器是將過濾器程式碼序列化,通過rpc交給服務端處理,服務端處理完成後返回給客戶端
1.RowFilter:行過濾,過濾指定的行
RowFilter filter2 = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,new BinaryComparator(Bytes.toBytes("row097")));
2.FamilayFilter:列族過濾,返回指定的列族
3.QualifierFilter:返回指定的列
4.ValueFilter:過濾值
當多個過濾器共同作用時,使用FilterList(parm1 :條件的and 或者or)
/** !AND */ MUST_PASS_ALL, /** !OR */ MUST_PASS_ONE
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.filter.*; import org.apache.hadoop.hbase.util.Bytes; import org.junit.Test; import java.io.IOException; import java.util.List; public class TestFilter { @Test public void TestFilter1() throws IOException { Configuration cong = HBaseConfiguration.create(); Connection connection = ConnectionFactory.createConnection(cong); TableName tableName = TableName.valueOf("test2:t1"); Table table = connection.getTable(tableName); Scan scan = new Scan(); scan.setBatch(3);//設定批次返回的列數,對於多列的資料是一個很好的優化 scan.setCaching(10);//設定返回的行數 //new FamilyFilter(, ) FamilyFilter filter = new FamilyFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator("f1")); RowFilter filter2 = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,new BinaryComparator(Bytes.toBytes("row097"))); QualifierFilter name = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("name")); FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, filter,filter2); FilterList flist= new FilterList(FilterList.Operator.MUST_PASS_ALL); flist.addFilter(name);//多個過濾器是定義的Filterlist可以定義多個,也可同時新增過濾器列表 flist.addFilter(fl); // filterList.addFilter(filter); // filterList.addFilter(filter2); scan.setFilter(flist); ResultScanner scanner = table.getScanner(scan); Result next =null; while (( next=scanner.next())!=null){ List<Cell> list = next.listCells(); for (Cell cell : list) { String row = Bytes.toString(cell.getRow()); String fam =Bytes.toString( CellUtil.cloneFamily(cell)); String qq =Bytes.toString( CellUtil.cloneQualifier(cell)); String val = Bytes.toString(CellUtil.cloneValue(cell)); System.out.println(row+"\t"+fam+"\t"+qq+"\t"+val); } } } }