一个自定义 HBase Filter -“通过RowKeys来高性能获取数据”
摘要: 大家在使用HBase和Solr搭建系统中经常遇到的一个问题就是:“我通过SOLR得到了RowKeys后,该怎样去HBase上取数据”。使用现有的Filter性能差劲,网上也没有现成的自定义Filter解决方案,我在这里把这个问题的解决办法分享给大家,抛砖引玉一下。先讲一下,虽然使用自定义过滤器来达到取数据的目的,但它其实并不是一个好的解决办法,因为它的性能是有问题的,具体分析还要看我的博客HBase 高性能获取数据 - 多线程批量式解决办法:http://www.cnblogs.com/wgp13x/p/4245182.html
Solr和HBase专辑
1、“关于Solr的使用总结的心得体会”(http://www.cnblogs.com/wgp13x/p/3742653.html)
2、“中文分词器性能比较”(http://www.cnblogs.com/wgp13x/p/3748764.html)
3、“Solr与HBase架构设计”(http://www.cnblogs.com/wgp13x/p/a8bb8ccd469c96917652201007ad3c50.html)
4、 “大数据架构: 使用HBase和Solr将存储与索引放在不同的机器上”(http://www.cnblogs.com/wgp13x/p/3927979.html)
5、“一个自定义 HBase Filter -通过RowKeys来高性能获取数据”(http://www.cnblogs.com/wgp13x/p/4196466.html)
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.filter.FilterBase;
import org.apache.hadoop.hbase.util.Bytes;
/**
* @description 自定义过滤器,用来读取大量离散行
* @author 王安琪
* @time 2014年11月8日上午10:47:17
* @className RowKeyFilter
*/
public class RowKeyFilter extends FilterBase
{
private byte[] value = null;
private boolean filterRow = true;
/**
* map中存放需要读的行RowKey
*/
public Map<Object, Object> map = new HashMap<Object, Object>();
public RowKeyFilter()
{
super();
}
public RowKeyFilter(byte[] value)
{
this.value = value;
}
@Override
public ReturnCode filterKeyValue(KeyValue ignored)
{
if (this.filterRow == false)
return ReturnCode.INCLUDE;
else
return ReturnCode.NEXT_ROW;
}
/**
* 行过滤,查询该行RowKey是否在Map中
*/
@Override
public boolean filterRowKey(byte[] buffer, int offset, int length)
{
byte[] rowKey = Arrays.copyOfRange(buffer, offset, offset + length);
String str = new String(rowKey);
if (map.containsKey(str))
{ // 在0(1)时间内返回,效率较高
this.filterRow = false; // false表示包括这一行
}
return this.filterRow;
}
@Override
public void reset()
{
this.filterRow = true;
}
@Override
public boolean filterRow()
{
return filterRow;
}
/**
* 将Map中的数据以Byte[]形式传给服务器
*/
@Override
public void write(DataOutput dataOutput) throws IOException
{
Bytes.writeByteArray(dataOutput, this.value);
}
/**
* 服务器读取Byte[]数据,再将数据存储到Map中 不同的RowKey以","分割
*/
@Override
public void readFields(DataInput dataInput) throws IOException
{
this.value = Bytes.readByteArray(dataInput);
String string = new String(this.value);
String[] strs = string.split(",");
for (String str : strs)
{
map.put(str, str);
}
}
} |
/**
* 根据rowKeys获取数据
*
* @param rowKeys:每个rowkey之间使用逗号分隔符
* @param filterColumn:表示过滤的列,如果为空表示所有列的数据都返回
* @param isContiansRowkeys:设置为true,表示返回结果集中包含rowkeys;否则返回结果集中不包含rowkeys
* @return
*/
/* @Override */
public Datas getDatasFromHbase(String rowKeys, List<String> filterColumn,
boolean isContiansRowkeys)
{
Datas datas = new Datas();
HTableInterface hTableInterface = getTable(tableName);
Scan scan = new Scan();
if (filterColumn != null)
{
for (String column : filterColumn)
{
scan.addColumn(columnFamilyName.getBytes(), column.getBytes());
}
}
if (rowKeys != null && rowKeys.length() > 0)
{
RowKeyFilter rowKeyFilter = new RowKeyFilter(rowKeys.getBytes());
scan.setFilter(rowKeyFilter);
}
ResultScanner resultScanner = null;
List<Data> listData = new ArrayList<Data>();
try
{
resultScanner = hTableInterface.getScanner(scan);
for (Result result : resultScanner)
{
Data data = new Data();
if (isContiansRowkeys)
{
data.setRowkey(new String(result.getRow()));
}
Map<String, String> map = new HashMap<String, String>();
List<String> content = new ArrayList<String>();
String[] temp = null;
if (filterColumn != null)
{
temp = new String[filterColumn.size()];
}
for (KeyValue keyValue : result.raw())
{
if (filterColumn == null)
{
content.add(new String(keyValue.getValue()));
}
else if (filterColumn != null)
{
String qualifier = new String(keyValue.getQualifier());
String value = new String(keyValue.getValue());
if (filterColumn.contains(qualifier))
{
int index = filterColumn.indexOf(qualifier);
temp[index] = value;
}
}
}
if (temp != null)
{
for (int i = 0; i < temp.length; i++)
{
content.add(temp[i]);
}
}
data.setContent(content);
listData.add(data);
}
datas.setDatas(listData);
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
resultScanner.close();
try
{
hTableInterface.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
return datas;
} |
转载于:https://www.cnblogs.com/wgp13x/p/4196466.html
一个自定义 HBase Filter -“通过RowKeys来高性能获取数据”相关推荐
- HBase 高性能获取数据(多线程批量式解决办法) + MySQL和HBase性能测试比较
转载于:http://www.cnblogs.com/wgp13x/p/4245182.html 摘要: 在前篇博客里已经讲述了通过一个自定义 HBase Filter来获取数据的办法,在末尾指出 ...
- Echarts插件中的data绑定一个变量,后面通过访问后端接口获取数据给这个变量,Echarts插件无法渲染数据
我们都知道echarts图标数据是写在option = {}对象里,但是数据不可能是固定值,而是通过后端接口返回来的,本以为只需要在 data里设置一个变量去接收返回的数据,然后再将变量赋值给echa ...
- HBase - Filter - 过滤器的介绍以及使用
博文作者:那伊抹微笑 csdn 博客地址:http://blog.csdn.net/u012185296 1 过滤器 HBase 的基本 API,包括增.删.改.查等. 增.删都是相对简单的操作,与传 ...
- Spring Boot自定义 Servlet Filter 的两种方式
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 码农小胖哥 来源 | 公众号「码农小胖哥」 针 ...
- HBase Filter及对应Shell--转
http://www.cnblogs.com/skyl/p/4807793.html 比较运算符 CompareFilter.CompareOp 比较运算符用于定义比较关系,可以有以下几类值供选择: ...
- SAP UI5 应用开发教程之三十二 - 如何创建一个自定义 SAP UI5 控件试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
- Spring Cloud Gateway (六) 自定义 Global Filter
Spring Cloud Gateway (六) 自定义 Global Filter 简介 在前面五篇的分析中,对 Spring Cloud Gateway 的 filter 组件有了一个大概 ...
- asp.net MVC之 自定义过滤器(Filter)
一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...
- Android O 自定义通知实例及一个自定义自动适配缩放图片至特定大小的田字格ImageView
这一篇博文的思路很简单,没有什么深入的理论,源由是最近在实习公司里开发用到了Android O的通知,发现与以往有所不同,相关的资料是有,但是大部分都不适用于这个版本,这里只是写一个非常简单的Demo ...
最新文章
- HC3i论坛电子病历系统热门资源30个
- boost::statechart模块测量 BitMachine 的事件处理性能的测试程序
- 扩展语法检查(SLIN检查)
- maven-assembly-plugin插件打包 jar、tar.gz
- [k8s]metricbeat的kubernetes模块kube-metric模块
- python 词云 fontpath_Python酷炫词云图原来可以这么玩?
- Anchor和Dock的区别
- 六部工坊ros启智机器人定点导航技术_【展品抢鲜看】程天科技外骨骼机器人亮相峰会,让每个人享受机器人的服务!...
- 谷歌云盘超大文件快速下载方法
- C语言写程序注意,单片机C语言编程应注意的若干问题
- 物料移动类型和后勤自动科目设置-转
- 猿辅导 x DorisDB:构建统一OLAP平台,全面升级数据分析能力
- 信息学奥赛一本通:1084:幂的末尾
- linux scp连不上主机,如何使用WinSCP连接Linux主机
- matlab中cell是什么意思,matlab中cell的用法
- 神奇的伊娃(eval),魔鬼的伊娃(eval)
- 新学年,推荐一份GIS书单给爱学习的你
- VC++6.0安装成功后如何启动应用或者如何创建快捷方式
- window系统下多个版本谷歌浏览器并存
- echarts,柱状图配置,legend
热门文章
- HashSet、TreeSet、TreeMap实现原理
- 开机启动脚本/etc/init.d/rcS
- 如何构建一个分布式爬虫:理论篇
- PaddlePaddle文本卷积实现情感分类和微博女友情绪监控AI
- android6.0源码分析之Camera API2.0下的Capture流程分析
- 基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现
- 两个list关联合并_算法分享---两个有序链表的合并(C语言)
- jmeter录制 过滤_Jmeter脚本录制
- Qt模型、视图解读之视图
- Bayesian Networks