前言:在系统中向hbase中插入数据时,常常通过设置region的预分区来防止大数据量插入的热点问题,提高数据插入的效率,同时可以减少当数据猛增时由于Region split带来的资源消耗。大量的预分区数量会导致hbase客户端缓存大量的分区地址,导致内存的增长,某些系统中一个JVM进程中会开启几十个独立的hbase客户端对象,同时会查询多张Hbase表,这样JVM进程就会缓存 (预分区数 X 表数 X Hbase客户端数=条记录)。

  有没有这种情况?有的,在本人的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中地址的缓存会达到几百兆,这个时候从原理上就可以进行设计了来节省资源消耗,想想可以省好多台服务器。

原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6648834.html

微信:intsmaze

  说了这么多,如何来进行系统资源优化?可以结合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预分区完美结合大幅度节省内存空间的更多相关文章

  1. storm自定义分组与Hbase预分区结合节省内存消耗

    Hbas预分区 在系统中向hbase中插入数据时,常常通过设置region的预分区来防止大数据量插入的热点问题,提高数据插入的效率,同时可以减少当数据猛增时由于Region split带来的资源消耗. ...

  2. 大数据量冲击下Windows网卡异常分析定位

    背景 mqtt的服务端ActiveMQ在windows上,多台PC机客户端不停地向MQ发送消息. 现象 观察MQ自己的日志data/activemq.log里显示,TCP链接皆异常断开.此时尝试从服务 ...

  3. 大数据量情况下求top N的问题

    上周五的时候去参加了一个面试,被问到了这个问题.问题描述如下: 假如存在一个很大的文件,文件中的每一行是一个字符串.请问在内存有限的情况下(内存无法加载这个文件中的所有内容),如何计算出出现频率最高的 ...

  4. 大数据量情况下高效比较两个list

    比如,对两个list<object>进行去重,合并操作时,一般的写法为两个for循环删掉一个list中重复的,然后再合并. 如果数据量在千条级别,这个速度还是比较快的.但如果数据量超过20 ...

  5. 【大数据】Linux下Storm(0.9版本以上)的环境配置和小Demo

    一.引言: 在storm发布到0.9.x以后,配置storm将会变得简单很多,也就是只需要配置zookeeper和storm即可,而不再需要配置zeromq和jzmq,由于网上面的storm配置绝大部 ...

  6. MYSQL的大数据量情况下的分页查询优化

    最近做的项目需要实现一个分页查询功能,自己先看了别人写的方法: <!-- 查询 --> <select id="queryMonitorFolder" param ...

  7. phpExcel导入大数据量情况下内存溢出解决方案

    PHPExcel版本:1.7.6+ 在不进行特殊设置的情况下,phpExcel将读取的单元格信息保存在内存中,我们可以通过 PHPExcel_Settings::setCacheStorageMeth ...

  8. phpExcel大数据量情况下内存溢出解决

    版本:1.7.6+ 在不进行特殊设置的情况下,phpExcel将读取的单元格信息保存在内存中,我们可以通过 PHPExcel_Settings::setCacheStorageMethod() 来设置 ...

  9. C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序

    /// <summary>/// 单表(视图)获取分页SQL语句/// </summary>/// <param name="tableName"&g ...

随机推荐

  1. 安卓TCP通信

    tCPServer.java 服务器的两个socket都没有关闭:s,ss.两个都是一直开启,然后数据才有显示 class tcpServer { public static void main(St ...

  2. 在javascript中关于变量与函数的提升

    在javascript中关于变量与函数的提升 一.简介 在javascript中声明变量与函数的执行步骤: 1.先预解析变量或函数声明代码,会把用var声明的变量或者函数声明的代码块进行提升操作 2. ...

  3. devexpress设置皮肤、字体以及折叠菜单、伸缩Panel的实现

    1.为了体现系统的个性化,越来越多的系统增加了换肤功能.这里例举一个devexpress实现换肤的案例,效果图对比: 第二张图片中更换了皮肤与字体. 2.皮肤数据源绑定代码: //循环添加皮肤名称 f ...

  4. WC2015 冬眠营滚粗记

    WC2015 转眼间就过去了,回想半年前我还是一个无知的渣渣现在已经能参加冬令营了心里真的有点小激动= =,先不论胸牌滚粗的结果,来讲一下自己这几天的经历吧 DAY 0: 早上起来才发现自己什么都没收 ...

  5. BZOJ 2424: [HAOI2010]订货(费用流)

    裸的费用流了= =从源点向每个点连费用为di,从汇点向每个点连流量为ui,每个点向下一个点连费用为m,流量为s的边就行了 CODE: #include<cstdio>#include< ...

  6. Javascript事件绑定及深入

    由于开学后的编程实验课,接触了海量字符换搜索的实验,所以好几天没有学习JS课程了,今天继续学习事件绑定. 传统事件绑定存在一些问题,如:同名事件函数都执行,第二个函数会覆盖第一个. 下面我们以事件切换 ...

  7. Mysql动态sql语句,用当前时间做表名

    在mysql备份操作中, 我们可能要使用表名和当前时间来做为备份表的名称,但是MySQL在存储过程中不支持使用变量名来做表名或者列名. 例如:有一个表"user",我需要备份一份, ...

  8. 【openstack N版】——认证服务keystone

    一. 基础环境 1.1环境介绍 linux-node1(控制节点) #系统版本 [root@linux-node1 ~]# cat /etc/redhat-release CentOS Linux r ...

  9. 三种预处理器px2rem

    CSS单位rem 在W3C规范中是这样描述rem的: font size of the root element. 移动端越来越多人使用rem,推荐淘宝开源框架lib-flexible 今天来介绍一下 ...

  10. Ansible 系列之 Ad-Hoc介绍及使用

    Ad-Hoc 介绍 一.什么是ad-hoc 命令? ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令.就相当于bash中的一句话shell.这也是一个好的地方,在学习ansible ...