Hbase写入量大导致region过大无法split问题

简介: 最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题。让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region无法split掉,处于不可用状态。

最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题。让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region无法split掉,处于不可用状态。这里描述一整个过程——

        事情的起因:业务方按照userid和商品id作为rowkey前缀,并没有进行hash散列。我当时咨询过业务方,认为:1.业务方式按照oracle的rowid顺序来进行迁移的,相对来说对应到rowkey里面就不会集中化;2.即使出现部分集中的情况,hbase也能够通过自动split来hold住写入。

        结果线上写入的时候,12台机器的情况下业务方写入达到50~60w tps,基本上5w tps每台的写入速度。开始的时候region还能够自动split,比较好,写入速度也能够保持,但是到了第二天,发现写入在region维度的分布很不均衡,于是查看表的region size 情况,有一个region数据量特别大——800GB,700+个文件。

       这里也分析一下为什么hbase会让这么大的region存在,其实这块hbase的控制机制也是值得商榷的。首先,大量的写入会刷大量的HFile,一个region就会对这大量的hfile进行compact操作。如果这时候触发了split操作,这个region会成为父region,而两个子region会保留父region的引用文件。而在这其间,子region会继续写入数据。那么又可能触发子region的compact,这里的关键点来了——子region如果做compact的文件都是新写入的文件,而迟迟不去compact父region 引用的文件,会导致一个问题——就是这个子region无法被split掉了(因为含有父region引用的region是不能被split的)。那么子region越来越大,由于写入文件数量急剧增长,父region的ref文件总也得不到机会compact,就形成了大region的恶性循环情况——由于region太大,compact无法完成,但是由于compact无法完成导致region无法split,无法分摊compact的压力给其他regionserver。当然还得加上最后一点外部大量的写入没有停止——这里我们通常理解,hbase有一个参数hbase.hstore.blockingStoreFiles=30,当region下的hfile达到30个的时候是会阻塞写的。那我都bolck住写了,为什么region里hfile会到700这么多呢?原来还有另一个参数hbase.hstore.blockingWaitTime=30000.hbase考虑到对应用的影响不会长时间block住写,30秒后会恢复。

      这里天梧有提一个改进的compact算法,优先去compact从父region引用过来的hfile,让region有split的可能,能在一定程度上缓解这个问题http://kelude.taobao.net/issues/543434 ,这个方法我使用过,只能在一定程度上缓解问题,对于800G大小的region,一天都没有compact掉。所以只适合100G以内的region,并且这时候业务方还不能有大量的写操作。但有趣的是一般如此程度的写入压力都是在业务方新导入数据的时候造成的,所以和业务方沟通一下让他们重导数据比自己慢慢郁闷的compact这个大region来的要快的多。但是在重新导之前就要好好改进一下了:

      这里总结一下这个问题,对于大批量导入数据,1、还是必须让业务方对rowkey进行预分片,对业务数据rowkey进行md5或者其他的hash策略,让数据尽量随机分布而不是顺序写入。2、随时观察region的大小,是否出现大region的情况。

      这个问题预防为主,如果出现大region——优先考虑重导数据,其次使用patch。

目录
相关文章
|
存储 分布式计算 Hadoop
Hadoop-33 HBase 初识简介 项目简介 整体架构 HMaster HRegionServer Region
Hadoop-33 HBase 初识简介 项目简介 整体架构 HMaster HRegionServer Region
327 2
|
存储 分布式计算 监控
分布式数据库HBase的基本概念和架构之基本架构的Region Server
分布式数据库HBase是一个开源的分布式数据库系统,是Apache Hadoop生态系统的重要组成部分。
702 0
|
存储 大数据 Java
深入解读HBase2.0新功能之高可用读Region Replica
基于时间线一致的高可用读(Timeline-consistent High Available Reads),又称Region replica,为HBase带来了高可用读的能力。本文主要介绍region replica这个功能设计的背景,技术细节和使用方法,同时会仔细分析这个功能的优缺点并给出使用建议。
9876 0
|
分布式计算 分布式数据库 Hbase
Hbase compact以及split跟踪
为了准确了解HBASE内部工作原理,我们需要做一些测试,在大量数据插入的情况下,HBASE内部到底有什么表现? 比如插入速度, hstore compact,split等相关活动,了解了这些才能更好的维护HBASE系统本身。 此次测试会有几轮,所以测试到哪里就写到哪里,我随便找了一张大概120W来的表,我会写一个mapreduce任务,来读取这张表,再写入另外一个测试表: test2, 没有选择更大的表是因为毕竟整个拷贝是需要时间,通常20分钟-30分钟,太大的表,不太利于跟踪。 拷贝过程,HBASE会针对此表有相关的活动日志,依据日志,我们来看看HBASE到底在干什么。 测试开始,
516 0
|
Web App开发 监控 前端开发
HBase工具之监控Region的可用和读写延时状况
1、介绍HBase集群上region数目由于业务驱动而越来越多,由于服务器本身,网络以及hbase内部的一些不确定性bug等因素使得这些region可能面临着不可用或响应延时情况。
1466 0
|
分布式数据库 Hbase
技术篇-深入解读 HBase2.0 新功能之高可用读 Region Replica
1.前言 基于时间线一致的高可用读(Timeline-consistent High Available Reads),又称 Region replica。其实早在 HBase-1.2 版本的时候,这个功能就已经开发完毕了, 但是还是不太稳定,离生产可用级别还有一段距离,后来社区又陆陆续续修复了 一些 bug,比如说 HBASE-18223。
5348 0
|
存储 Shell 分布式数据库