1. 程式人生 > >Spark2.2.2原始碼解析: 2.啟動master節點流程分析

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