storm自定义分组与Hbase预分区结合节省内存消耗
Hbas预分区
在系统中向hbase中插入数据时,常常通过设置region的预分区来防止大数据量插入的热点问题,提高数据插入的效率,同时可以减少当数据猛增时由于Region split带来的资源消耗。大量的预分区数量会导致hbase客户端缓存大量的分区地址,导致内存的增长,某些系统中一个JVM进程中会开启几十个独立的hbase客户端对象,同时会查询多张Hbase表,这样JVM进程就会缓存 (预分区数 X 表数 X Hbase客户端数=条记录)。
storm的自定义分组
有没有这种情况?有的,在本人的storm项目中,采用结合spring注入的方式来结合Hbase向hbase存入数据,storm中的每一个线程都会创建一个XmlBeanDefinitionReader对象来加载spring的配置文件,所以一个线程就有一个hbse客户端对象了,同时Hbase表设置102预分区,一个topology会操作最少8张表,一个worker会走20个task。所以一个work会缓存大约102*8*20=16320条记录,每一条记录的数据格式大致就是hbase.meta的一条数据格式,经过我计算16000多条记录一个JVM中占用内存也就5M多,对内存的消耗是完全可以忽略不计的。这就很尴尬了。这种优化只是对于大规模的集群来说有效果,小规模集群考虑这种情况是过度设计了。比如那种Hbase客户端会有缓存一整张hbase.meta表数据的系统又或者那种hbase表分区达到上万的系统,那么一个woeker中地址的缓存会达到几百兆,这个时候从原理上就可以进行设计了来节省资源消耗,想想可以省好多台服务器。
说了这么多,如何来进行系统资源优化?可以结合storm的自定义分区,不再使用storm提供的分组策略,我们把作用于hbase的散列算法来作为storm的分组策略,就可以得到storm的task与hbase的预分区一一对应了。
以前的系统

消息进来了以后,由spout均匀的发送到各个intsmaze-bolt节点上,每一个bolt节点再使用散列算法把该消息存入对应的hbase表分区中。
现在的系统

消息进来了以后,spout在进行发送给intsmaze-bolt的时候,在分组策略中使用与hbase同样的散列算法,然后把同一范围内的消息发送给对应的intsmaze-bolt的taske,这样就可以保证bolt的并行度与hbase的预分区一一对应,每一个taske中的hbase客户端只会缓存对应的几个hbase的表预分区的地址信息。
关于storm的自定义分组的实现可以百度,这里不给出代码实现,只给出实现方案。补充一句,散列算法设计的好,是可以保证消息在storm的bolt里的task分发中不会发生数据倾斜的。
Hbase1.1.2的客户端源码

会先到zookeeper中拿到hbase.meta的地址信息,hbase.meta里面存储着所有用户表各个分区的地址已经rowkey的范围:
locations= [region=hbase:meta,,1.1588230740, hostname=centos-reall-132,16020,1490876417048, seqNum=0]

这里就好把表名和该表的地址等元数据缓存下来,下次就不用走网络去获取了。下面就会第一次缓存hbse.meta表的数据信息。


当大量的向某个分区表插入数据后,metaCache中就有下面的数据:

{hbase:meta={[B@e09300c=[region=hbase:meta,,1.1588230740, hostname=centos-reall-132,16020,1490876417048, seqNum=0]},
t_regin_demo={
[B@f01dde6=[region=t_regin_demo,10|,1480171499299.e94245285fb3fbfe3dd3bb7e9c632be8., hostname=centos-reall-132,16020,1490876417048, seqNum=50],
[B@438f2ebc=[region=t_regin_demo,20|,1480171499299.b9bee9aad30185f682d943172136966b., hostname=centos-reall-132,16020,1490876417048, seqNum=50],
[B@6d455b4a=[region=t_regin_demo,30|,1480171499299.144c892d9a29739d46c3561c431326ac., hostname=centos-reall-132,16020,1490876417048, seqNum=53],
[B@646c8f51=[region=t_regin_demo,40|,1480171499299.f5c53075ed5f26cf1001ffd7d12101d1., hostname=centos-reall-132,16020,1490876417048, seqNum=50],
[B@13354259=[region=t_regin_demo,50|,1480171499299.2d3eff976bd362e338be87e6eb8b8e42., hostname=centos-reall-132,16020,1490876417048, seqNum=50],
[B@d96eae9=[region=t_regin_demo,60|,1480171499299.67c0711ff634ad63a81e2d3c753cf9f6., hostname=centos-reall-132,16020,1490876417048, seqNum=50],
[B@2f186df7=[region=t_regin_demo,70|,1480171499299.78c04fabbb1fb9aebc4600ff653eb3d8., hostname=centos-reall-132,16020,1490876417048, seqNum=47],
[B@6cdb8b48=[region=t_regin_demo,80|,1480171499299.b7ae8e09ddea0faea2360897add9b18f., hostname=centos-reall-132,16020,1490876417048, seqNum=56],
[B@41955bcd=[region=t_regin_demo,90|,1480171499299.8ac30f51ea6143b509b84e62ed62db7a., hostname=centos-reall-132,16020,1490876417048, seqNum=50]}}
storm自定义分组与Hbase预分区结合节省内存消耗的更多相关文章
- 大数据量场景下storm自定义分组与Hbase预分区完美结合大幅度节省内存空间
前言:在系统中向hbase中插入数据时,常常通过设置region的预分区来防止大数据量插入的热点问题,提高数据插入的效率,同时可以减少当数据猛增时由于Region split带来的资源消耗.大量的预分 ...
- Hbase预分区种子生成
提前生成Hbase预分区种子,在创建Hbase表时也进行相应的预分区,同时设置预分区的个数,预分区的范围对应Hbase监控页面的Region Server的start key与End key,从而使数 ...
- HBase预分区
seq 0 7 | awk '{printf("\\x%02x\\x%02x\n", $1/256, $1%256);}' | sort -R |head -3 create 'm ...
- hbase 预分区与自动分区
我们知道,HBASE在创建表的时候,会自动为表分配一个Region,当一个Region过大达到默认的阈值时(默认10GB大小),HBase中该Region将会进行split,分裂为2个Region,以 ...
- hbase 预分区
转载 http://www.cnblogs.com/bdifn/p/3801737.html
- HBase 热点问题——rowkey散列和预分区设计
热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作).大量访问会使热点region所在的单个机器超出自身承受能力,引起性能下降甚至region不可用,这也会影响 ...
- 【HBase】带你了解一哈HBase的各种预分区
目录 简单了解 概述 设置预分区 一.手动指定预分区 二.使用16进制算法生成预分区 三.将分区规则写在文本文件中 四.使用JavaAPI进行预分区 简单了解 概述 由上图可以看出,每一个表都有属于自 ...
- HBase表预分区与压缩
1.建立HBase预分区表.sql语句如下: create 'buyer_calllogs_info_ts', 'record', {SPLITS_FILE => 'hbase_calllogs ...
- 关于Hbase的预分区,解决热点问题
Hbase默认建表是只有一个分区的,开始的时候所有的数据都会查询这个分区,当这个分区达到一定大小的时候,就会进行做split操作: 因此为了确保regionserver的稳定和高效,应该尽量避免reg ...
随机推荐
- c++预声明类引发的无法解析外部符号问题
在VisualStudio下开发C++程序常遇到链接问题就是:LNK2019 无法解析外部符号. 这个问题一般我们认为是没有将引用的代码链接到当前项目造成,也有例外,就是下面我要说的预声明类导致的. ...
- nginx的rewrite ,如何在flask项目中获取重写前的url
1. 在flask配一个重写到哪的路由,假设是/rewite/,然后到nginx的配置文件写重写规则,我这里重写全部的请求,接着测试能否重写成功 1. 添加一个路由 配置重写规则 测试成功 2.接下来 ...
- The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "SDSSDFCC...
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server ...
- 【爬坑】远程连接 MySQL 失败
问题描述 远程连接 MySQL 服务器失败 报以下错误 host 192.168.23.1 is not allowed to connect to mysql server 解决方案 在服务器端打开 ...
- JAVA API的下载和中文查看API
一.JAVA API的下载 1.1 JAVA由SUN公司开发,2006年SUN公司宣布将Java技术作为免费软件对外发布,标志着JAVA的公开免费.2009年,SUN公司被甲骨文公司收购,因此我们现在 ...
- 解决 win10 由于磁盘缓慢造成机器迟钝
关闭 windows 的superfetch服务 建议禁止 superfetch服务: http://www.360quan.com/safe/6946.html 操作: http://jingyan ...
- linux编译64bitHadoop (eg: ubuntu14.04 and hadoop 2.3.0)
Hadoop官网提供的编译好的hadoop-2.3.0.tar.gz二进制包是在32位系统上编译的,在64系统上运行会有一些错误,比如: WARN util.NativeCodeLoader: Una ...
- 关于折半法查找的一些总结以及ArrayList类的总结
一.折半法查找的总结(这算法很好理解,但我花了好久琢磨他有啥用.....) 1.实际意义 折半法查找主要是为了能够很快在一个数组中找出我们所需要的那个元素,与往常我们通过一个一个比较的方法不同,折半法 ...
- Mysql 关键字的优先级 分组 多表联查
查看模式 select @@global.sql_mode; 关键字的优先级 from 来自 where 条件 group by 分组 having 筛选 select 查询 distinct 去重 ...
- linux学习笔记整理(七)
第八章 Centos7软件包的管理与安装本节所讲内容:8.1 使用rpm命令-安装-查看-卸载-rpm软件包8.2 yum管理软件包8.3 实战tar源码包管理-srpm源码包安装方法 8.1 软件包 ...
