首先我们简单回顾下整个写入流程

client api ==> RPC ==>  server IPC ==> RPC queue ==> RPC handler ==> write WAL ==> write memstore ==> flush to  filesystem

整个写入流程从客户端调用API开始,数据会通过protobuf编码成一个请求,通过scoket实现的IPC模块被送达server的RPC队列中。最后由负责处理RPC的handler取出请求完成写入操作。写入会先写WAL文件,然后再写一份到内存中,也就是memstore模块,当满足条件时,memstore才会被flush到底层文件系统,形成HFile。


当写入过快时会遇见什么问题?

写入过快时,memstore的水位会马上被推高。
你可能会看到以下类似日志:

RegionTooBusyException: Above memstore limit, regionName=xxxxx ...

这个是Region的memstore占用内存大小超过正常的4倍,这时候会抛异常,写入请求会被拒绝,客户端开始重试请求。当达到128M的时候会触发flush memstore,当达到128M * 4还没法触发flush时候会抛异常来拒绝写入。两个相关参数的默认值如下:

hbase.hregion.memstore.flush.size=128M
hbase.hregion.memstore.block.multiplier=4

或者这样的日志:

regionserver.MemStoreFlusher: Blocking updates on hbase.example.host.com,16020,1522286703886: the global memstore size 1.3 G is >= than blocking 1.3 G size regionserver.MemStoreFlusher: Memstore is above high water mark and block 528ms

这是所有region的memstore内存总和开销超过配置上限,默认是配置heap的40%,这会导致写入被阻塞。目的是等待flush的线程把内存里的数据flush下去,否则继续允许写入memestore会把内存写爆

hbase.regionserver.global.memstore.upperLimit=0.4  # 较旧版本,新版本兼容
hbase.regionserver.global.memstore.size=0.4 # 新版本 

当写入被阻塞,队列会开始积压,如果运气不好最后会导致OOM,你可能会发现JVM由于OOM crash或者看到如下类似日志:

ipc.RpcServer: /192.168.x.x:16020 is unable to read call parameter from client 10.47.x.x
java.lang.OutOfMemoryError: Java heap space

HBase这里我认为有个很不好的设计,捕获了OOM异常却没有终止进程。这时候进程可能已经没法正常运行下去了,你还会在日志里发现很多其它线程也抛OOM异常。比如stop可能根本stop不了,RS可能会处于一种僵死状态。


如何避免RS OOM?

一种是加快flush速度:

hbase.hstore.blockingWaitTime = 90000 ms
hbase.hstore.flusher.count = 2
hbase.hstore.blockingStoreFiles = 10

当达到hbase.hstore.blockingStoreFiles配置上限时,会导致flush阻塞等到compaction工作完成。阻塞时间是hbase.hstore.blockingWaitTime,可以改小这个时间。hbase.hstore.flusher.count可以根据机器型号去配置,可惜这个数量不会根据写压力去动态调整,配多了,非导入数据多场景也没用,改配置还得重启。

同样的道理,如果flush加快,意味这compaction也要跟上,不然文件会越来越多,这样scan性能会下降,开销也会增大。

hbase.regionserver.thread.compaction.small = 1
hbase.regionserver.thread.compaction.large = 1

增加compaction线程会增加CPU和带宽开销,可能会影响正常的请求。如果不是导入数据,一般而言是够了。好在这个配置在云HBase内是可以动态调整的,不需要重启。

上述配置都需要人工干预,如果干预不及时server可能已经OOM了,这时候有没有更好的控制方法?
hbase.ipc.server.max.callqueue.size = 1024 * 1024 * 1024 # 1G

直接限制队列堆积的大小。当堆积到一定程度后,事实上后面的请求等不到server端处理完,可能客户端先超时了。并且一直堆积下去会导致OOM,1G的默认配置需要相对大内存的型号。当达到queue上限,客户端会收到CallQueueTooBigException 然后自动重试。通过这个可以防止写入过快时候把server端写爆,有一定反压作用。线上使用这个在一些小型号稳定性控制上效果不错。

阅读原文

转载于:https://www.cnblogs.com/jewel0516/p/8779814.html

如何避免HBase写入过快引起的各种问题相关推荐

  1. 【HBase从入门到精通系列】如何避免HBase写入过快引起的各种问题

    摘要: 首先我们简单回顾下整个写入流程 client api ==> RPC ==> server IPC ==> RPC queue ==> RPC handler ==&g ...

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

    最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题.让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region ...

  3. hbase原理与实践_JAVA连接HBase客户端及HBase写入数据和读取数据原理解析

    JAVA连接HBase客户端 接着上篇文章进行代码的实践,从JAVA 客户端对 HBase的客户端进行一系列操作 工具类:HbaseUtil 静态代码块一次性创建连接对象 并赋值 返回连接对象 Con ...

  4. hbase写入一段时间后变的越来越慢

    一.概况 集群环境如下表: 集群 机器 存储 内存 CPU 每日数据         HW大数据平台 160台 6PB 10TB 8000 10亿         数据存储在kafka中,130个分区 ...

  5. 7.1.5 智慧物流【车辆监控Structured Streaming、整合kafka、Redis、Mysql、HBASE 写入数据】

    车辆监控 文章目录 车辆监控 第一节 Structured Streaming 1.1 Structured Streaming发展历史 1.1.1 Spark Streaming 1.1.2 Dat ...

  6. HBase写入性能分析及改造—multi-thread flush and compaction(约能提高两到三倍吞吐量,带压缩测试)

    首先描述一下现象 最近对HDFS底层做了许多优化,包括硬件压缩卡,内存盘及SSD. 在出测试报告时发现老问题,HBase写入速度不稳定,这个大家都习以为常了吧,就是压测时,只要row size稍小一点 ...

  7. 冠字号查询系统中HBase写入数据性能测试

    机器说明:4台centos虚拟机,每台分别配置2G内存 测试步骤: 为了方便测试,利用hbase shell新建表如下: create 'identify01', {NAME => 'op_ww ...

  8. Hbase1.2数据导入2.0

    场景:现有一批之前导出的数据,发现2.0版本hbck工具更新,无法直接导入,跨机房使用export/import方式需要重新外网传输数据比较耗时,现搭建临时hbase版本1.2,在同机房进行expor ...

  9. 云栖专辑 | 阿里开发者们的第19个感悟:Simple is better.

    2015年12月20日,云栖社区上线.2018年12月20日,云栖社区3岁. 阿里巴巴常说"晴天修屋顶". 在我们看来,寒冬中,最值得投资的是学习,是增厚的知识储备. 所以社区特别 ...

最新文章

  1. iOS - XML 数据解析
  2. MySQL修改和删除索引(DROP INDEX)
  3. hexo的yelee主题更换类别以及tags的字体颜色
  4. java继承的举例_java继承实例
  5. 模拟实现STL中map和set容器
  6. php 参数 只用一次,php中,用函数,如果有很多个参数,只使用最后一个参数,有什么优雅的写法?...
  7. Java 获取 URL响应头的日期信息
  8. 【算法分析与设计】实验 分治算法解决Gray码问题
  9. docker安装jira心得
  10. 解释如何优化css选择器_购物车解释了CSS选择器
  11. 12096 - The SetStack Computer
  12. win安装MinGW-w64
  13. java考前复习之数组
  14. 获取当前网页的绝对URL地址
  15. arts-week12
  16. (转载)图像处理(卷积)
  17. WebSSH2 界面ssh
  18. 字节二面、三面面经及内推
  19. 数据结构与算法-进阶(八)AOV 网
  20. 青龙魔改助力,突破45ck上限

热门文章

  1. String直接赋字符串和new String的区别
  2. java scala 混合编程_java与scala混合编程打包(maven构建)
  3. 不合法的媒体文件 id_注意!伦敦男孩、DKNY、Coach、地素... 这些品牌的服装,抽检不合格...
  4. 再见 2020!Apache RocketMQ 发布 4.8.0,DLedger 模式全面提升!
  5. datatables 一行数据生成两行_一行代码搞定分组回归
  6. python中tushare数据可以导出嘛_Python与交易策略分析tushare/baostock库介绍(附代码)...
  7. 安卓ssr无网络连接_解决Android模拟器网络问题(使用了代理的情况下)
  8. python gridfs_python 将图片存入mongodb,读取图片,gridfs模块
  9. android 字符串相似度对比,Android中的OpenCV图像比较和相似度
  10. java ftp 下载慢_Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题