本文主要说明在启动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中的内容
|
回到脚本:
这里用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)
收到选取请求
页面访问地址: