HBase flush issue
来源:互联网 发布:什么软件买东西便宜 编辑:程序博客网 时间:2024/06/05 17:23
最近经常有region进入无休止的flush状态,并且会导致用户MR无法插入数据到HBase,从而导致MR超时被Kill。
hbase regionserver中的flush log如下
2017-06-13 14:05:55,799 INFO org.apache.hadoop.hbase.regionserver.HRegionServer:xxdn2076.stratus.phx.xxx.com,60020,1495823170259-MemstoreFlusherChore requesting flush for region z_images_00,mk-Svq,1464847988948.5273988aca6f1320405eff53181d40ed. after a delay of 22046
jmx中可以关注如下信息
"blockedRequestCount": 4328HRegion.java
/* * Check if resources to support an update. * * We throw RegionTooBusyException if above memstore limit * and expect client to retry using some kind of backoff */ private void checkResources() throws RegionTooBusyException { // If catalog region, do not impose resource constraints or block updates. if (this.getRegionInfo().isMetaRegion()) return; if (this.memstoreSize.get() > this.blockingMemStoreSize) { blockedRequestsCount.increment(); requestFlush(); throw new RegionTooBusyException("Above memstore limit, " + "regionName=" + (this.getRegionInfo() == null ? "unknown" : this.getRegionInfo().getRegionNameAsString()) + ", server=" + (this.getRegionServerServices() == null ? "unknown" : this.getRegionServerServices().getServerName()) + ", memstoreSize=" + memstoreSize.get() + ", blockingMemStoreSize=" + blockingMemStoreSize); } }
关于MemStore的刷新方式:1、MemStore达到上限hbase.hregion.memstore.flush.size 默认是128M的时候,会触发MemStore的刷新。这个参数表示单个MemStore的大小的阈值。这个时候是不阻塞写操作的。 2、当一个Region的MemStore总量达到hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size(默认2*128M=256M)时,会阻塞这个region的写操作,并强制刷写到HFile。触发这个刷新只会发生在MemStore即将写满128M时put了一个巨大的记录的情况,这时会阻塞写操作,强制刷新成功才能继续写入。 3、一个RegionServer会有很多个Region,很多的MemStore,所以可能单个Region并没有超过阈值,但是整个RegionServer的内存已经占用非常多了,这时候还有另外两个参数控制内存的刷写:hbase.regionserver.global.memstore.upperLimit 默认0.4,当RegionServer上全部的MemStore占用超过heap(heap的大小在hbase-env.sh中设置HBASE_HEAPSIZE,默认1G,我们设置的4G)的40%时,强制阻塞所有的写操作,将所有的MemStore刷写到HFile;hbase.regionserver.global.memstore.lowerLimit 默认0.35,表示所有的MemStore占用超过heap的35%时,会选择一些占用内存比较大的MemStore阻塞写操作并进行flush,这是为了降低阻塞全部写操作flush带来的问题。 4、当HLog达到最大值(hbase.regionserver.maxlogs * hbase.regionserver.hlog.blocksize 默认32*64M = 2G)时,也会触发MemStore的刷新,强制将更新固化到HFile中,避免在RegionServer crash时恢复时间过长。 5、定期会进行MemStore的刷新,hbase.regionserver.optionalcacheflushinterval 默认3600000,一小时,确保MemStore的数据不会长时间没有固化到HFile中。为避免所有的MemStore在同一时间都进行flush导致的问题,定期的flush操作有20000左右的随机延时。 6、手工可以进行flush操作,在hbase shell调用flush,可以针对某个表或者某个region进行flush:hbase(main):010:0> help 'flush'Flush all regions in passed table or pass a region row toflush an individual region. For example: hbase> flush 'TABLENAME' hbase> flush 'REGIONNAME' 7、手工flush:在API中只看到有setMemStoreFlushSize 指定memstore flush到HDFS上的文件大小,默认是64M,不确定是否可以直接触发flush MemStore。
如果再次出现这种情况,需要检查当前region的memstore大小,来确认这个问题。
阅读全文
0 0
- HBase flush issue
- HBase flush
- [HBase]Flush
- HBase Table Enabling issue
- HBase Memstore Flush
- hbase flush 数据
- HBase Flush 解析
- HBase之MemStore flush流程
- HBase 0.1.0 Flush流程源码分析
- HBase – Memstore Flush深度解析
- HBase中MemStore flush的源码解析
- issue
- issue
- issue
- flush ()
- flush( )
- flush
- flush()
- selenium web 自动化环境搭建(Windows7 环境, Chrome, Python)
- java:14-类型转换与接口
- 注解(Annotation)那点事
- LeetCode | 41. First Missing Positive
- Spring MVC整合beetl之后添加国际化
- HBase flush issue
- java类的内存分配
- 网页铺满全屏,不需滚动条的设置方法
- SQLite 数据库简介
- mysql中去重 distinct用法
- Ubuntu 16.04 LTS 为Chrome安装Flash插件
- nodejs--promise之Q模块
- 邮箱开发的初体验
- 【漏洞公告】CVE-2017-8464 :Microsoft Windows LNK 远程代码执行漏洞