Hbase生产线上碰到的问题

Hbase生产线上碰到的问题

1、产生事故的背景
  spark做轨迹异常处理,计算用户的在线时间长,在线和离线的gps点数量,卫星颗数等,通过Spark Streaming的window函数计算10分钟的数据,然后插入到hbase中。由于计算后的数量比较大,导致数据插入到hbase中时造成热点问题,regionServer挂掉了,最后Spark Streaming程序执行缓慢。
2、分析事故产生的原因
  产生这个热点问题的原因是regionServer太少了,导致数据都集中在一个regionServer上,然后regionServer进行分裂,分裂的时候对插入数据的性能影响很大,但是数据还在不断的写入,导致regionServer进程一个个退出了。
3、最后解决的办法
  1、对hbase中建的表进行预分区:
  create ‘bd_spark_track_gps_thirtySeconds’,{NAME => ‘info’, BLOOMFILTER => ‘ROWCOL’,VERSIONS => ‘10’, IN_MEMORY => ‘false’, KEEP_DELETED_CELLS => ‘FALSE’,DATA_BLOCK_ENCODING => ‘NONE’, COMPRESSION => ‘SNAPPY’, MIN_VERSIONS =>‘0’, BLOCKCACHE => ‘true’, BLOCKSIZE => ‘65536’, REPLICATION_SCOPE =>‘1’},{SPLITS => [‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’]}
  首先hbase的rowkey是按照ascii码排序,即按照每一个字节的顺序比较的,先比较第一个字节,如果第一个字节小就不比较后面的了,如果第一个字节相同比较第二个字节的大小,以此类推。通过预分区后,就将rowkey分散到10个不同发分区中,避免造成热点。
  2、对hbase的rowkey进行字符串反转,这样子避免单个用户的数据集中一个regionsever上。因为我们需求是写入多,查询少,所以最好是分散开来。
  **对于删除过期数据的做法,在建表时,对某列族设置一个过期时间,自动删除过期数据。
  **alter ‘tableName’,{NAME => ‘列簇’,TTL => ‘xxxxxx’} xxxxxx单位是秒,默认是64年左右
4、总结
  通过这两个办法解决了热点问题,对于hbase的表设计了几个原则:
  一、列族的设计
    1、列族不宜过多,官方建议是3个以内
    2、经常一起查询的数据放入一个集群中
  二、行键的设计
    1、唯一
    2、有意义
    3、字符串
    4、固定长度
    5、不宜过长 10~100 16 8的整数倍
  rowkey设计遵循两个原则,有序原则和散列原则,有序原则:打个比方,一个用户的唯一标识加上年月日时分这样的rowkey,对于这一个用户所有的数据都会在一个regionServer上,写入数据的时候比较慢,数据量大的话容易造成热点问题,但是查询是比较快的,对一个范围进行scan,数据都集中在一块,所以很容易获取到。想这样的情况可以对rowkey进行反转,分散开来,写入快,查询慢,这就是散列原则。两者是相互矛盾都,可以进行取舍。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值