前言:
本文章主要用于记录日常案例分析
,记录因为业务的频繁写操作导致的Hadoop集群访问雪崩的故障,以用于总结问题定位方法(从事大数据开发工作以来,写了很多文章都存储在了个人记事本里了,心血来潮,梳理一下)
项目场景:
- Hadoop版本:Apach hadoop 2.6.0
- 集群规模:2+2000+节点
- 数据规模:接近6万亿,存储达10PB
问题描述
突然一天,现场运维人员反馈,集群数据入库相较于以往慢
了很多,数据严重积压
,Spark、Hive任务大面积失败,即使成功的任务,时间耗时上也长了很多,集群基本处于不可用的状态,影响极大。
原因分析:
提示:无论是hadoop、spark、hive还是其他组件,出现慢的问题,首先排除业务影响,另外要使用好
jstack、jmap
等性能分析工具,堆栈信息
是最好的性能分析手段。
-
监控分析
根据问题描述,首先要观察监控大屏
的变化(监控视图未展示)
Spark、Hive相关监控正常:
Spark、Hive相关组件的TCP连接数、内存使用量等并未发现异常,且并未发现进程有FGC
情况的发生,暂时排除组件本身的影响导致。
ResouceManager、Datanode等监控正常:
RM等相关监控正常异常:
Datanode相关监控可以发现了蛛丝马迹,Block
有明显的增减现象,但是还不能完全确定集群慢是不是该现象导致的。
Namenode组件相关监控异常:
DN、NN之间交互频率增高、NN的请求频率直线上升,其他指标也出现了莫名异常。总结:
从监控层面看,集群慢是由于hadoop本身导致的,接下来重点排查NN、DN等 -
日志分析
从namenode的打印日志来看,瓶颈在于namenode
-
堆栈分析
从堆栈日志可以发现,在集群慢的周期内,出现了大量锁等待现象。通过监控数据结合堆栈信息可以看出,正是由于有大量的namenode rpc请求拥有该锁,迟迟不能释放,导致其他线程一直处于等待状态,进而导致大量线程堵塞。 -
源码跟踪
ContentSummary getContentSummary(final String src) throws IOException {
checkOperation(OperationCategory.READ);
final String operationName = "contentSummary";
boolean success = true;
ContentSummary cs;
final FSPermissionChecker pc = getPermissionChecker();
readLock();
try {
checkOperation(OperationCategory.READ);
cs = FSDirStatAndListingOp.getContentSummary(dir, pc, src);
} catch (AccessControlException ace) {
success = false;
logAuditEvent(success, operationName, src);
throw ace;
} finally {
readUnlock(operationName);
}
logAuditEvent(success, operationName, src);
return cs;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
从代码层面也证实了HDFS NameNode内部的单一锁
设计,每个请求需要拿到这个锁,然后让NN
去处理这个请求,这里面就包含了很激烈的锁竞争
。因此一旦说NN的这个锁被一个大的写操作(比如大目录的删除)持有很长时间的话,其它用户的任务将会马上受到影响。备注
:关于Namenode单一锁机制,笔者会在下一章节单独梳理。
解决方案:
解决燃眉之急:
该问题的触发就是由于业务大量删除文件导致,因此建议业务优先停止该操作。官方Patch注入:
结合官方的HDFS-7980、HDFS-7213等patch,打补丁包,测试验证后,问题得以解决,集群也不卡了,非常流畅(这也说明这就是hadoop2.6版本的bug)。参数优化:
参数列表 | 解释 |
---|---|
Datanode会定期将当前该结点上所有的BLOCK信息报告给NameNode,该参数就是控制这个报告时间间隔,可以调大 | |
NN周期性计算DN的副本情况的频率,可以调大 | |
减少扫描节点数量 | |
DN的心跳间隔,秒 |
其他参数可以参考 /peizhe123/p/
问题思考:
Namenode的单一锁机制显得尤为“重”,后面会单独拿出一个模块梳理该部分,非常重要!另外离线集群所有组件目前也进行了全面升级,集群性能提升了35%左右。
- Hadoop:3.2.3
- Spark:3.2.1
- Hive:3.1.3