一.准备环境
CDH-5.12 (HBase1.2)
Phoenix 4.10
Spark 2.1.1
二.实时数据同步架构(DSHS JOB)
MySQL-->Maxwell-->Kafka-->Spark Streaming+Phoenix-->HBase
三.异常现象
RegionServer节点挂了,发送微信警告信息,登录Cloudera Manager查看发现有6个节点挂了。那么第一步应该就是尝试重启这6个RegionServer节点,发现只恢复5个节点;但是还有1个RegionServer节点(hadoop50机器)无法启动,这时查看RegionServer日志:
tail -200f /var/log/hbase/xxxxx.log
异常就是,60020端口被占用,无法启动RS进程。
四.排查分析
a. 查看端口是否被进程占用, 是假死进程
netstat -nlp|grep 60020
执行此命令发现没有进程!那就等待一会再执行看看,依然是没有进程。假如有进程直接kill -9 pid即可。
b.群里咨询HBase小伙伴们,大家各抒己见
有人说是时间不同步,之前遇见过50010端口这种问题;
.........
c.使用lsof -i:60020命令查看
发现进程:
都是yarn用户的进程;
hadoop50的端口号对接其他机器的60020端口,郁闷一阵子;
但是ps -ef|grep hbase确实没有RegionServer进程在Running。
五.解决方案
通过分析发现是yarn用户进程,那么ps查看发现是Container容器的Job;
这时应该知道是实时同步的DSHS JOB(Spark Streaming通过Phoenix向HBase写数据)引起的,导致hadoop50机器的RegionServer无法启动,报60020端口占用错误;
手动kill job,由于是Spark Streaming Job是设定参数
spark.streaming.stopGracefullyOnShutdown 能够优雅关闭Job;加上offset是自我维护,所以能够保障断批还原,数据0丢失;
启动hadoop50机器的RegionServer服务,发现立即启动成功;
启动DSHS JOB恢复实时同步Job。
备注: 至于为什么RegionServer挂了,这里就不多叙述,其实就是Compaction问题。
以上是本人解决问题的思路,如有不当欢迎留言交流。