今天在使用datax同步数据到hbase的时候,随着同步的数据越来越多,发现同步的速度越来越慢,且慢慢的出现同步数据为0的情况,以及regionserver间歇性挂掉,最后完全挂掉了。

首先说一下,使用的hbase是单节点的,自己用来测试的。没有做过多的配置。

hbase的表只设置了一个列族,列数不到30列。机器内存16G。

当数据写到500万之后,开始变慢。最后写到800万regionserver崩溃。

2020-05-25 10:31:53,453 INFO  [RpcServer.default.FPBQ.Fifo.handler=29,queue=2,port=16020] regionserver.HRegion: writing data to region trans014744559352592,1590373894580.120ac4998d1fe3f32ca7aa15b39cc231. with WAL disabled. Data may be lost in the event of a crash.2020-05-25 10:32:01,013 WARN  [MemStoreFlusher.1] regionserver.MemStoreFlusher: 120ac4998d1fe3f32ca7aa15b39cc231 has too many store files(17000 ms
2020-05-25 10:32:02,705 INFO  [JvmPauseMonitor] util.JvmPauseMonitor: Detected pause in JVM or host machine (eg GC): pause of approximately
GC pool 'ParNew' had collection(s): count=1 time=43ms2020-05-25 10:33:58,204 WARN  [regionserver/xxx:16020] compactions.CompactionProgress: totalCompactingKVs=10657607 less tha3712
2020-05-25 10:34:01,230 WARN  [regionserver/xxx:16020] compactions.CompactionProgress: totalCompactingKVs=10657607 less tha7289
2020-05-25 10:34:04,388 WARN  [regionserver/xxx:16020] compactions.CompactionProgress: totalCompactingKVs=10657607 less tha2330
2020-05-25 10:34:07,689 WARN  [regionserver/xxx:16020] compactions.CompactionProgress: totalCompactingKVs=10657607 less tha7035

看资料,说是flush,导致store file数量过多,来不及compact,进而导致写阻塞。。。

之前对这几个原理有一些模棱两可,现在整理一下。

flush刷写

如果一个region有n个列族,那么就对应有n个store,每个store都有一个memstore和若干个storefile(memstore每flush一次就生成一个storefile持久化到hdfs磁盘)。

默认情况下,memstore有三种触发flush的机制:

  1. 刷写的最小单元是region,一个region中如果某个memstore占用的内存达到刷写阙值hbase.hregion.memstore.flush.size(默认128M)时就会触发此region下所有memstore的刷写。
  2. 除此之外,当一个regionserver下所有的memstore占用的内存总和达到hbase.regionserver.global.memstore.upperLimit设定的值时,会触发当前regionserver下所有region的所有memstore刷写。刷写顺序按照各个region的MemStore的大小降序刷写的,就是先刷写memstore大的region。直到全局的memstore低于hbase.regionserver.global.memstore.lowerLimit时,结束刷写。
  3. 或者是当一个regionserver的预写日志WAL的数量达到hbase.regionserver.max.logs指定的值时,也会触发当前regionserver下所有region的所有memstore刷写。这种方式的刷写顺序是按照时间升序进行的,也就是memstore越老的region,先刷写,直到WAL数量小于hbase.regionserver.max.logs时结束刷写。

根据第一条flush机制可知,如果没有预分区,且只有一个列族的时候,所有的数据都会往一个memstore中写,导致memstore迅速增大,导致频繁flush。

compact合并

随着数据的不断增加,一个store下的storefile会越来越多。为了提高读性能,需要将众多的小storefile进行compact合并。但是compact是资源密集型的操作,可以在很多方面影响性能(可能提高性能,也可能降低性能)。

compact的触发条件也有多个,其中一个是当storefile数量至少达到3个时才可以进行一次小合并。

因此,在频繁flush时,必然对应频繁的compact。

当写请求非常多,导致不断生成HFile,但compact的速度远远跟不上HFile生成的速度,这样就会使HFile的数量会越来越多,导致读性能急剧下降。为了避免这种情况,在HFile的数量过多的时候会限制写请求的速度:在每次执行MemStore flush的操作前,如果HStore的HFile数超过hbase.hstore.blockingStoreFiles (默认7),则会阻塞flush操作hbase.hstore.blockingWaitTime时间,在这段时间内,如果compact操作使得HStore文件数下降到回这个值,则停止阻塞。另外阻塞超过时间后,也会恢复执行flush操作。这样做就可以有效地控制大量写请求的速度,但同时这也是影响写请求速度的主要原因之一。

参考:

https://blog.csdn.net/zyc88888/article/details/79666846

split切分

当一个region下的storefile达到一定阙值时,就会对此region进行split切分成两个region。

split是为了对region进行负载均衡到多个regionserver。

split的触发机制有多种,2.x版本采用的切分策略是SteppingSplitPolicy

SteppingSplitPolicy策略

当region的最大一个store达到一个阈值时触发split,不过这个阈值不是固定的,而是根据regionServer管理的同属一张表的region个数有关:

  1. region个数为1时,maxFilesize = flushSize * 2
  2. region个数为0或者大于100:maxFilesize的选取为hbase.hregion.max.filesize设置的值(默认10G)
  3. region个数在2~100之间:有一个initialSize,这个值由hbase.incresing.policy.initial.size配置;若没有配置这个值,则initialSize = 2 * MEMSTORE_FLUSHSIZE(table元数据);若table没有元数据或initialSize小于0,则initialSize = 2 * hbase.hregion.memstore.flush.size(默认128M)。拿到initialSize后,maxFilesize = min (initialSize * region个数的3次方, 10G)。

根据默认的split策略规则可以看到,如果没有设置预分区,那么一开始region的数量从1开始split,且会频繁split(因为maxFilesize = min (initialSize * region个数的3次方, 10G))。

具体可以看下面的第二个参考博客。

参考:

https://www.jianshu.com/p/53459997c814

https://www.cnblogs.com/cnblogs-syui/p/12566642.html

通过重新理解上面几个概念,可以大概知道,出现这个报错是因为持续往一个region写数据,导致频繁flush,频繁compact。而compact是比较重的操作,会写阻塞,同时compact是将待合并的hfile锁定后复制合并成一个新的hfile,然后删除旧的。所以这个过程会有大量的磁盘io,十分影响性能。

解决办法是预分区,避免大量的数据都在一个region下,导致compact的数据量过大,影响性能。

具体优化参数可以参考上述博客。

hbase regionserver挂掉报错has too many store files delaying flush up to 90000ms相关推荐

  1. dfs.datanode.max.xcievers参数导致hbase集群报错

    2013/08/09 转发自http://bkeep.blog.163.com/blog/static/123414290201272644422987/ [案例]dfs.datanode.max.x ...

  2. HBase Master启动报错java.io.IOException: error or interrupted while splitting logs

    今天在一个CDH环境中启动HBase时HBase Master启动发生异常,HBase Master采用的是两台HMaster做一个HA.从CDH管理界面查询启动成功后,HBase Master状态并 ...

  3. Windows IEDA 编译Hbase源码报错 - 无法执行shell脚本

    windows 下编译 hbase源码,报错 [ERROR] Command execution failed. java.io.IOException: Cannot run program &qu ...

  4. azkaban报错Error Chunking during uploading files to db

    页面报错: Error Chunking during uploading files to db... azkaban-web-server后台报错: azkaban.project.Project ...

  5. azkaban上传zip报错:Error Chunking during uploading files to db

    上传时页面报 Instalation Failed Error Chunking during uploading files to db 查看web-server日志: 2021/11/26 11: ...

  6. VS Code 调试JavaScript报错:“crbug1173575, non-JS module files deprecated”

    按照网上的方法(VSCODE 调试 Javascript)装好debugger for chrome扩展后,调试JavaScript,结果无法正常在浏览器中显示网页,报错:"crbug/11 ...

  7. Flutter的依赖报错-Could not resolve all files for configuration xxxx

    今天遇到一个很坑的问题,排查了许久,网上也找了资料都没解决,最后还是耐下心来分析Log和网上的解决思路才知道问题所在,最终只修改了一丢丢代码和配置即解决了上述问题 问题描述 运行一个之前OK的Flut ...

  8. flink taskmanager 挂掉 报错No pooled slot available and request to ResourceManager for new slot failed

    1.解决办法:调大taskmanager.memory.process.size 参数的数值. 2.导致此问题的原因: taskmanager.memory.process.size 数值太小  ta ...

  9. git报错:remote: warning: Large files detected.

    今天在用git上传文件的时候,一不小心多上传了个压缩包,130M,然后就出现问题了.. 一.码云上传文件的大小 来自码云的公告: 对于普通用户码云单个仓库限制为1G,单个文件限制100M.如果超过限制 ...

  10. go的http服务报错accept4: too many open files

    执行命令"netstat -ano |grep 8300"后发现有很多"tcp6     210      0 127.0.0.1:8300          127.0 ...

最新文章

  1. mysql单表多timestamp的current_timestamp设置问题
  2. .NET的资源并“.NET研究”不限于.resx文件,你可以采用任意存储形式 [上篇]
  3. java 自定义 转换器_Java笔记之SpringMVC(七):自定义String到Date的类型转换器
  4. 设计一款博弈类游戏的人机对战算法、策略_卡牌游戏八合一,华人团队开源强化学习研究平台RLCard...
  5. 网易邮箱大师如何屏蔽邮件 屏蔽垃圾邮件的方法步骤
  6. linux 修I改资源限制1024,Re:如何解决1024的限制???
  7. linux 建立伪目标过程,linux之Makefile 编写、规则、伪目标、变量
  8. 如何自学并且系统学习计算机网络?(知乎问答)
  9. WampServer安装教程
  10. 2021美赛MCM选题
  11. python怎么设置为中文-python怎么变成中文版
  12. nsis出错_cf nsis错误怎么办 nsis错误解决办法全解
  13. miRNA数据库篇——Rfam数据库
  14. LaMDA 不可能觉醒吗?
  15. 如何用excel实现并列排序
  16. MP2459被完美替代内部集成有功率MOSFET管FS2459的60V0.5A降压IC
  17. 一度智信:拼多多怎么投诉商家
  18. HTML5期末大作业:轮滑运动体育类人物介绍主题网站设计(12页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计
  19. linux系统教程_【笔记】windows10安装linux双系统教程(可能是现今最简单方法)...
  20. ebs oracle xml publisher 不是有效责任,EBS excel模板xml publisher开发详解

热门文章

  1. Delphi控件大全
  2. 树莓派摄像头远程拍照及传输
  3. Scrapy爬虫框架,入门案例(非常详细)
  4. 土方回填施工方案范本_外购土方回填施工方案
  5. 骗访问量的机房人物列传by xMinh
  6. Hive常用命令之MSCK REPAIR TABLE命令概述
  7. 操作系统的三个抽象概念
  8. Linux 内核通知链(notifier chain)原理和使用方法
  9. 云终端能改计算机,云终端旧机改造方案(把旧电脑改成瘦客户机)
  10. [渝粤教育] 西南科技大学 语言学概论(英语) 在线考试复习资料