发现问题
最近项目中接入了hbase,在做性能测试的时候,发现查询数据有问题,数据一直没有,然后去看日志,发现是查询hbase的时候超时了,导致数据查询失败。其中hbase的数据量大概在780万左右,批量查询500条,耗时大约在20s左右。
分析原因
代码是这样写的
//创建一个过滤器容器,并设置其关系(AND/OR)
FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL);
//正则比较器(GREATER_OR_EQUAL和EQUAL对正则比较器一样)
RegexStringComparator sc = new RegexStringComparator(regex);
//过滤器1 行过滤器,正则匹配行数
RowFilter rf = new RowFilter(CompareFilter.CompareOp.EQUAL, sc);
//过滤器2 分页过滤器,过滤获取的条数
Filter pageFilter = new PageFilter(pageSize);
//过滤器3 行过滤器,定位查询开始的节点,(注意此处比较器是GREATER,不包括起始节点rowkey)
Filter rowFilter = new RowFilter(CompareFilter.CompareOp.GREATER,
new BinaryComparator(Bytes.toBytes(startRowKey)));
Scan scan = new Scan();
scan.setStartRow(startRowKey.getBytes());
scan.setStopRow(endRowKey.getBytes());
fl.addFilter(pageFilter);
fl.addFilter(rf);
fl.addFilter(rowFilter);
这里用到了正则去查询,正则的表达式是:.*_%s
解决问题
怀疑是不是这个正则查询的效率太低了,进行了一定的优化,变为:20.*_%s
因为我们的rowkey都是20开头的,所有正则直接指定,查询速度直接降到200ms。
正则表达式的效率也是有很大差别的,如果能精确的一定要精确查询,这个查询速度不是一个档次的。
也可以关注我的公众号:程序之声
关注公众号,领取更多资源。
本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载