Spark2.2.2源码解析: 2.启动master节点流程分析

本文主要说明在启动master节点的时候,代码的流程走向。

授予文件执行权限

chmod755 

两个目录里的文件:

/workspace/spark-2.2.2/bin  --所有文件

/workspace/spark-2.2.2/sbin

启动脚本:start-master.sh 脚本

最终执行的是:

"${SPARK_HOME}/sbin"/spark-daemon.sh start $CLASS 1 \
  --host $SPARK_MASTER_HOST --port $SPARK_MASTER_PORT --webui-port $SPARK_MASTER_WEBUI_PORT \
  $ORIGINAL_ARG

用echo 命令输出:

/spark-2.2.2/sbin/spark-daemon.sh start org.apache.spark.deploy.master.Master 1  --host bogon --port 7077 --webui-port 8080

发现调用了spark-daemon.sh脚本,并向里面传递参数

spark-daemon.sh start org.apache.spark.deploy.master.Master 1 --host bogon --port 7077 --webui-port 8080

master的启动类:

org.apache.spark.deploy.master.Master

找到这个类:在onStart方法里打一个断点

找到脚本: spark-daemon.sh    

脚本里显示要调用另外一个脚本里的代码   spark-class

在这里面显示调用,生成最终要执行的shell命令

org.apache.spark.launcher.Main

(生成shell脚本的工具类,并不是入口函数)

好吧 org.apache.spark.deploy.SparkSubmit 提交任务生成脚本的入口这在这里,先不看她,继续看

builder = new SparkClassCommandBuilder(className, args);

这里只是初始化了一些值,真正的执行在这里:

List<String> cmd = builder.buildCommand(env);

 

在这里加载了环境变量 

extraClassPath 这个是jar包路径

这块需要看一下,

List<String> cmd = buildJavaCommand(extraClassPath);

构建java命令

//TODO cmd中的内容

List<String> cmd = builder.buildCommand(env);
//集合中的命令数据
//  0 = "/Library/java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/bin/java"
//  1 = "-cp"
//  2 = "/workspace/spark-2.2.2/conf/:
         /workspace/spark-2.2.2/assembly/target/scala-2.11/jars/*"
//  3 = "-Xmx1g"
//  4 = "org.apache.spark.deploy.master.Master"
//  5 = "--host"
//  6 = "sysadmindeMacBook-Pro.local"
//  7 = "--port"
//  8 = "7077"
//  9 = "--webui-port"
//  10 = "8080"
 

回到脚本:

这里用shell脚本的方式,启动命令执行 org.apache.spark.deploy.master.Master 

绕来绕去,就为了这么一句命令 :

/Library/java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/bin/java

-cp /workspace/spark-2.2.2/conf/:/workspace/spark-2.2.2/assembly/target/scala-2.11/jars/*

-Xmx1g org.apache.spark.deploy.master.Master    

       --host sysadmindeMacBook-Pro.local --port 7077 --webui-port 8080

接下来,开始看:org.apache.spark.deploy.master.Master   这个类里面都有什么

主要 是 startRpcEnvAndEndpoint 这个方法

主要是干了三件事:

(1) The Master RpcEnv
(2) The web UI bound port
(3) The REST server bound port, if any

val rpcEnv = RpcEnv.create(SYSTEM_NAME, host, port, conf, securityMgr)

 

Master继承了ThreadSafeRpcEndpoint,重写里面的onStart方法,在启动的时候会执行:

选举leader

调用

new MonarchyLeaderAgent(this) 会声明这个类

调用:Master.scala 里面的 electedLeader 方法

self.send(ElectedLeader)

收到选取请求

页面访问地址:

http://192.168.1.103:8080

猜你喜欢

转载自blog.csdn.net/zhanglong_4444/article/details/84839756
今日推荐