转自: 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)存储与协处理器查询数据的方法的更多相关文章

  1. Python 数据分析(一) 本实验将学习 pandas 基础,数据加载、存储与文件格式,数据规整化,绘图和可视化的知识

    第1节 pandas 回顾 第2节 读写文本格式的数据 第3节 使用 HTML 和 Web API 第4节 使用数据库 第5节 合并数据集 第6节 重塑和轴向旋转 第7节 数据转换 第8节 字符串操作 ...

  2. HBase中加盐(Salting)之后的表如何读取:协处理器文章

    我们介绍了避免数据斑点的三种比较常见方法: 加盐-盐腌 哈希-散列 反转-反转 其中在加盐(Salting)的方法里面是这么描述的:给Rowkey分配一个随机指针以使其和之前排序不同.但是在Rowke ...

  3. HBase 中加盐之后的表如何读取:Spark 篇

    在 <HBase 中加盐之后的表如何读取:协处理器篇> 文章中介绍了使用协处理器来查询加盐之后的表,本文将介绍第二种方法来实现相同的功能. 我们知道,HBase 为我们提供了 hbase- ...

  4. Python之pandas数据加载、存储

    Python之pandas数据加载.存储 0. 输入与输出大致可分为三类: 0.1 读取文本文件和其他更好效的磁盘存储格式 2.2 使用数据库中的数据 0.3 利用Web API操作网络资源 1. 读 ...

  5. HBase 中加盐(Salting)之后的表如何读取:Spark 篇

    我们知道,HBase 为我们提供了 hbase-mapreduce 工程包含了读取 HBase 表的 InputFormat.OutputFormat 等类.这个工程的描述如下:This module ...

  6. python数据分析之:数据加载,存储与文件格式

    前面介绍了numpy和pandas的数据计算功能.但是这些数据都是我们自己手动输入构造的.如果不能将数据自动导入到python中,那么这些计算也没有什么意义.这一章将介绍数据如何加载以及存储. 首先来 ...

  7. 利用Python进行数据分析 第6章 数据加载、存储与文件格式(2)

    6.2 二进制数据格式 实现数据的高效二进制格式存储最简单的办法之一,是使用Python内置的pickle序列化. pandas对象都有一个用于将数据以pickle格式保存到磁盘上的to_pickle ...

  8. 利用python进行数据加载和存储

    1.文本文件 (1)pd.read_csv加载分隔符为逗号的数据:pd.read_table从文件.URL.文件型对象中加载带分隔符的数据.默认为制表符.(加载为DataFrame结构) 参数name ...

  9. 页面数据加载完成时,显示loading页面.数据加载完,loading隐藏.

    一,引入三个文件 jQuery版本使用 jQuery v1.7.1 jquery-easyui文件中,引入easyui-lang-zh_CN.js的js 做数据加载时使用jquery.blockui. ...

随机推荐

  1. Centos手动安装PHP

    下载PHP的源码,我下的是7.2版本,看了一下安装的参数太多了,也没有时间依次了解每个参数的意思,直接从网上复制了一个,先尝试安装起来.并记录一下步骤,基本的步骤就是解压.配置.编译.运行.1.下载P ...

  2. mysql研究跟进

    count(1)对比 count(*) count(N),N指的是列的序列号,innodb引擎下一般为主键列:count(*),mysql优化器也会将统计列自动优化.所以日常使用区别不大 阿里规范里的 ...

  3. 百度云盘资源 for MAC 第三方工具不限速下载

    相信大家都比较困惑,百度网盘客户端限速后一般只有几十K的下载速度,Windows有百度网盘破解版,但MAC的破解版似乎不存在,要提速的话,一般的做法是开超级会员(27元/月),身为程序员的我们,是不是 ...

  4. jQuery 源码分析(二十一) DOM操作模块 删除元素 详解

    本节说一下DOM操作模块里的删除元素模块,该模块用于删除DOM里的某个节点,也可以理解为将该节点从DOM树中卸载掉,如果该节点有绑定事件,我们可以选择保留或删除这些事件,删除元素的接口有如下三个: e ...

  5. Deepnude算法“tuo”衣服

    PS:我不是偷窥狂.我是技术的爱好者 换脸视频后AI又出偏门应用:用算法“tuo”女性衣服 据美国科技媒体Motherboard报道,一名程序员最近开发出一款名叫DeepNude的应用,只要给Deep ...

  6. npm与cnpm的区别

    NPM(Node Package Manager,节点包管理器)是NodeJS的包管理器,用于节点插件的管理(包括安装,卸载和管理依赖等).NPM是随同新版的NodeJS一起安装的包管理工具,所以我们 ...

  7. #w30 2019年大前端技术周刊

    本周是2019年第30周 会议 2019年ArchSummit全球架构师峰会 2019年7月在深圳举行了ArchSummit全球架构师峰会,里面有不少关于大前端的主题可以关注. 从0到1,移动政务应用 ...

  8. mysql中concat函数的使用相关总结

    concat(str1,str2) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. mysql> select concat('11','22','33') ...

  9. 基于STM32F429,Cubemx的SDHC卡的基本Fatfs文件移植

    本博文要求各位初步了解Fatfs文件系统 友情提示Fatfs官网:http://elm-chan.org/fsw/ff/00index_e.html 1.开发软件 keil5,Cube5.21 2.实 ...

  10. cocos2d-x 新工程的把玩

    创建了cocos的工程以及初步了解了工程的结构之后,可以尝试自己改改代码了 游戏窗口的设置 首先是AppDelegate,找到AppDelegate.cpp中AppDelegate::applicat ...