基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

讲讲Yarn NodeManager(NM)的主要职责

知识点图片

在 Apache Hadoop YARN 架构中,NodeManager (NM) 是运行在每个计算节点(Worker Node)上的“代理”或“大管家”。如果说 ResourceManager (RM) 是整个集群的总指挥,那么 NodeManager 就是各个分舵的舵主,负责管理和执行具体节点上的工作。

NodeManager 的主要职责可以归纳为以下几个核心方面:

1. 容器(Container)生命周期管理

这是 NM 最基础也是最重要的工作。在 YARN 中,所有的任务都是在 Container 中运行的(Container 是 CPU、内存等资源的抽象)。

  • 资源本地化(Resource Localization): 在启动 Container 之前,NM 会负责将任务运行所需的依赖文件、JAR 包、字典文件等从 HDFS 下载到本地节点的缓存目录中。
  • 启动 Container: NM 接收来自 ApplicationMaster (AM) 的指令,配置好环境变量,启动对应的 Container 进程。
  • 监控与清理 Container: NM 会持续监控 Container 的运行状态。当任务完成或失败时,NM 负责安全地销毁 Container,并清理其在本地产生的临时文件,释放资源。

2. 节点资源监控与隔离

NM 必须确保节点上的 Container 不会“超发”或滥用资源,影响同一节点上的其他任务。

  • 资源隔离: 在 Linux 环境下,NM 通常依赖 Cgroups (Control Groups) 技术来实现 CPU 和内存等硬件资源的严格隔离。
  • 超额使用惩罚: NM 会实时监控每个 Container 的资源(主要是内存和 CPU)使用情况。如果某个 Container 实际使用的物理内存或虚拟内存超过了它申请的上限,NM 会无情地将其杀死(Kill),以保护节点上的其他服务。

3. 与 ResourceManager (RM) 保持心跳通信

NM 需要不断地向“总指挥”RM 汇报本地的情况,并接收指令。

  • 状态汇报: NM 会定期(默认每秒或几秒)向 RM 发送心跳包。心跳包中包含该节点的健康状况、当前节点上所有 Container 的运行状态(如哪些在跑、哪些完成了、哪些失败了)。
  • 接收指令: 通过心跳的返回,NM 会接收来自 RM 的指令,例如清理某些已经结束的应用所属的 Container。

4. 节点健康状况监控(Node Health Monitoring)

NM 不仅监控 Container,还要监控它所在的这台宿主机(物理机或虚拟机)的健康状态。

  • 磁盘检查: NM 会定期检查本地磁盘(如 YARN 的本地目录和日志目录)是否可用,如果坏盘率过高或磁盘空间不足,NM 会将该节点标记为不健康。
  • 健康脚本: 管理员可以配置自定义的“健康检查脚本”(Health Checker Script)。NM 会定期执行该脚本,如果脚本返回系统异常(如网络问题、硬件故障等),NM 会在心跳中告知 RM。
  • 隔离节点: 一旦 RM 得知某节点不健康,就不会再向该节点分配新的任务,直到它恢复正常。

5. 日志管理与聚合(Log Aggregation)

分布式系统中最头疼的问题之一就是查日志,NM 提供了一套机制来解决这个问题。

  • 本地日志管理: 任务运行期间,标准输出(stdout)和标准错误(stderr)日志都由 NM 保存在本地磁盘上。
  • 日志聚合: 当整个 Application 运行结束后,NM 可以(如果开启了日志聚合功能)将该节点上属于这个 Application 的所有 Container 日志统一收集起来,上传到 HDFS 上。这样,用户就可以通过 Web UI 或命令行集中查看历史日志,而不需要登录到每台机器上去找。

6. 提供辅助服务(Auxiliary Services)

YARN 是一个通用的资源调度平台,不仅能跑 MapReduce,还能跑 Spark、Flink 等。不同的计算框架可能需要节点提供一些特定的本地服务。

  • NM 允许配置“辅助服务”。最经典的例子就是 MapReduce 的 Shuffle 服务mapreduce_shuffle)。Map 任务结束后,Reduce 任务需要来拉取数据,这个提供数据拉取的 HTTP 服务就是作为 NM 的一个附属组件长期运行在 NM 进程中的。Spark 也有类似的 External Shuffle Service 可以部署在 NM 上。

总结

简单来说,ResourceManager 是做宏观调度的,而 NodeManager 是做微观执行的。NodeManager 负责把 ResourceManager 分配下来的资源变成实实在在的进程(Container),管好它们的生老病死,盯紧它们的资源消耗,收好它们的日志,并随时向上面汇报这台机器还能不能继续干活。

00:00
00:00