如何避免HBase写入过快引起的各种问题
首先我们简单回顾下整个写入流程
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写入过快引起的各种问题相关推荐
- 【HBase从入门到精通系列】如何避免HBase写入过快引起的各种问题
摘要: 首先我们简单回顾下整个写入流程 client api ==> RPC ==> server IPC ==> RPC queue ==> RPC handler ==&g ...
- Hbase写入量大导致region过大无法split问题
最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题.让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region ...
- hbase原理与实践_JAVA连接HBase客户端及HBase写入数据和读取数据原理解析
JAVA连接HBase客户端 接着上篇文章进行代码的实践,从JAVA 客户端对 HBase的客户端进行一系列操作 工具类:HbaseUtil 静态代码块一次性创建连接对象 并赋值 返回连接对象 Con ...
- hbase写入一段时间后变的越来越慢
一.概况 集群环境如下表: 集群 机器 存储 内存 CPU 每日数据 HW大数据平台 160台 6PB 10TB 8000 10亿 数据存储在kafka中,130个分区 ...
- 7.1.5 智慧物流【车辆监控Structured Streaming、整合kafka、Redis、Mysql、HBASE 写入数据】
车辆监控 文章目录 车辆监控 第一节 Structured Streaming 1.1 Structured Streaming发展历史 1.1.1 Spark Streaming 1.1.2 Dat ...
- HBase写入性能分析及改造—multi-thread flush and compaction(约能提高两到三倍吞吐量,带压缩测试)
首先描述一下现象 最近对HDFS底层做了许多优化,包括硬件压缩卡,内存盘及SSD. 在出测试报告时发现老问题,HBase写入速度不稳定,这个大家都习以为常了吧,就是压测时,只要row size稍小一点 ...
- 冠字号查询系统中HBase写入数据性能测试
机器说明:4台centos虚拟机,每台分别配置2G内存 测试步骤: 为了方便测试,利用hbase shell新建表如下: create 'identify01', {NAME => 'op_ww ...
- Hbase1.2数据导入2.0
场景:现有一批之前导出的数据,发现2.0版本hbck工具更新,无法直接导入,跨机房使用export/import方式需要重新外网传输数据比较耗时,现搭建临时hbase版本1.2,在同机房进行expor ...
- 云栖专辑 | 阿里开发者们的第19个感悟:Simple is better.
2015年12月20日,云栖社区上线.2018年12月20日,云栖社区3岁. 阿里巴巴常说"晴天修屋顶". 在我们看来,寒冬中,最值得投资的是学习,是增厚的知识储备. 所以社区特别 ...
最新文章
- iOS - XML 数据解析
- MySQL修改和删除索引(DROP INDEX)
- hexo的yelee主题更换类别以及tags的字体颜色
- java继承的举例_java继承实例
- 模拟实现STL中map和set容器
- php 参数 只用一次,php中,用函数,如果有很多个参数,只使用最后一个参数,有什么优雅的写法?...
- Java 获取 URL响应头的日期信息
- 【算法分析与设计】实验 分治算法解决Gray码问题
- docker安装jira心得
- 解释如何优化css选择器_购物车解释了CSS选择器
- 12096 - The SetStack Computer
- win安装MinGW-w64
- java考前复习之数组
- 获取当前网页的绝对URL地址
- arts-week12
- (转载)图像处理(卷积)
- WebSSH2 界面ssh
- 字节二面、三面面经及内推
- 数据结构与算法-进阶(八)AOV 网
- 青龙魔改助力,突破45ck上限
热门文章
- String直接赋字符串和new String的区别
- java scala 混合编程_java与scala混合编程打包(maven构建)
- 不合法的媒体文件 id_注意!伦敦男孩、DKNY、Coach、地素... 这些品牌的服装,抽检不合格...
- 再见 2020!Apache RocketMQ 发布 4.8.0,DLedger 模式全面提升!
- datatables 一行数据生成两行_一行代码搞定分组回归
- python中tushare数据可以导出嘛_Python与交易策略分析tushare/baostock库介绍(附代码)...
- 安卓ssr无网络连接_解决Android模拟器网络问题(使用了代理的情况下)
- python gridfs_python 将图片存入mongodb,读取图片,gridfs模块
- android 字符串相似度对比,Android中的OpenCV图像比较和相似度
- java ftp 下载慢_Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题