spark源碼閱讀(一)啟動(dòng)代碼閱讀

spark啟動(dòng)代碼閱讀:

成都創(chuàng)新互聯(lián)專(zhuān)注于平遠(yuǎn)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供平遠(yuǎn)營(yíng)銷(xiāo)型網(wǎng)站建設(shè),平遠(yuǎn)網(wǎng)站制作、平遠(yuǎn)網(wǎng)頁(yè)設(shè)計(jì)、平遠(yuǎn)網(wǎng)站官網(wǎng)定制、成都小程序開(kāi)發(fā)服務(wù),打造平遠(yuǎn)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供平遠(yuǎn)網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。

spark使用一系列的shell腳本作為入口:其中bin目錄下面是任務(wù)提交的腳本;sbin目錄是master和worker啟停相關(guān)的腳本。

而所有腳本最后都是通過(guò)調(diào)用bin/spark-class來(lái)實(shí)現(xiàn)對(duì)java(scala)代碼的調(diào)用。

----------------------spark-class獲取java參數(shù)分析 開(kāi)始-------------------------------------

spark-class的代碼處理流程:

  1. 調(diào)用org.apache.spark.launcher.Main并把傳入的參數(shù)代入,以獲取到具體的參數(shù):

("$RUNNER" -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "$@")將參數(shù)代入,即執(zhí)行的是:

/usr/java/jdk/bin/java -cp /home/xxx/spark/lib/spark-assembly-1.5.2-hadoop2.5.0-cdh6.3.2.jar org.apache.spark.launcher.Main org.apache.spark.deploy.SparkSubmit --class com.xxx.xxxx.stat.core.Main --master spark://xxxx1:7077,xxxx2:7077 --executor-memory 2G --driver-memory 5G --total-executor-cores 10 /home/xxx/xxxxxxx/bigdata-xxxxxxx.jar com.xxx.xxxx.stat.xxx.XXXXJob 20180527 20180528

這行代碼返回的是:

/usr/java/jdk/bin/java -cp /home/xxx/spark/libext/*:/home/xxx/spark/conf/:/home/xxx/spark/lib/spark-assembly-1.5.2-hadoop2.5.0-cdh6.3.2.jar:/home/xxx/spark/lib/datanucleus-api-jdo-3.2.6.jar:/home/xxx/spark/lib/datanucleus-core-3.2.10.jar:/home/xxx/spark/lib/datanucleus-rdbms-3.2.9.jar:/home/xxx/yarn/etc/hadoop -DLOG_LEVEL=INFO -DROLE_NAME=console -Xms5G -Xmx5G -Xss32M -XX:PermSize=128M -XX:MaxPermSize=512M org.apache.spark.deploy.SparkSubmit --master spark://xxxx1:7077,xxxx2:7077 --conf spark.driver.memory=5G --class com.xxx.xxxx.stat.core.Main --executor-memory 2G --total-executor-cores 10 /home/xxx/xxxxxxx/bigdata-xxxxxxx.jar com.xxx.xxxx.stat.xxx.XXXXJob 20180527 20180528

可以看出org.apache.spark.launcher.Main類(lèi)的主要作用就是填充了最終執(zhí)行的java命令的參數(shù)。包括classpath、java命令的堆棧參數(shù)等。下面分析下實(shí)現(xiàn)過(guò)程:

1.org.apache.spark.launcher.Main是一個(gè)單獨(dú)的路徑,不屬于core的一部分。

2.org.apache.spark.launcher.Main這個(gè)類(lèi)對(duì)于org.apache.spark.deploy.SparkSubmit這個(gè)的調(diào)用,創(chuàng)建了builder = new SparkSubmitCommandBuilder(args);用來(lái)規(guī)整sparksubmit命令的java參數(shù)。

3.對(duì)于其他的調(diào)用(應(yīng)該主要是master和worker的調(diào)用),創(chuàng)建了builder = new SparkClassCommandBuilder(className, args);用于規(guī)整其他命令的java參數(shù)。

對(duì)于上面兩種情況,都是先初始化,然后調(diào)用builder的buildCommand方法兩步就生成了java代碼的參數(shù)。

SparkSubmitCommandBuilder通過(guò)調(diào)用內(nèi)部類(lèi)class OptionParser extends SparkSubmitOptionParser 進(jìn)行對(duì)參數(shù)的解析。

classpath主要在

buildCommand

buildSparkSubmitCommand

buildJavaCommand(在父類(lèi)中)

在各種可能含有classpath的地方獲取。

-Xms5G -Xmx5G這兩個(gè)參數(shù)是在buildSparkSubmitCommand中的通過(guò)參數(shù)中的SPARK_DRIVER_MEMORY(spark.driver.memory)解析獲取到的

-Xss32M -XX:PermSize=128M -XX:MaxPermSize=512M則是通過(guò)addPermGenSizeOpt(cmd);在配置文件中的spark.driver.extraJavaOptions這個(gè)配置項(xiàng)(DRIVER_EXTRA_JAVA_OPTIONS = "spark.driver.extraJavaOptions";)解析獲取到的。

----------------------------spark-class獲取java參數(shù)分析 結(jié)束----------------------------------------------------------

先分析下目前使用較多的bin/spark-submit(spark任務(wù)提交,driver進(jìn)程啟動(dòng))、sbin/start-master.sh(后臺(tái)啟動(dòng),master進(jìn)程啟動(dòng))、sbin/start-slave.sh(后臺(tái)啟動(dòng),worker進(jìn)程啟動(dòng)),啟動(dòng)代碼都在spark-1.5.2\core\src\main\scala\org\apache\spark\deploy:

  1. spark-submit

通過(guò)spark-class調(diào)用的類(lèi)名:org.apache.spark.deploy.SparkSubmit

下面來(lái)分析,是怎么把driver啟動(dòng)起來(lái)的,分析類(lèi)SparkSubmit.scala

/usr/java/jdk/bin/java -cp /home/xxx/spark/libext/*:/home/xxx/spark/conf/:/home/xxx/spark/lib/spark-assembly-1.5.2-hadoop2.5.0-cdh6.3.2.jar:/home/xxx/spark/lib/datanucleus-api-jdo-3.2.6.jar:/home/xxx/spark/lib/datanucleus-core-3.2.10.jar:/home/xxx/spark/lib/datanucleus-rdbms-3.2.9.jar:/home/xxx/yarn/etc/hadoop -DLOG_LEVEL=INFO -DROLE_NAME=console -Xms5G -Xmx5G -Xss32M -XX:PermSize=128M -XX:MaxPermSize=512M org.apache.spark.deploy.SparkSubmit --master spark://xxxx1:7077,xxxx2:7077 --conf spark.driver.memory=5G --class com.xxx.xxxx.stat.core.Main --executor-memory 2G --total-executor-cores 10 /home/xxx/xxxxxxx/bigdata-xxxxxxx.jar com.xxx.xxxx.stat.xxx.XXXXJob 20180527 20180528

傳入的參數(shù)主要是:

--conf spark.driver.memory=5G

--class com.xxx.xxxx.stat.core.ExcuteMain

--executor-memory 2G

--total-executor-cores 10

/home/xxx/xxxxxxx/bigdata-xxxxxxx.jar

com.xxx.xxxx.stat.xxx.XXXXJob

20180527

20180528

SparkSubmit的Main函數(shù),通過(guò)val appArgs = new SparkSubmitArguments(args)獲取到進(jìn)一步解析的參數(shù),然后調(diào)用submit(appArgs),就實(shí)現(xiàn)了提交。

SparkSubmitArguments類(lèi),先調(diào)用上面org.apache.spark.launcher.Main調(diào)用過(guò)的org.apache.spark.launcher.SparkSubmitOptionParser的parse來(lái)對(duì)參數(shù)進(jìn)行解析,然后調(diào)用loadEnvironmentArguments對(duì)環(huán)境中可能配置的參數(shù)進(jìn)行解析或者賦予默認(rèn)值。最后給action參數(shù)賦予SUBMIT的默認(rèn)值:

action = Option(action).getOrElse(SUBMIT)

下面看submit的方法的處理過(guò)程:

  1. val (childArgs, childClasspath, sysProps, childMainClass) = prepareSubmitEnvironment(args)

a.定義driver代碼類(lèi)childArgs、childClasspath、sysProps、childMainClass??梢赃@樣理解:submit提交了很多信息,比如使用的核數(shù)(對(duì)應(yīng)的executor的個(gè)數(shù))、每個(gè)核用的內(nèi)存數(shù)、執(zhí)行的driver代碼(driver代碼也視為一種提交的內(nèi)容)

b.定義集群管理clusterManager,根據(jù)master的前綴進(jìn)行區(qū)分。yarn,spark,mesos,local

c.定義提交模式deployMode,CLIENT則driver在當(dāng)前機(jī)器;CLUSTER則使用某個(gè)worker作為driver。

d.下面的代碼就是對(duì)clusterManager、deployMode、python(R)組合的特殊情況處理。我們重點(diǎn)關(guān)注standalone模式。

e.將各個(gè)參數(shù)填入options變量中。

f.對(duì)于if (deployMode == CLIENT) { 填充四個(gè)參數(shù)。 直接將childMainClass = args.mainClass填充,在sparkSubmit中直接被runMain調(diào)用執(zhí)性。

f.對(duì)于isStandaloneCluster模式(standalone和cluster模式),區(qū)分legacy和rest兩種事項(xiàng)方式來(lái)啟動(dòng)一個(gè)client來(lái)執(zhí)性dirver

rest方式將org.apache.spark.deploy.rest.RestSubmissionClient填充到childMainClass,

legacy方式:org.apache.spark.deploy.Client填充到childMainClass

在sparksubmit中執(zhí)行上面的類(lèi),而將args.mainClass作為參數(shù)傳給上面的類(lèi)。

g.對(duì)于cluster模式忽略spark.driver.host參數(shù)。

h.返回四個(gè)參數(shù)

四個(gè)參數(shù)的解釋?zhuān)?/p>

  • This returns a 4-tuple:

  • (1) the arguments for the child process,

  • (2) a list of classpath entries for the child,

  • (3) a map of system properties, and

  • (4) the main class for the child
  1. 調(diào)用doRunMain

runMain

調(diào)用提交的childMainClass,

mainClass = Utils.classForName(childMainClass)

val mainMethod = mainClass.getMethod("main", new ArrayString.getClass)

mainMethod.invoke(null, childArgs.toArray)

  1. start-master.sh(中間調(diào)用了spark-daemon.sh)

通過(guò)spark-class調(diào)用的類(lèi)名:org.apache.spark.deploy.master.Master

調(diào)用時(shí)帶的參數(shù):

  1. start-slave.sh(中間調(diào)用了spark-daemon.sh)

通過(guò)spark-class調(diào)用的類(lèi)名:org.apache.spark.deploy.worker.Worker

調(diào)用時(shí)帶的參數(shù):

文章名稱(chēng):spark源碼閱讀(一)啟動(dòng)代碼閱讀
標(biāo)題路徑:http://muchs.cn/article14/gehige.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)網(wǎng)站建設(shè)、網(wǎng)站制作域名注冊(cè)、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管