Hbase读取性能exception变化

我安装了HBase 0.94.0。 我必须通过扫描提高我的阅读性能。 我已经随机插入了100000条记录。

当我设置setCache(100); 对于100000条记录,我的表现是16秒。

当我将它设置为setCache(50)对于100000条记录,我的表现为90秒。

当我将它设置为setCache(10); 对于100000条记录,我的表现是16秒

 public class Test { public static void main(String[] args) { long start, middle, end; HTableDescriptor descriptor = new HTableDescriptor("Student7"); descriptor.addFamily(new HColumnDescriptor("No")); descriptor.addFamily(new HColumnDescriptor("Subject")); try { HBaseConfiguration config = new HBaseConfiguration(); HBaseAdmin admin = new HBaseAdmin(config); admin.createTable(descriptor); HTable table = new HTable(config, "Student7"); System.out.println("Table created !"); start = System.currentTimeMillis(); for(int i =1;i<100000;i++) { String s=Integer.toString(i); Put p = new Put(Bytes.toBytes(s)); p.add(Bytes.toBytes("No"), Bytes.toBytes("IDCARD"),Bytes.toBytes("i+10")); p.add(Bytes.toBytes("No"), Bytes.toBytes("PHONE"),Bytes.toBytes("i+20")); p.add(Bytes.toBytes("No"), Bytes.toBytes("PAN"),Bytes.toBytes("i+30")); p.add(Bytes.toBytes("No"), Bytes.toBytes("ACCT"),Bytes.toBytes("i+40")); p.add(Bytes.toBytes("Subject"), Bytes.toBytes("English"),Bytes.toBytes("50")); p.add(Bytes.toBytes("Subject"), Bytes.toBytes("Science"),Bytes.toBytes("60")); p.add(Bytes.toBytes("Subject"), Bytes.toBytes("History"),Bytes.toBytes("70")); table.put(p); } middle = System.currentTimeMillis(); Scan s = new Scan(); s.setCaching(100); ResultScanner scanner = table.getScanner(s); try { for (Result rr = scanner.next(); rr != null; rr=scanner.next()) { System.out.println("Found row: " + rr); } end = System.currentTimeMillis(); } finally { scanner.close(); } System.out.println("TableCreation-Time: " + (middle - start)); System.out.println("Scan-Time: " + (middle - end)); } catch (IOException e) { System.out.println("IOError: cannot create Table."); e.printStackTrace(); } } } 

为什么会这样?

为什么要返回100000记录表中的每条记录? 您正在进行全表扫描,就像在任何大型数据库中一样,这很慢。

尝试考虑一个更有用的用例,在该用例中,您希望返回记录的一些列或一系列记录。

HBase在它的表上只有一个索引,即行键。 利用它。 尝试定义行键,以便只需指定行键即可获得所需的数据。

假设您想知道Subject:History ,其中行键位于80000和80100之间。(请注意, setCaching(100)表示HBase将为每个RPC获取100条记录,因此就是一条。获取100行显然需要更多的内存来反对提取,比如说,一行。在大型多用户环境中记住这一点。)

 Long start, end; start = System.currentTimeMillis(); Scan s = new Scan(String.valueOf(80000).getBytes(), String.valueOf(80100).getBytes()); s.setCaching(100); s.addColumn("Subject".getBytes(), "History".getBytes()); ResultScanner scanner = table.getScanner(s); try { for (Result rr = scanner.next(); rr != null; rr=scanner.next()) { System.out.println("Found row: " + new String(rr.getRow(), "UTF-8") + " value: " + new String(rr.getValue("Subject".getBytes(), "History".getBytes()), "UTF-8"))); } end = System.currentTimeMillis(); } finally { scanner.close(); } System.out.println("Scan: " + (end - start)); 

这可能看起来很愚蠢,因为你怎么知道你需要哪一行整数? 嗯,确切地说,但这就是为什么你需要根据你要查询的内容来设计行键,而不是像在传统数据库中那样只使用增量值。

试试这个例子。 它应该很快。

注意:我没有运行该示例。 我只是在这里打字。 也许你应该纠正一些小的语法错误,但我希望这个想法很清楚。