【Hadoop】超大规模集群大批量写操作引发Namenode性能瓶颈

时间:2024-11-16 08:40:33

前言:

本文章主要用于记录日常案例分析,记录因为业务的频繁写操作导致的Hadoop集群访问雪崩的故障,以用于总结问题定位方法(从事大数据开发工作以来,写了很多文章都存储在了个人记事本里了,心血来潮,梳理一下)

项目场景:

  • Hadoop版本:Apach hadoop 2.6.0
  • 集群规模:2+2000+节点
  • 数据规模:接近6万亿,存储达10PB

问题描述

突然一天,现场运维人员反馈,集群数据入库相较于以往了很多,数据严重积压Spark、Hive任务大面积失败,即使成功的任务,时间耗时上也长了很多,集群基本处于不可用的状态,影响极大。

原因分析:

提示:无论是hadoop、spark、hive还是其他组件,出现慢的问题,首先排除业务影响,另外要使用好jstack、jmap等性能分析工具,堆栈信息是最好的性能分析手段。

  1. 监控分析
    根据问题描述,首先要观察监控大屏的变化(监控视图未展示)
    Spark、Hive相关监控
    正常: Spark、Hive相关组件的TCP连接数、内存使用量等并未发现异常,且并未发现进程有FGC情况的发生,暂时排除组件本身的影响导致。
    ResouceManager、Datanode等监控
    正常:RM等相关监控正常
    异常:Datanode相关监控可以发现了蛛丝马迹,Block有明显的增减现象,但是还不能完全确定集群慢是不是该现象导致的。
    Namenode组件相关监控
    异常:DN、NN之间交互频率增高、NN的请求频率直线上升,其他指标也出现了莫名异常。
    总结:从监控层面看,集群慢是由于hadoop本身导致的,接下来重点排查NN、DN等

  2. 日志分析

    从namenode的打印日志来看,瓶颈在于namenode

  3. 堆栈分析
    在这里插入图片描述
    在这里插入图片描述
    从堆栈日志可以发现,在集群慢的周期内,出现了大量锁等待现象。通过监控数据结合堆栈信息可以看出,正是由于有大量的namenode rpc请求拥有该锁,迟迟不能释放,导致其他线程一直处于等待状态,进而导致大量线程堵塞。

  4. 源码跟踪

 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