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的预分区一一对应了。

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

以前的系统

  

  消息进来了以后,由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. Hbase预分区入门

    什么是Hbase 预分区? 在建表的时候,可以给每个region划分不同的rowkey范围. 之后在插入数据的时候,数据就会依据rowkey的不同进入到不同的region中.当然,每个region在h ...

  2. hbase 预分区设计

    文章目录 hbase 预分区设计 一.手动切割分区 二.自动切割分区 三.预先切割分区 四.三种预分区方式 1.范围预分区 2.16进制预分区 3.按文件中的分区 hbase 预分区设计 hbase ...

  3. Hbase预分区与优化

    Hbase支持两种读读操作,Scan & Get两种,Get在hbase的内部也是会转换成startRow == endRow的操作,所以本文就只介绍Get操作. Scan的实际执行者是Reg ...

  4. hbase 预分区_hbase的rowKey设计原则

    前言 访问hbase table中的行,只有三种方式: 1 通过单个row key访问 2 通过row key的range 3 全表扫描 可以看出rowkey设计的好与坏直接决定了查询速度,在hbas ...

  5. shell和javaAPI两种方式创建hbase表并预分区

    在hbase里面,如果我们建表不预分区,那么一个表的数据都会被一个region处理,如果数据过多就会执行region的split,如果数据量很大这样会很费性能,所以最好我们先根据业务的数据量在建表的时 ...

  6. hbase Normalizer解决预分区错误,在不动数据的情况下完美解决热点问题

    (转)  http://www.aboutyun.com/forum.php?mod=viewthread&tid=24292 1.对于预分区错误,hbase使用什么功能解决? 2.Regio ...

  7. hbase热点问题解决(预分区)

    一.出现热点问题原因        1.hbase的中的数据是按照字典序排序的,当大量连续的rowkey集中写在个别的region,各个region之间数据分布不均衡: 2.创建表时没有提前预分区,创 ...

  8. phonex的使用,二级索引,预分区,调优

    文章目录 一.基本指令 1)创建表 2)删除表 3)插入数据 4)查询数据 5)删除数据 6)退出命令行 二.映射 1)视图映射 创建视图 查询视图 删除视图 2)表映射 删除表 3)视图映射和表映射 ...

  9. Phoenix使用SALT_BUCKETS创建预分区

    1. 基础知识 Phoenix Salted Table是phoenix为了防止hbase表rowkey设计为自增序列而引发热点region读和热点region写而采取的一种表设计手段.通过在创建表的 ...

最新文章

  1. 如何系统地入门学习stm32?
  2. mybatis mysql crud_Mybatis的CRUD操作
  3. 与springcloud整合的框架源码读取入口
  4. PL/SQL导入/导出dmp文件-Oracle表空间不一致
  5. Android 添加菜单项
  6. 对request.getSession(false)的理解(附程序员常疏忽的一个漏洞)--转
  7. tensorflow图形识别_手把手教你使用TF服务将TensorFlow模型部署到生产环境
  8. react回调函数_React中的回调中自动绑定ES6类函数
  9. oc 协议 回调 静态成员_OC问题
  10. 福大软工1816:Alpha(5/10)
  11. byte[] 数组和字符串的转换,与byte[] 数组和int类型的之间的转化
  12. osgEarth gpx文件 16.feature_gpx.earth
  13. 基于springboot的科技馆设备巡检系统
  14. 以休闲游戏“植物大战僵尸”为例,制作无限阳光修改器。
  15. 如何写好高考英语作文
  16. 喜马拉雅xm格式转化mp3_MTS视频格式转化
  17. 计算机无纸化考试知识点,2012重庆无纸化考试《会计电算化》知识点:计算机软件...
  18. 腾讯地图api_让数据跃然“图”上!腾讯位置服务数据可视化API正式发布
  19. 十二星座匹配对象_水瓶座最佳配对对象是谁
  20. 2021年研究生入学考试总结和复试冲刺复习计划

热门文章

  1. Redis与Memcached简要比较
  2. 基于ThinkPHP框架下登录登出权限控制(一).
  3. 集合框架(List的三个子类的特点)
  4. Tomcat windows下安装
  5. 【求助】哪个软件负责在屏幕右下角显示类似“caps lock on/off”的? - 技术封存区 - 专门网论坛 -...
  6. Oracle宣布终止所有Intel Itanium平台上的软件开发
  7. 求助:谁可以给我点share point 开发的资料
  8. 五千万美元注资孵化器,ETC能实现绝地反击吗?
  9. 学习Redis持久化
  10. X86服务器虚拟化的资源划分和性能优化