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. ...
随机推荐
- JavaScript 7 获取可视窗口、网页元素、获取节点方式
获取可视窗口对象 chrom *document.body firefox *document.documentElement 获取滚动条偏移量 ele.scrollTop ele.scrollLef ...
- java之对象类型转换
基本数据类型之间的转换: 自动类型转换:小的数据类型可以自动转换成大的数据类型: 强制类型转换:可以把大的数据类型转换成小的数据类型:float = (float)32.0; public class ...
- C语言程序设计100例之(18):火柴棒等式
例18 火柴棒等式 用n根火柴棍,可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棒拼出的整数(若该数非零,则最高位不能是0).用火柴棒拼数字0~9的拼法如图1所示. 图1 用 ...
- Linux 部署 java1.8
1.安装 查看java安装包 yum list | grep java 使用yum安装 yum install java-1.8.0-openjdk.x86_64 修改环境变量 vi /etc/pro ...
- IT兄弟连 HTML5教程 CSS3揭秘 CSS3属性2
3 背景属性 在CSS3中提供了多个背景属性,这里只介绍两个比较常用的属性,其他属性可以从手册中获取帮助.在CSS3中,通过background-image或者background属性可以为一个容器 ...
- SpringBoot配置文件yml ScannerException: while scanning an alias *
在使用yml编写配置我呢见 management: endpoints: web: base-path: /actuator jmx: exposure: include: * 报了如下错误 解决方案 ...
- 文件批量生成IO流读写
/// <summary> /// 生成文件的 /// </summary> /// <param name="calssName"></ ...
- 蓝色大气简约立体答辩ppt模板推荐
小编个人非常喜欢这个模版,大气深蓝色,具有科技感,非常适合学生的毕业答辩PPT模板. 模版来源:http://ppt.dede58.com/gongzuohuibao/26496.html
- MyBtis之关于#{}和${}
1.${}的用法的mapper文件配置: </select> <select id="selById2" resultType="com.sus ...
- 读书笔记_python网络编程3(5)
5. 网络数据与网络错误 应该如何准备需要传输的数据? 应该如何对数据进行编码与格式化? Py程序需要提供哪些类型的错误? 5.1. 字节与字符串 PC与网卡都支持将字节作为通用传输单元.字节将8比特 ...