spark-shell啓動命令詳細解析1

環境:
spark 2.3.3
scala 2.11.8
Java 1.8.0_141
 
執行spark-shell命令後,會啓動spark-shell交互命令行窗口:
 
那麼spark-shell命令的啓動流程是怎樣的呢?
下面讓我們來一步一步分析
首先,查看${SPARK_HOME}/bin/spark-shell啓動腳本
可以看到,spark-shell腳本使用啓動參數調用main方法
spark-shell腳本中的main方法最終會調用命令:
"${SPARK_HOME}"/bin/spark-submit --class org.apache.spark.repl.Main --name "Spark shell" "$@"
 
那麼此時會執行spark-submit腳本,會將
--class org.apache.spark.repl.Main --name "Spark shell"
參數和spark-shell啓動參數
"$@"
一起傳遞給spark-submit腳本
查看${SPARK_HOME}/bin/spark-submit腳本:
最終會通過命令:
exec "${SPARK_HOME}"/bin/spark-class org.apache.spark.deploy.SparkSubmit "$@"
調用org.apache.spark.deploy.SparkSubmit類。(這裏${SPARK_HOME}/bin/spark-class 腳本不再分析)
 
下面查看org.apache.spark.deploy.SparkSubmit類的main方法
首先解析傳遞的參數,然後根據appArgs.action 匹配相應的動作.
而appArgs.action的設置是在org.apache.spark.deploy.SparkSubmitArguments
var action: SparkSubmitAction = null
 
// Action should be SUBMIT unless otherwise specified
action = Option(action).getOrElse(SUBMIT)
可以看到,由於我們沒有傳遞action參數,所以默認是SUBMIT,所以org.apache.spark.deploy.SparkSubmit的main方法會調用submit方法
case SparkSubmitAction.SUBMIT => submit(appArgs, uninitLog)
( 即Spark WebUI的堆棧信息—> org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:137) )
 
下面看org.apache.spark.deploy.SparkSubmit$submit方法
可以看到org.apache.spark.deploy.SparkSubmit$submit方法中最後會調用submit方法中定義的doRunMain方法,然後調用runMain方法
而在runMain方法中,會根據傳遞的childMainClass通過反射回去class,然後通過new JavaMainApplication(mainClass)啓動,這裏的class就是${SPARK_HOME}/bin/spark-shell腳本中指定的org.apache.spark.repl.Main
然後通過JavaMainApplication$start方法啓動org.apache.spark.repl.Main類:
 
在JavaMainApplication$start方法中
通過反射,調用org.apache.spark.repl.Main$main方法
下面我們看下org.apache.spark.repl.Main類
但是,在idea中沒有搜到這個類,原來這個類在spark-repl_2.12依賴裏面
在maven中添加依賴
<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-repl_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>
再次查找,就能找到這個類org.apache.spark.repl.Main
 
其實上面這些class類的調用堆棧信息,可以在spark的webUI上看到
spark-shell啓動的時候,會提示webUI的地址:
Spark context Web UI available at http://node01.zf.com:4040
打開這個地址:
然後點擊Executors tab
然後點擊driver對應的Thread Dump,在打開頁面中點擊Thread ID=1的線程,會展開堆棧調用信息。我們上面說的調用鏈信息都在裏面。
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章