记一次Hbase的行键过滤器事故问题
数据总数:746条数据
因为后面需要进行算法合成,而且spark目前对这种算法支持并不好,因此采用代码编写,所以在查询hbase的过程中采用的是java直接查询,
但是为了加快查询速度,我尽可能的使用了过滤器
1:初期Hbase的rowkey组合:时间+"_"+订单id
查询思路:
1:能快速检索,减少GC,采用过滤器
2:支持时间段查询
根据上面两点,我采用时间过滤,比如:startTime=201904010000 endTime=201904180000|;【注意这个符号:“|” 】然后根据行键过滤器
CompareFilter.CompareOp.GREATER_OR_EQUAL和
CompareFilter.CompareOp.LESS_OR_EQUAL进行大小对比
使用代码在查询的时候,添加了行键过滤器
FilterList filterList=new FilterList();
//time+id
if(startTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,
new BinaryComparator(Bytes.toBytes(startTime)));
filterList.addFilter(rf);
}
if(endTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
new BinaryComparator(Bytes.toBytes(endTime)));
filterList.addFilter(rf);
}
scan.setFilter(filterList);
完整代码:
/**
* 行键过滤器
* */
public static List<Map<String , String>> rowFilter(String tableName , String startTime , String endTime){
Connection connection = null;
Scan scan = new Scan();
scan.setCacheBlocks(false);
ResultScanner rs = null;
Table table = null;
List<Map<String , String>> list = new ArrayList<Map<String , String>>();
try{
connection = ConnectionFactory.createConnection(config);
table = connection.getTable(TableName.valueOf(tableName));
FilterList filterList=new FilterList();
//time+id
if(startTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,
new BinaryComparator(Bytes.toBytes(startTime)));
filterList.addFilter(rf);
}
if(endTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
new BinaryComparator(Bytes.toBytes(endTime)));
filterList.addFilter(rf);
}
scan.setFilter(filterList);
rs = table.getScanner(scan);
for (Result r : rs) {
Map<String , String> map = new HashMap<String , String>();
for (Cell cell : r.listCells()) {
map.put(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength())
, Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
}
list.add(map);
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (null != rs) {
rs.close();
}
try {
if (null != table) {
table.close();
}
if (null != connection && !connection.isClosed()) {
System.out.println("scan Result is closed");
connection.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return list; }
初期完整代码
那么这种方案查询后返回的结果是:361条数据! 实际Hbase测试表中有746条数据,那么可以肯定,是行键过滤器出错了(后面再研究为啥出错)
改善:
更改rowkey结构,采用:订单id+"_"+time来实现
然后过滤器代码改善:
FilterList filterList=new FilterList();
//id+time
if(startTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,
new RegexStringComparator(".*_"+startTime));
filterList.addFilter(rf);
}
if(endTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
new RegexStringComparator(".*_"+endTime));
filterList.addFilter(rf);
}
scan.setFilter(filterList);
上面其实就是采用正则表达式进行后缀识别,这样我就可以根据后缀进行时间过滤
完整代码:
/**
* 行键过滤器
* */
public static List<Map<String , String>> rowEndFilter(String tableName , String startTime , String endTime){
Connection connection = null;
Scan scan = new Scan();
scan.setCacheBlocks(false);
ResultScanner rs = null;
Table table = null;
List<Map<String , String>> list = new ArrayList<Map<String , String>>();
try{
connection = ConnectionFactory.createConnection(config);
table = connection.getTable(TableName.valueOf(tableName));
FilterList filterList=new FilterList();
//id+time
if(startTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,
new RegexStringComparator(".*_"+startTime));
filterList.addFilter(rf);
}
if(endTime != null){
RowFilter rf = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
new RegexStringComparator(".*_"+endTime));
filterList.addFilter(rf);
}
scan.setFilter(filterList);
rs = table.getScanner(scan);
for (Result r : rs) {
Map<String , String> map = new HashMap<String , String>();
for (Cell cell : r.listCells()) {
map.put(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength())
, Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
}
list.add(map);
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (null != rs) {
rs.close();
}
try {
if (null != table) {
table.close();
}
if (null != connection && !connection.isClosed()) {
System.out.println("scan Result is closed");
connection.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return list; }
上面就会查询出完整数据。
记一次Hbase的行键过滤器事故问题的更多相关文章
- HBase按照行键范围删除数据
#!/bin/bash #TOOL_PATH=$(cd "$(dirname "$0")"; pwd) #TOOL_PATH_TMP=$(cd "$( ...
- Hadoop-No.7之行键
和哈希表类比,HBase中的行键类似于哈希表中的键.要构造一个良好的HBase模式,关键之一就是选择一个合适的行键. 1 记录检索 行键是HBase中检索记录所使用的键.HBase记录含有的列在数量上 ...
- HBase应用开发回顾与总结系列之二:RowKey行键设计规范
2. RowKey行键设计规范 2.1. RowKey四大特性 2.1.1 字符串类型 虽然行键在HBase中是以byte[]字节数组的形式存储的,但是建议在系统开发过程中将其数据类型设置为Strin ...
- Hadoop HBase概念学习系列之优秀行键设计(十六)
我们通过行键访问HBase.尽管使用扫描过滤器可以一次性指明大量的键,但是HBase仅仅能够根据行键识别出一行. 优秀的行键设计可以保证良好的HBase性能. 1.行键存在于HBase中的每一个单元格 ...
- HBase应用开发回顾与总结系列之三:RowKey行键生成器工具
所谓RowKey行键生成器,是指通过软件工具制定行键生成策略,并可将策略信息保存成本地策略文件,待需要时再将本地策略文件序列化成行键生成策略对象,传入数据行信息后可自动生成RowKey行键. 那么 ...
- Hadoop HBase概念学习系列之行、行键(十一)
行是由列簇中的列组成.行根据行键依照字典顺序排序. HBase的行使用行键标识,可以使用行键查询整行的数据. 对同一个行键的访问都会落在同样的物理节点上.如果表包含2个列簇,属于两个列簇的文件还是保存 ...
- HBase行键的设计
rowkey是行的主键,而且hbase只能用rowkey范围即scan来查找数据.rowkey是以字典排序的.可以巧妙设计行键,比如想通过电影的评价进行排序,可以把评分rate和电影id组合起来,ra ...
- 架构师必备:HBase行键设计与应用
首先要回答一个问题,为何要使用HBase? 随着业务不断发展.数据量不断增大,MySQL数据库存在这些问题: MySQL支持的数据量为TB级,不能一直保留历史数据.而HBase支持的数据量为PB级,适 ...
- Hbase rowkey设计+布隆过滤器+STORE FILE & HFILE结构
Rowkey设计 Rowkey设计原则 Rowkey设计应遵循以下原则: 1.Rowkey的唯一原则 必须在设计上保证其唯一性.由于在HBase中数据存储是Key-Value形式,若HBase中同一表 ...
随机推荐
- hbuilder、hbuilderx和vscode对比
1. 从内存来对比 1.1 vscode占用内存 打开同一个项目,发现vscode占用内存比较多 1.2 HBuilder占用内存 1.3 HBuilderx占用内存 1.4 对比 从内存上来看,HB ...
- Linux系统下rm删除文件后空间没有释放问题解决办法
一.问题描述 今日收到zabbix监控报警,发现生产环境一台服务器的磁盘空间不足,需要进行处理,登录后发现可利用率不足20%,进行相关查看和处理工作:但是操作删除了一些备份文件和日志信息后,查看空间仍 ...
- Linux Centos7.x下安装部署VNC的实操详述
VNC (Virtual Network Console)是虚拟网络控制台的缩写.它 是一款优秀的远程控制工具软件,由著名的AT&T的欧洲研究实验室开发的.VNC 是在基于 UNIX和 Lin ...
- .NET面试题系列(十八)常用关键字
序言 const和readonly关键字 private protected public internal的区别 out ref out适合用在需要retrun多个返回值的地方,而ref则用在需要 ...
- 线段树——习题、lazy解析
习题: C. Cloud Computing lazy操作解析:
- mysql并发控制之MVCC
1.MVCC(Multiversion concurrency control) :多版本并发控制,当我们并发访问数据库(读或写)时,对事物内正在处理的数据做多版本控制,用以防止写操作的阻塞影响读操作 ...
- 第三周四则运算辅助(CAI)结对项目需求文档
小学四则运算辅助(CAI) UI需求: 目的:让更对的小学生能学到更多的知识,提高做题的效率. 背景:该系统应用于小学生数学算术题的出题,判断对错以及错题本,该系统为解决家长每天为孩子出题的不便而解决 ...
- RabbitMQ资料
安装以及网页插件: https://www.cnblogs.com/longlongogo/p/6489574.html Exchange详解: https://www.cnblogs.com/jul ...
- KindEditor 取不到值 与清空不掉值
var editor; KindEditor.ready(function(K) { editor = K.create('textarea[name="content"]', { ...
- Excel 将A表的基础数据拼接到B表中来-三种方法: ctrl+回车, VLOOKUP()函数,宏
A表 基础信息表 B表 业务信息表 将a表中的基础数据 拼接到B表的后面, 应用场景是: B表很多数据,很繁乱,名字不一定全, A表也是比较多的行,B表乱:比如有8行有李晨的,却只有3行是范仲淹的, ...