前言
在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 {
//服务初始化&