hbase数据加盐(Salting)存储与协处理器查询数据的方法
转自: https://blog.csdn.net/finad01/article/details/45952781
------------------------------------------------------------------------------------------
hbase数据加盐(Salting)存储与协处理器查询数据的方法
用HBase存储数据时,如果不加任何处理,用户数据往往会集中在几个region中,从而导致数据处理的性能问题,写性能会不断下降,同时用MR处理时,往往会导致个别map处理非常耗时,下面主要介绍一种能够兼顾读写性能的hbase数据存储方法。
在HBase中,表的数据按Region存储,每个Region有StartKey,EndKey,默认情况下新建一个表只有一个region,然后随着不断写入数据,数据越来越多,region的size越来越大时,大到一定的阀值时Region会进行split成两个region,依次不断增加。这种默认方式,缺点主要是写的性能不断下降,数据主要集中在几个region中,同时region会经常split,当regionsplit的时候会导致regionserver的停顿,造成性能问题。
我们在实际使用中,用HBase存储的数据主要有用作两方面,一个是作为数据中心(历史数据备份库),提供查询接口供数据用户查询,另一个是用MR进行处理,统计一些有价值的数据。这样在MR进行处理的时候就会非常慢(我们的实际情况是几个小时,数据量在1亿),map慢的不能忍受。
后面我们采取了预分区的方法,比如建表的时候默认指定100个region,但还是没有解决数据集中的问题,因为我们的大部分数据是按时间作为rowkey的开头,比如20150524002300_1232,大部分数据还是集中在几个region中,其他region基本为空。
而我们想要的效果应该是让每个节点提供的请求处理都是均等的,同时数据能够相对均匀的分布到各个region中。为此我们最后采取的方法是数据加盐(salting)存储与hbase协处理器查询数据。
先介绍一下Hbase加盐存储,思路比较简单,每个region预分区都会指定一个startkey与endkey,然后插入数据的时候对rowkey进行hash取余,产生的code为盐值,添加到rowkey前面作为rowkey的组成部分。比如,我们预分区指定1000个region,每个region的startkey与endkey为000~999依次增加,region1:000-001,region2:001-002,....region1000:999-。然后插入数据rowkey="20150524002300_1232",
intsplitsCount= 1000;
StringrowKey= "20150524002300_1232";
int saltingCode = rowKey.hashCode()%splitsCount;
StringsaltingKey= ""+ saltingCode;
if(saltingCode < 10)
{
saltingKey = "00" + saltingKey;
}
else if(saltingCode < 100)
{
saltingKey = "0" + saltingKey;
}
rowKey = saltingKey + rowKey;
当然盐值的差生方法有很多,只要达到我们想要的效果即可。
这样就会使插入的数据相对均匀的分布到1000个region中去,然后MR程序进行处理时,每个region默认一个map处理,相对处理速度会有很大的提升,我们之前跑几个小时的map任务采用该方法后,只需要20分钟左右,效果还是非常明显的。
上面讲了存储,现在在讲一下怎么查询数据,由于插入的数据被我们默认都添加了盐值,导致本来在hbase连续存储的数据被分散到了多个region中,所以无论是根据rowkey查询单条记录,还是由startkey与endkey进行查询,都不能再简单的调用hbase接口进行查询,解决的方法是采用hbase协处理器进行查询,hbase协处理器包括两种,一种是观察者(Observer),另外一种是终端(Endpoint),我们这里需要使用的是后一种endpoint,基本思路是endpoint类似于关系型数据库中的存储过程,作用于每个region,每个region分别加盐查询,讲解过返回到客户端,客户端进行合并,就是最后的查询结果,比如我们查询"201501010000"与"20150524000000"之间的数据,region1查询"000201501010000"与"00020150524000000",region2查询"001201501010000"与"00120150524000000"... 最后1000个region均返回结果,进行合并就是我们要查询的结果。相应的具体实现后面文章给出。
hbase数据加盐(Salting)存储与协处理器查询数据的方法的更多相关文章
- Python 数据分析(一) 本实验将学习 pandas 基础,数据加载、存储与文件格式,数据规整化,绘图和可视化的知识
第1节 pandas 回顾 第2节 读写文本格式的数据 第3节 使用 HTML 和 Web API 第4节 使用数据库 第5节 合并数据集 第6节 重塑和轴向旋转 第7节 数据转换 第8节 字符串操作 ...
- HBase中加盐(Salting)之后的表如何读取:协处理器文章
我们介绍了避免数据斑点的三种比较常见方法: 加盐-盐腌 哈希-散列 反转-反转 其中在加盐(Salting)的方法里面是这么描述的:给Rowkey分配一个随机指针以使其和之前排序不同.但是在Rowke ...
- HBase 中加盐之后的表如何读取:Spark 篇
在 <HBase 中加盐之后的表如何读取:协处理器篇> 文章中介绍了使用协处理器来查询加盐之后的表,本文将介绍第二种方法来实现相同的功能. 我们知道,HBase 为我们提供了 hbase- ...
- Python之pandas数据加载、存储
Python之pandas数据加载.存储 0. 输入与输出大致可分为三类: 0.1 读取文本文件和其他更好效的磁盘存储格式 2.2 使用数据库中的数据 0.3 利用Web API操作网络资源 1. 读 ...
- HBase 中加盐(Salting)之后的表如何读取:Spark 篇
我们知道,HBase 为我们提供了 hbase-mapreduce 工程包含了读取 HBase 表的 InputFormat.OutputFormat 等类.这个工程的描述如下:This module ...
- python数据分析之:数据加载,存储与文件格式
前面介绍了numpy和pandas的数据计算功能.但是这些数据都是我们自己手动输入构造的.如果不能将数据自动导入到python中,那么这些计算也没有什么意义.这一章将介绍数据如何加载以及存储. 首先来 ...
- 利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)
6.2 二进制数据格式 实现数据的高效二进制格式存储最简单的办法之一,是使用Python内置的pickle序列化. pandas对象都有一个用于将数据以pickle格式保存到磁盘上的to_pickle ...
- 利用python进行数据加载和存储
1.文本文件 (1)pd.read_csv加载分隔符为逗号的数据:pd.read_table从文件.URL.文件型对象中加载带分隔符的数据.默认为制表符.(加载为DataFrame结构) 参数name ...
- 页面数据加载完成时,显示loading页面.数据加载完,loading隐藏.
一,引入三个文件 jQuery版本使用 jQuery v1.7.1 jquery-easyui文件中,引入easyui-lang-zh_CN.js的js 做数据加载时使用jquery.blockui. ...
随机推荐
- 阿里云ECS服务器部署HADOOP集群(四):Hive本地模式的安装
本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建. 本地模式需要采用MySQL数据库存储数据. 1 环境介绍 一台阿里云ECS服务器:master ...
- MySQL数据库:多表连接查询
多表连接查询 注意:使用连接技术建议将表经行重命名! # explain 检索连接是否达标 # 内连接 # 语法1 from 表1 inner join 表2 on 主键字段=外键字段 [where ...
- 如何获取Html的height和width属性(网页宽、高)
1.页面如图所示 2.Html代码 <div style="color:green;" id="html_info"></div> 3. ...
- pytest系列(四)- pytest+allure+jenkins - 持续集成平台生成allure报告
pytest是什么 pytest是python的一款测试框架,拥有unittest的功能并比它更丰富. allure是什么 有非常多的优秀的测试框架,但却是有非常少优秀的报告工具可以展示非常清楚的用例 ...
- 关于 Comparable 的使用
作为一名刚上路的超初级程序员,今天终于可以迈开自己的第一步,写一篇博客.把我自己都感动哭了. 今天看面试题时看到了一个Comparable 的使用,才发现自己好像并没有使用过这个接口,具体这个接口是怎 ...
- IT兄弟连 HTML5教程 HTML5表单 H5表单提交综合实例
这里我们创建一个填写个人基本信息的表单,使用了表单元素有<input>输入框.<datalist>选项列表.<textarea>文本框,通用的表单输入类型有text ...
- Springboot关于tomcat容器配置、三大组件配置、拦截器配置
原文地址:http://www.javayihao.top/detail/172 1.tomcat配置 Springboot默认使用的就是嵌入式servlet容器即tomcat,对于web项目,如果使 ...
- IO流与装饰者模式
java使用IO流来处理不同设备之间数据的交互;所有的IO操作实际上都是对 Stream 的操作 从功能上划分: 输入流: 当数据从源进入的编写的程序时,称它为输入流; 输出流: 从程序输出回另一个源 ...
- IdentityServer4 常见问题 - 用户拒绝授权后报错
1.问题说明 在 IdentityServer4 Web 授权中,一般会有一个显示客户端需要获取用户的那些信息的页面,询问用户是否同意: 在这个页面如果我们点击"No, Do Not All ...
- Java操作数据库——使用连接池连接数据库
Java操作数据库——使用连接池连接数据库 摘要:本文主要学习了如何使用JDBC连接池连接数据库. 传统方式和连接池方式 传统方式的步骤 使用传统方式在Java中使用JDBC连接数据库,完成一次数据库 ...