Hbase写入量大导致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。

时间: 2024-09-20 00:08:57

Hbase写入量大导致region过大无法split问题的相关文章

友达总经理:面板业规模大导致亏损越大

[搜狐IT消息]7月25日消息, 昨天,知名面板厂商友达总经理彭双浪表示,将考虑与品牌及系统厂商结盟,以提升友达竞争力.同时,彭双浪强调,目前不是面板厂合并的好时机.友达光电企业法人透露,友达的合作伙伴可能是索尼.长虹.海尔与冠捷等.由于友达今年通过了8亿股增资案,因此,是否引进新投资人成为必须要考虑的事情.彭双浪称,这部分还在谈,但目前还没有具体进度.彭双浪表示,友达希望引进的策略投资人,是要和友达现 有的团队形成互补,而且要求对友达的长期发展有帮助,因此,品牌厂商与系统厂商成为首选,比如与友

HBase写入优化--write buff

write buff操作 前两天在观察kafka消费数据的时候,发现HBase偶尔会报一个org.apache.hadoop.hbase.RegionTooBusyException: org.apache.hadoop.hbase.RegionTooBusyException这种错误出来,从描述上看,是HBase写入太过频繁导致的. 首先来看我的写入操作代码: /** * 单条更新hbase数据 * * @param tableName * 表名 * @param put * put对象 *

Sybase数据库:日志过大导致不能启动

问:有个问题问一下,关于SYBASE的:我打开数据库总是提醒:cannot open transaction log file-----cannot use log file "hms2000.log" since it is shorter than experted.我直接删除了日志,也不能正常启动,说找不到文件.请问这是怎么回事啊?附上出错的日志记录: I. 10/09 09:58:38. Sybase Adaptive Server Anywhere Network Serve

文件的拷贝与删除-通过线程用BufferedWriter将系统当前时间写入日志文件失败,求大神指导

问题描述 通过线程用BufferedWriter将系统当前时间写入日志文件失败,求大神指导 String path = "d:/log"; public synchronized void write(){ try { file = new File("d:/log/"+time+".log"); file.createNewFile(); fw = new FileWriter(file); bw = new BufferedWriter(fw

解决父类加载iframe,src参数过大导致加载失败

原文:解决父类加载iframe,src参数过大导致加载失败<iframe src="*******.do?param=****" id="leftFrame" name="leftFrame" frameborder="0"></iframe> 或者是使用js加载src: var params = "?pk_id="+pk_id; var frameLeftSrc = "&

dmp-oracle往导入数据时需要的表空间变得很大导致导入中断

问题描述 oracle往导入数据时需要的表空间变得很大导致导入中断 50C 用的oracle11g,我用imp导入一个3g左右的dmp文件,导入用户和表空间都是新建的应该不存在大小不够的问题,我之前试着导入的时候需要的表空间一直增长到了80g左右把我的硬盘都装满了.不知道有没有什么解决方法望指点. 解决方案 http://www.2cto.com/database/201311/254231.html 解决方案二: http://blog.csdn.net/qq275394303/article

android下载图片过大导致报错

问题描述 android下载图片过大导致报错 package tarena.day2801; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apa

普通计算器--能够自己写入相关运算方式程序--请问大神们,有什么好的建议。

问题描述 普通计算器--能够自己写入相关运算方式程序--请问大神们,有什么好的建议. 日常中用的普通计算器,能够进行加减乘除的就行.可以自己烧录相关程序. 解决方案 你到底问什么问题?是你希望购买一个可以编程的计算机,还是你希望自己开发这样的设备,或者是你希望写一个程序模仿计算器? 解决方案二: 单片机+液晶屏+键盘.这应该算是嵌入式了吧. 解决方案三: 直接再重新用单片机控制设计一个计算器, 解决方案四: 1+2*3=9还是7.

jquery解决ie6中图片过大导致错位解决方法

jquery解决ie6中图片过大导致错位解决方法 在产品展示页面中用jqurey控制下: /*这个标签调用产品图片*/ <asp教程:image runat="server" id="productbigimg" /> 首先引入jquery <script src="/utility/js/jquery.js" type="text/网页特效"></script> <script ty