具体情况是,甲方有10个节点的HBase集群,主要业务表共10张,region总数达23000+,平均每台RegionServer(RS)的region数量2300左右,每台RS堆内存配置96G(初始配置32G,节点内存256G)。在业务正常运行几个月后,所有RS突然宕机。

问题分析

因为集群region数量太多了,导致每个region的memstore空间缩小,memstore不断执行flush操作,也可理解为节点所有region的memstore总大小不断达到global memstore大小,所以不断触发flush机制。

因此,在实时数据高频写入时,频繁的flush会产生了很多hfile文件,从宕机前日志看到memstore不到10M就会flush一次,hfile文件过多导致minor compaction持续进行。不断的flush与compaction给HDFS造成了很大压力,导致DataNode负载过高,最终RegionServer写HDFS异常,RegionServer全部宕机。

相关日志

RegionServer宕机日志:

2018-12-19 07:59:50,174 WARN org.apache.hadoop.hdfs.DFSClient: DataStreamer Exception
java.io.IOException: Unable to create new block.at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1633)at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:772)
2018-12-19 07:59:50,174 WARN org.apache.hadoop.hdfs.DFSClient: Could not get block locations. Source file "/hbase/data/db1/xxx_position/d9fa4a857e668b63db02a5e3340354de/recovered.edits/0000000000023724243.temp" - Aborting...
2018-12-19 07:59:50,175 WARN org.apache.hadoop.hdfs.DFSClient: Excluding datanode DatanodeInfoWithStorage[172.xx.xx.xx:50010,DS-bae224ff-1680-4969-afd1-1eeae878783b,DISK]
2018-12-19 07:59:50,177 INFO org.apache.hadoop.hdfs.DFSClient: Exception in createBlockOutputStream
java.io.IOException: Bad connect ack with firstBadLink as 172.xx.xx.xx:50010at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1722)at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1620)at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:772)···2018-12-19 07:59:50,610 INFO org.apache.hadoop.hbase.wal.WALSplitter: 3 split writers finished; closing...
2018-12-19 07:59:50,613 INFO org.apache.hadoop.hdfs.DFSClient: Exception in createBlockOutputStream
java.io.EOFException: Premature EOF: no length prefix availableat org.apache.hadoop.hdfs.protocolPB.PBHelper.vintPrefixed(PBHelper.java:2272)at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1701)at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1620)at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:772)

DataNode日志:

2018-12-19 08:16:07,582 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: PacketResponder: BP-1452924002-172.16.10.18-1527602017139:blk_1181831924_108091843, type=HAS_DOWNSTREAM_IN_PIPELINE
java.io.EOFException: Premature EOF: no length prefix availableat org.apache.hadoop.hdfs.protocolPB.PBHelper.vintPrefixed(PBHelper.java:2272)at org.apache.hadoop.hdfs.protocol.datatransfer.PipelineAck.readFields(PipelineAck.java:235)at org.apache.hadoop.hdfs.server.datanode.BlockReceiver$PacketResponder.run(BlockReceiver.java:1286)at java.lang.Thread.run(Thread.java:748)
2018-12-19 08:16:07,582 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Exception for BP-1452924002-172.16.10.18-1527602017139:blk_1181831924_108091843
java.io.IOException: Premature EOF from inputStreamat org.apache.hadoop.io.IOUtils.readFully(IOUtils.java:201)at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.doReadFully(PacketReceiver.java:213)at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.doRead(PacketReceiver.java:134)at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.receiveNextPacket(PacketReceiver.java:109)at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receivePacket(BlockReceiver.java:500)at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receiveBlock(BlockReceiver.java:896)at org.apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.java:808)at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opWriteBlock(Receiver.java:169)at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:106)at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:246)at java.lang.Thread.run(Thread.java:748)
2018-12-19 08:16:07,582 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: IOException in BlockReceiver.run():
java.io.IOException: Broken pipeat sun.nio.ch.FileDispatcherImpl.write0(Native Method)at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)at sun.nio.ch.IOUtil.write(IOUtil.java:65)at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)at org.apache.hadoop.net.SocketOutputStream$Writer.performIO(SocketOutputStream.java:63)at org.apache.hadoop.net.SocketIOWithTimeout.doIO(SocketIOWithTimeout.java:142)at org.apache.hadoop.net.SocketOutputStream.write(SocketOutputStream.java:159)at org.apache.hadoop.net.SocketOutputStream.write(SocketOutputStream.java:117)at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)at java.io.DataOutputStream.flush(DataOutputStream.java:123)at org.apache.hadoop.hdfs.server.datanode.BlockReceiver$PacketResponder.sendAckUpstreamUnprotected(BlockReceiver.java:1533)at org.apache.hadoop.hdfs.server.datanode.BlockReceiver$PacketResponder.sendAckUpstream(BlockReceiver.java:1470)at org.apache.hadoop.hdfs.server.datanode.BlockReceiver$PacketResponder.run(BlockReceiver.java:1383)at java.lang.Thread.run(Thread.java:748)···2018-12-19 22:08:15,622 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: hadoop-data-10.cloud:50010:DataXceiverServer:
java.io.IOException: Xceiver count 4097 exceeds the limit of concurrent xcievers: 4096at org.apache.hadoop.hdfs.server.datanode.DataXceiverServer.run(DataXceiverServer.java:149)at java.lang.Thread.run(Thread.java:748)
2018-12-19 22:08:15,622 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: hadoop-data-10.cloud:50010:DataXceiverServer:
java.io.IOException: Xceiver count 4098 exceeds the limit of concurrent xcievers: 4096at org.apache.hadoop.hdfs.server.datanode.DataXceiverServer.run(DataXceiverServer.java:149)at java.lang.Thread.run(Thread.java:748) 

处理过程

将DataNode最大传输线程数dfs.datanode.max.transfer.threads从默认4096调整到32768,经过一段时间hdfs缓慢恢复。由于hdfs数据块过多,所以导致hdfs恢复耗时比较久。

然后,重启HBase,又遇到主Master一直启动失败。查看Master日志:

2018-12-21 13:11:51,629 ERROR org.apache.hadoop.hbase.master.HMaster: Master failed to complete initialization after 900000ms. Please consider submitting a bug report including a thread dump of this process.
2018-12-21 16:15:20,459 FATAL org.apache.hadoop.hbase.master.HMaster Failed to become active master
java.io.IOException: Timedout 300000ms waiting for namespace table to be assignedat org.apache.hadoop.hbase.master.TableNamespaceManager.start(TableNamespaceManager.java:106)at org.apache.hadoop.hbase.master.HMaster.initNamespace(HMaster.java:1057)at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:844)at org.apache.hadoop.hbase.master.HMaster.access$500(HMaster.java:194)at org.apache.hadoop.hbase.master.HMaster$1.run(HMaster.java:1834)at java.lang.Thread.run(Thread.java:748)
2018-12-21 16:15:20,472 FATAL org.apache.hadoop.hbase.master.HMaster Master server abort: loaded coprocessors are: []
2018-12-21 16:15:20,472 FATAL org.apache.hadoop.hbase.master.HMaster Unhandled exception. Starting shutdown.
java.io.IOException: Timedout 300000ms waiting for namespace table to be assignedat org.apache.hadoop.hbase.master.TableNamespaceManager.start(TableNamespaceManager.java:106)at org.apache.hadoop.hbase.master.HMaster.initNamespace(HMaster.java:1057)at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:844)at org.apache.hadoop.hbase.master.HMaster.access$500(HMaster.java:194)at org.apache.hadoop.hbase.master.HMaster$1.run(HMaster.java:1834)at java.lang.Thread.run(Thread.java:748) 

分析Master一直启动失败的原因是region太多导致HMaster初始化超时(默认900000,15分钟);加上HMaster初始化时并不会优先加载hbase:namespace表,默认5分钟如果加载不到namespace表就会超时,同样会造成HMaster初始化失败。

随后参考HBase源码,调整了初始化超时时间等参数,最终启动成功,以下是具体调整参数

<!-- namespace系统表assign超时时间,默认300000,因为region太多这里设置1天保证初始化成功 -->
<name>hbase.master.namespace.init.timeout</name>
<value>86400000</value><!-- master初始化超时时间,默认900000,因为region太多这里设置1天保证初始化成功 -->
<name>hbase.master.initializationmonitor.timeout</name>
<value>86400000</value><!-- bulk assign region超时时间,默认300000,设置1小时充分保证每个bulk assign都能成功 -->
<name>hbase.bulk.assignment.waiton.empty.rit</name>
<value>3600000</value><!-- bulk assign每个region打开的时间,默认1000,这里也尽量设置大些比如30s -->
<name>hbase.bulk.assignment.perregion.open.time</name>
<value>30000</value>

总结

本次HBase RS宕机是因为Unable to create new block即创建不了数据块,分析下来是集群规模太小,region数量过多,实时数据高频写入不断flush与compaction,造成HDFS上小文件过多,DataNode创建文件失败,从而导致RegionServer整体宕机。

处理过程中又遇到HMaster初始化超时、namespace表加载超时,调整默认启动参数后才正常启动。此次事故也让我们明白了小集群过载时会带来什么风险。

一次region过多导致HBase服务宕机事件相关推荐

  1. Elasticsearch】es 模糊查询导致Elasticsearch服务宕机

    本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 可以加我问问题,免费解答,有问题可以先私聊我,本人每天都在线,会帮助需要的人. 但是本博主因为某些原因, ...

  2. linux内存不足宕机,记一次linux机器内存占用太多导致的服务宕机

    背景 最近我们测试环境部署的一个项目总是不停的宕机,之前也有过,但是最近特别频繁 猜测 可能是因为cup或者内存占用太大导致的服务宕机 执行 1.登录linux服务器 2.top命令 下面是对每一行信 ...

  3. close_wait过多服务器无响应,记一次大量CLOSE_WAIT连接导致的服务宕机

    最近线上服务出现了一段时间的无法响应,在此总结一下问题的排查过程. 监控信息 监控显示CPU和内存没有异常波动,TCP连接中有大量的CLOSE_WAIT状态的连接. 看一下TCP连接断开的过程: 也就 ...

  4. 【甘道夫】HBase随机宕机事件处理 JVM GC回顾

    一.引言 本文记录了困扰团队两周的HBase随机宕机事件的解决方案,并回顾了JVM GC调优基础知识,供各位参考. 欢迎转载,请注明出处: http://blog.csdn.net/u01096738 ...

  5. 云宕机事件盘点:IBM云服务全球宕机四小时,安全稳定成空话?

    随着越来越多的企业及应用将它们的数据搬运至云端,即便只是云服务上的一个小小宕机事件,都可能引发一场大灾难. 6月10日,IBM云计算发生了长达四个小时的中断故障,导致多项托管于平台上的互联网服务中断, ...

  6. 记-ItextPDF+freemaker 生成PDF文件---导致服务宕机

    摘要:已经上线的项目,出现服务挂掉的情况. 介绍:该服务是专门做打印的,业务需求是生成PDF文件进行页面预览,主要是使用ItextPDF+freemaker技术生成一系列PDF文件,其中生成流程有:解 ...

  7. neutron服务宕机导致nova无法创建云主机

    情况:服务器重启后,创建云主机失败·,查看日志,我们发现是neutron导致nova创建云主机失败,我们查看neutron服务状态,发现neutron中的openvswitch和metadate服务宕 ...

  8. 纪实:嵌入式Elasticsearch服务因为gc无法释放内存,导致宕机事件

    场景描述 我们电商服务中使用了Elasticsearch嵌入式服务,然后再一次错误代码提交后,导致elasticsearch服务检索了大量数据使得内存无法释放,最后服务发生stop-the-world ...

  9. HBase RegionServer宕机恢复

    问题导读: 1.HBase的故障恢复有哪三种不同模式? 2.HBase日志切分方法? 3.Distributed Log Replay解决了哪些问题? HBase采用类LSM的架构体系,数据写入并没有 ...

最新文章

  1. mysql主从复制监控shell脚本
  2. android发短信乱码,android 音乐信息乱码处理
  3. python【力扣LeetCode算法题库】5- 最长回文子串
  4. xss Payload
  5. QDoc建立连结creatinglinks
  6. 用Cucumber JVM编写BDD测试
  7. 下一代智能数据工厂,阿里云发布全新DataWorks
  8. 家人重病什么心情都没了
  9. js中的行为委托和无类编程
  10. 【AD18】原理图生成PDF
  11. matlab矩阵论文,回归函数论文,关于基于Matlab矩阵运算的多元回归函数编程相关参考文献资料-免费论文范文...
  12. hutool对称加密
  13. 【Java小项目实训】编写一个窗体程序显示的日历 万年历
  14. 360浏览器Linux版内核,360浏览器推出Linux版下载,主要特性解说
  15. 计算机网络(2.11)物理层- 宽带接入技术-光纤同轴混合网 (HFC网)
  16. python352的值为_Python3高级基础(2)
  17. 安装Ubuntu虚拟机
  18. 利用代码实现山脊线、山谷线的提取(arcpy版)
  19. STM32芯片ADC内部的CH17参考电压的用途
  20. 清除input numer 点击样式

热门文章

  1. [计蒜客][dfs]中国象棋
  2. 【轻量化网络系列(2)】MobileNetV2论文超详细解读(翻译 +学习笔记+代码实现)
  3. Flutter Table 表格
  4. 区块链技术能解决贫富差距两极分化问题吗?
  5. pdf带勾的方框的显示
  6. 分段函数或含绝对值符号型自由项非齐次线性微分方程求解思路
  7. 2022水利水电安全员考试单选题库预测分享
  8. 实验室防腐蚀存放柜颜色
  9. 快速乘的不同实现方式
  10. 1.Electron-封装地图瓦片下载小工具(MapDownload) [配置开发环境]