Yarn源码剖析(一) --- RM与NM服务启动以及心跳通信

本文深入分析了Yarn中ResourceManager(RM)和NodeManager(NM)的启动过程,以及两者间的心跳通信。RM通过AbstractService的init()和start()方法启动并初始化各个子服务,NM的启动则包括NodeStatusUpdaterImpl的初始化和启动,通过RPC调用ResourceTracker的接口完成注册和心跳。NM的心跳线程不断报告节点状态,保持与RM的通信。
摘要由CSDN通过智能技术生成

前言

Yarn源码剖析(零) --- spark任务提交到yarn的流程中介绍了Yarn任务提交的流程,按照此篇的阅读指导,该篇文章将会介绍Yarn中ResourceManager、NodeManager的启动,以及两者之间的心跳通信。

Yarn的启动

1. 对于任务的yarn服务的启动当然要从它的启动脚本start-yarn.sh中进行分析,可以看到分别执行了yarn-daemon.sh、yarn-daemons.sh

 # start resourceManager
 "$bin"/yarn-daemon.sh --config $YARN_CONF_DIR start resourcemanager
 # start nodeManager
 "$bin"/yarn-daemons.sh --config $YARN_CONF_DIR start nodemanager

2. 仔细阅读脚本(本文就不对脚本的细节部分做过多的讲解了),不难找到在脚本中有这么一句话,可知实际上执行的是bin目录下yarn这一个文件

nohup nice -n $YARN_NICENESS "$HADOOP_YARN_HOME"/bin/yarn --config $YARN_CONF_DIR $command "$@" > "$log" 2>&1 < /dev/null &

3. 打开这个文件,去找传进去的resourcemanager参数和nodemanager参数对应的执行类,能够清楚的观察到分别执行了NodeManager和ResourceManager

 elif [ "$COMMAND" = "nodemanager" ] ; then
     CLASSPATH=${CLASSPATH}:$YARN_CONF_DIR/nm-config/log4j.properties
     CLASS='org.apache.hadoop.yarn.server.nodemanager.NodeManager'
     YARN_OPTS="$YARN_OPTS -server $YARN_NODEMANAGER_OPTS"
elif [ "$COMMAND" = "resourcemanager" ] ; then
     CLASSPATH=${CLASSPATH}:$YARN_CONF_DIR/rm-config/log4j.properties
     CLASS='org.apache.hadoop.yarn.server.resourcemanager.ResourceManager'
     YARN_OPTS="$YARN_OPTS $YARN_RESOURCEMANAGER_OPTS"

ResourceManager

那我们直接从ResourceManager(后文简称RM)的mian方法来分析RM的启动,main方法中很容易就能观察到两个重要的方法

//会实现本类中的serviceInit方法
resourceManager.init(conf);
resourceManager.start();

实际上此处是调用父类AbstractService的init()方法,再内部实现serviceInit方法,再有匹配的实现类来达到初始化的目的。AbstractService的init()方法非常重要,基本所有重要服务的初始化方法都是调用该方法实现的。
那我们就来看一下这个方法:

public void init(Configuration conf) {
    //服务配置是否为空
    if (conf == null) {
        throw new ServiceStateException("Cannot initialize service "
        + getName() + ": null configuration");
    }
    
    //服务是否已经初始化
    if (isInState(STATE.INITED)) {
        return;
    }
    synchronized (stateChangeLock) {
        /*相当于对服务做一次校验,确保服务初始化成功*/
        if (enterState(STATE.INITED) != STATE.INITED) {
            setConfig(conf);
            try {
                //服务初始化&
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值