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中的內容
|
回到指令碼:
這裡用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)
收到選取請求
頁面訪問地址: