• Hbase regionserver频繁突然挂掉的问题处理


    一、背景

    系统:linux centos7.4
    Hbase:2.1.0-cdh6.3.2 (CDH版本)

    二、现象

    1、应用方报错:

    Connection refused: hadoop05/ip:16020
    
    • 1

    2、查看cdh页面

    发现HBase的regionserver有4个节点,全部挂掉

    三、问题排查

    登录机器查看日志,发现两个明显错误和一个奇怪的情况:

    1、snapshot超时

    2022-11-08 17:50:22,005 INFO org.apache.hadoop.hbase.procedure.ProcedureMember: Received abort on procedure with no local subprocedure vtable.DATA_ZT.CABIN_FIND.1667736700479, ignoring it.
    org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable via timer-java.util.Timer@77c0afe2:org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable: org.apache.hadoop.hbase.errorhandling.TimeoutException: Timeout elapsed! Source:Timeout caused Foreign Exception Start:1667736605731, End:1667737205731, diff:600000, max:600000 ms
    	at org.apache.hadoop.hbase.errorhandling.ForeignException.deserialize(ForeignException.java:169)
    	at org.apache.hadoop.hbase.procedure.ZKProcedureMemberRpcs.abort(ZKProcedureMemberRpcs.java:336)
    	at org.apache.hadoop.hbase.procedure.ZKProcedureMemberRpcs.watchForAbortedProcedures(ZKProcedureMemberRpcs.java:145)
    	at org.apache.hadoop.hbase.procedure.ZKProcedureMemberRpcs.start(ZKProcedureMemberRpcs.java:360)
    	at org.apache.hadoop.hbase.regionserver.snapshot.RegionServerSnapshotManager.start(RegionServerSnapshotManager.java:125)
    	at org.apache.hadoop.hbase.procedure.RegionServerProcedureManagerHost.start(RegionServerProcedureManagerHost.java:54)
    	at org.apache.hadoop.hbase.regionserver.HRegionServer.run(HRegionServer.java:979)
    	at java.lang.Thread.run(Thread.java:748)
    Caused by: org.apache.hadoop.hbase.errorhandling.ForeignException$ProxyThrowable: org.apache.hadoop.hbase.errorhandling.TimeoutException: Timeout elapsed! Source:Timeout caused Foreign Exception Start:1667736605731, End:1667737205731, diff:600000, max:600000 ms
    	at org.apache.hadoop.hbase.errorhandling.TimeoutExceptionInjector$1.run(TimeoutExceptionInjector.java:69)
    	at java.util.TimerThread.mainLoop(Timer.java:555)
    	at java.util.TimerThread.run(Timer.java:505)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2、内存频繁超过高水位watermark

    2022-11-08 17:55:22,932 WARN org.apache.hadoop.hbase.regionserver.HeapMemoryManager: heapOccupancyPercent 0.95184726 is above heap occupancy alarm watermark (0.95)
    2022-11-08 17:55:24,141 INFO org.apache.hadoop.hbase.regionserver.HeapMemoryManager: heapOccupancyPercent 0.7269536 is now below the heap occupancy alarm watermark (0.95)
    
    • 1
    • 2

    3、奇怪的情况:没有正常关闭的日志

    每个节点的日志,都是突然停止的。查看进程,已经不在了。

    四、原因

    1、snapshot尚未找到原因

    2、内存频繁超过高水位

    结合没有正常关闭的日志,猜测可能是系统内存OOM导致的。
    意识查看当前进程,是否有非正常关闭的:

    [root@hadoop05 hbase]# jps
    31058 Jps
    14696 -- process information unavailable
    15243 DataNode
    13597 NodeManager
    12143 Kafka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    果真发现process information unavailable字样,代表此进程非正常关闭。
    再查看是否是hbase进程(这台机器上只有regionserver这一个hbase进程):

    [root@hadoop05 hbase]# find / -name 14696
    /tmp/hsperfdata_hbase/14696
    
    • 1
    • 2

    然后根据进程pid,查看系统日志,是否有oom-killer的情况:

    [root@hadoop05 hbase]# less /var/log/messges
    
    Nov  9 16:56:41 hadoop05 kernel: Out of memory: Kill process 14696 (java) score 166 or sacrifice child
    Nov  9 16:56:41 hadoop05 kernel: Killed process 14696 (java) total-vm:9259984kB, anon-rss:2694204kB, file-rss:0kB, shmem-rss:0kB
    Nov  9 16:56:41 hadoop05 kernel: ctcss-agentd invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
    Nov  9 16:56:41 hadoop05 kernel: ctcss-agentd cpuset=/ mems_allowed=0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果发现,regionserver果真被系统kill掉了

    五、解决

    1、查看资源情况

    发现机器只有16G的内存,上面部署了nodemnager、datanode,nodemanager根据任务运行情况,会占用1-16G内存(也不知道谁配置的,16G的机器,配置的nodemanager container可用最大内存yarn.scheduler.maximum-allocation-mb和yarn.nodemanager.resource.memory-mb都是60G,所以可能占满[当然还要考虑nodemanager所在机器的物理内存使用率超过高水位时候的停止服务问题,所以不会完全占满]),datanode占得不多,也需要分一些。剩余给regionserver的资源其实不多。

    2、查看regionserver内存情况

    regionserver的heapsize给的是2G,bucketcache是4G,memstore是128M

    经过查看机器上的region数量,发现4个regionserver承载了515个region,平均每个rs需要有128个region,这些region都需要至少1个memstore,每个memstore是128M,总共需要16G的内存才能满足这些regoin同时写入需求。而heapsize只给了2G,这也解释了,为什么总是报触及watermark的报错了。

    3、综上,得出结论

    这里的问题有两个:

    1)、yarn配置的资源过高

    这个导致yarn有任务跑的时候,会将机器资源占满,而根据系统oom-killer的策略,会将使用内存最高的进程杀掉。map和reduce的内存配置都是0,那么默认会给1g的容器大小。所以,regionserver大约会占2G的ram,可能会占用4-5G的虚拟内存,killer的评分很高,基本每次都被杀掉。

    这是主因。
    2)、每个rs的region很多

    平均每个rs有128个region,那么在普通情况下,2G的heap只能够给16个region的memstore提供内存,而这2G的内存,还要给其他功能使用。所以,经常会出现触及watermark的情况。

    4、解决

    1)、临时解决办法

    将yarn.scheduler.maximum-allocation-mb和yarn.nodemanager.resource.memory-mb设置为8G。避免给yarn分配的内存过多,发生oom-killer。

    2)、根本解决办法

    终极解决办法:巧妇难为无米之炊,该加资源加资源。
    资源充足的情况下,能规避90%的问题。

    六、反思与规避

    1、部署大数据集群的时候,应先了解清楚业务情况

    比如数据量;业务是以实时还是离线为主;业务流程是什么样;业务中间结果数据有多少;实时任务流使用的组件;离线任务流使用的组件等等。
    最关键的是要依据以上内容,评估各大数据组件的关键参数。

    2、集群依赖的主机资源必须充足

    在有些项目的生产环境上,客户对大数据组件使用的资源量有疑问:怎么会用那么多资源?
    这时候,直面客户的技术人员一定要讲清楚,争取到最大的资源。否则就会出现如上的问题,资源不足,徒增烦恼。

    好记性不如赖笔头。
    与君共勉。
    
    • 1
    • 2
  • 相关阅读:
    egg搭建直播间
    Python3常用其他API速查手册(持续更新ing...)
    03 树莓派QEMU模拟器介绍
    【opencv】传统图像识别:hog+svm行人识别实战
    2022 万向区块链秋季黑客马拉松全球报名开启!
    RestTemplate 用法详解
    img标签如何将<svg></svg>数据渲染出来
    [CISCN2019 华东南赛区]Web11
    软考-软件项目活动图详解
    简单易用,效果卓越的电子期刊制作网站
  • 原文地址:https://blog.csdn.net/love910809/article/details/127775061