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

作者 : 开心源码 本文共1329个字,预计阅读时间需要4分钟 发布时间: 2022-05-12 共195人阅读

整个写入流程从用户端调用API开始,数据会通过protobuf编码成一个请求,通过scoket实现的IPC板块被送达server的RPC队列中。

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

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

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

写入过快时,memstore的水位会马上被推高。

你可能会看到以下相似日志:

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

或者者这样的日志:

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

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

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

如何避免RS OOM?

一种是加快flush速度:

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

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

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

上述配置都需要人工干预,假如干预不及时server可能已经OOM了,这时候有没有更好的控制方法?

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

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 如何避免HBase写入过快引起的各种问题

发表回复