1 目前Rawlog表的问题

  1. region数量庞大,空region 率大

    • 共有12791个region
    • 11409空region, 比例为89.19%
    • 剩余的region大小也是极度不均衡,最大的region 287G, <1m的region有129个
  2. 读写不均衡
    • 现有的rowkey设计,简单来说是appid+date的顺序序列
    • 简单来说对于每个appid都有一个写热点,这不仅没有利用到分布式的优点,还会极大的降低整个hbase集群的服务能力
    • 读存在同样的问题,一次读基本上会集中在一个region上,这对于scan是好的,但目前我们所有的log查询都是基于mutiget的,还不如分散来的性能好。

2 解决方案

现有的log查询方案:

  1. 从logindex表获取log的rowkey
  2. 根据rowkey使用mutiget获取具体的log

所以不在需要顺序的rowkey设计。

  1. 解决region数量庞大的问题

    • 使用预分的region
    • 根据实际数据量,预分出足够的region, 后续保证尽量少的出现split
  2. 解决空region率,大小不均衡,及读写不均衡
    • 这些问题可以一起解决
    • 写的时候足够散列的(平均)写到这些region上
    • 理想状态下各region大小会完全一致
    • 读写理想状态下也会完成一致
    • 可以减少split的次数,理想状态下不会再出现,同样减少了该表region的blance出现的次数,理想状态下不会出现。

现在进行改造的优势是,我们有生产数据进行支持,金桥是一个全新的集群,这是一个机会,可以不考虑老数据的迁移(到时福泉与金桥应用并行运行,避免迁移数据)

2.1 预分region的数量

  1. 目前生产rawlog表的大小为2938.5G, 也就是3T,保存了7天的数据
  2. 考虑到以后的数据增量,以10T为存储目标,一个region2G, 可以预分5000个region

2.2 如何实现足够散列写(或对region平均写)

  1. 理论上可以对region依次写入一条log, 轮循一遍后,再次从头轮循,这样可以达到绝对平均
  2. 实际解决方案, 可以设计一种rowkey结构
hashcode
unique-id
1 ~ 100000 appid + hostip + timestamp + logid
  1. 从通用角度,rowkey 分为两部分
    1. hashcode: 散列值,用于将数据散列到各region上
    2. unique-id: 这条数据的一个唯一id, 这个基本上和业务相关
  2. 对于rowlog表
    1. hashcode: 可以是一个1 ~ 100000的int值
    2. unique-id: 可以是一个由appid + hostip + timestamp + logid 组成的唯一id, 也是现有的rowkey设计
  3. 如果预分5000个region, 每个region将占有20个散列值(startKey-endKey):1-20, 21-40, .... 99981-100000

2.3 工作量

  1. 只要修改writer端rowlog的rowkey生成策略
  2. 对于其他地方完全透明
  3. 编码的话只要两个小时就足够了,后续就是支持工作了。
  4. 如何获取一条log的hashcode, 有几种方案:
    1. writer每收一条log可以递增,到达100000,归1
    2. 也可以每次取1-100000的随机值,效率最低
    3. 为了去除1-20的连续写, 可以
      1. 可以分配一个int[100000],里面存放shuffle后的1-100000的值
      2. 每来一条log从数组里取一个值int[i++]
      3. 到达数组结尾后可以直接从头再取,或shuffle后再从头取
      4. 或着一开始就预先shuffle好几个数组,待用。

Log表新的RowKey设计,预Split的更多相关文章

  1. HBase的Rowkey设计(mark)

    在HBase中细节上的设计,最最最重要的就是我该选取什么做Rowkey,Rowkey的选择,最直接的影响就是对你之后分析数据的影响了. Rowkey是不可分割的字节数,按照字典排序由低到高存储在表中. ...

  2. HBase之六:HBase的RowKey设计

    数据模型 我们可以将一个表想象成一个大的映射关系,通过行健.行健+时间戳或行键+列(列族:列修饰符),就可以定位特定数据,Hbase是稀疏存储数据的,因此某些列可以是空白的, Row Key Time ...

  3. Hbase Rowkey设计

    转自:http://www.bcmeng.com/hbase-rowkey/ 建立Schema Hbase 模式建立或更新可以通过 Hbase shell 工具或者使用Hbase Java API 中 ...

  4. HBase高级特性、rowkey设计以及热点问题处理

    在阐述HBase高级特性和热点问题处理前,首先回顾一下HBase的特点:分布式.列存储.支持实时读写.存储的数据类型都是字节数组byte[],主要用来处理结构化和半结构化数据,底层数据存储基于hdfs ...

  5. 大数据性能调优之HBase的RowKey设计

    1 概述 HBase是一个分布式的.面向列的数据库,它和一般关系型数据库的最大区别是:HBase很适合于存储非结构化的数据,还有就是它基于列的而不是基于行的模式. 既然HBase是采用KeyValue ...

  6. hbase rowkey 设计

    HBase中的rowkey是按字典顺序排序的,通过rowkey查询可以对千万级的数据实现毫秒级响应.然而,如果rowkey设计不合理的话经常会出现一个很普遍的问题----热点.当大量client的请求 ...

  7. hbase实践之rowkey设计

    rowkey设计的重要性 rowkeys是HBase表设计中唯一重要的一点. rowkey设计要求 唯一性 存储特性 按照字典顺序排序存储 查询特性 由于其存储特性导致查询特性: 查询单个记录: 查定 ...

  8. Hbase Rowkey设计原则

    Hbase是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这三个维度可以对HBase中的数据进行快速定位 ...

  9. HBase学习(四) 二级索引 rowkey设计

    HBase学习(四) 一.HBase的读写流程 画出架构 1.1 HBase读流程 Hbase读取数据的流程:1)是由客户端发起读取数据的请求,首先会与zookeeper建立连接2)从zookeepe ...

随机推荐

  1. 浅谈cookie测试

    Cookie 提供了一种在Web 应用程序中存储用户特定信息的方法,例如存储用户的上次 访问时间等信息.假如不进行cookie存储一个网站的用户行为,那么可能会造成以下问题:用户进行购买几件商品转到结 ...

  2. ASP.NET中相对路径的使用总结

    如果有一个网站上的图片的路径是这样的: http://localhost:2008/websit1/images/1.jpg websit1表示的是虚拟路径或者是站点 在asp.net中,如果我们在. ...

  3. linux 数据盘和系统盘的查看

    系统盘就像linux的c盘,使用df -l命令查看 如下所示: 可以看到根路径 / 都是位于系统盘.而/root,/home,/usr就如同c盘下的c:\windows,c:\usr这些目录 如果单独 ...

  4. easyui------自动合并行

    转载: http://www.cnblogs.com/xiangzhong/p/5088259.html#undefined 1.引入插件 $.extend($.fn.datagrid.methods ...

  5. 2014年辛星解读Javascript之DOM之事件及其绑定

    我们通过DOM的事件能够对HTML的事件作出反应.就像我们用其它编程语言写GUI一样,那么HTML包含哪些事件呢?以下是几个常见的样例,比方网页已经完毕记载,图像完毕载入,鼠标移动到元素上方.输入文字 ...

  6. MySQL<事务与存储过程>

    事务与存储过程 事务管理 事务的概念 谓的事务就是针对数据库的一组操作,它可以由一条或多条SQL语句组成,同一个事务的操作具备同步的特点,即事务中的语句要么都执行,要么都不执行. 事务的使用 开启事务 ...

  7. 超全面的JavaWeb笔记day15<mysql数据库>

    1.数据库的概述 2.SQL 3.DDL 4.DML 5.DCL 6.DQL MySQL 数据库 1 数据库概念(了解) 1.1 什么是数据库 数据库就是用来存储和管理数据的仓库! 数据库存储数据的优 ...

  8. window 后台执行 redis(隐藏窗口)

    方法是在知乎上看的,链接:https://www.zhihu.com/question/22771030 实现方法是利用一个vbe脚本去运行一个bat脚本,在bat脚本里启动exe软件 PS:要想启动 ...

  9. Python查询数据库时候遇到的乱码问题

    今天在看Python连接数据库的内容,然后遇到了最常遇到的字符乱码的状况,这真的很烦人,由于我用的是3.6的版本,,默认的是utf-8,如果是3以下的版本,请在文件开头加一句代码 #encoding= ...

  10. webstorm编译less和scss

    Webstorm 配置less编译的Arguments参数: $FileName$ $FileParentDir$\ccy\ccy1\ccy2\$FileNameWithoutExtension$.c ...