diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestScanFilterPerformance.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestScanFilterPerformance.java new file mode 100644 index 0000000..732d9c6 --- /dev/null +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestScanFilterPerformance.java @@ -0,0 +1,79 @@ +package org.apache.hadoop.hbase.regionserver; + +import java.io.IOException; + +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.HTable; +import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.client.Result; +import org.apache.hadoop.hbase.client.ResultScanner; +import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.filter.BinaryComparator; +import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp; +import org.apache.hadoop.hbase.filter.Filter; +import org.apache.hadoop.hbase.filter.ValueFilter; +import org.apache.hadoop.hbase.util.Bytes; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class TestScanFilterPerformance { + private static byte[] TAB = Bytes.toBytes("tallTable"); + private static byte[] FAM = Bytes.toBytes("f"); + + @Test + public void testScanFilterPerformance() throws Exception { + HBaseTestingUtility util = new HBaseTestingUtility(); + util.startMiniCluster(1); + HTable table = util.createTable(TAB, FAM); + seedTable(table); + util.getHBaseAdmin().flush(TableName.valueOf(TAB)); + // warm up + scanTable(table); + + // run the test + int N = 10; + long[] runTimes = new long[N]; + long sum = 0; + for (int i = 0; i < N; i++) { + runTimes[i] = scanTable(table); + sum += runTimes[i]; + } + double mean = 1.0 * sum / N; + double sigma = 0; + for (int i = 0; i < N; i++) { + sigma += (runTimes[i] - mean) * (runTimes[i] - mean); + } + sigma = Math.sqrt(sigma / N); + fail("" + N + " runs " + " mean:" + mean + " sigma:" + sigma); + } + + private void seedTable(HTable table) throws IOException { + table.setAutoFlushTo(false); + for (int i = 0; i < 5000000; i++) { + byte[] row = Bytes.toBytes((long) i); + Put p = new Put(row); + p.addColumn(FAM, FAM, row); + table.put(p); + } + table.flushCommits(); + } + + private long scanTable(HTable table) throws IOException { + int j = 0; + Scan s = new Scan(); + Filter f = new ValueFilter(CompareOp.EQUAL, new BinaryComparator(new byte[] { (byte) 255 })); + s.setFilter(f); + long start = System.currentTimeMillis(); + ResultScanner results = table.getScanner(s); + for (Result result : results) { + for (Cell cell : result.listCells()) { + j++; + } + } + System.out.println(j); // make sure the loop is not optimized away + return System.currentTimeMillis() - start; + } +}