91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

spark源碼閱讀(一) 啟動代碼閱讀

發布時間:2020-05-17 17:16:32 來源:網絡 閱讀:1502 作者:sirius_kb 欄目:大數據

spark啟動代碼閱讀:

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

而所有腳本最后都是通過調用bin/spark-class來實現對java(scala)代碼的調用。

----------------------spark-class獲取java參數分析 開始-------------------------------------

spark-class的代碼處理流程:

  1. 調用org.apache.spark.launcher.Main并把傳入的參數代入,以獲取到具體的參數:

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

/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類的主要作用就是填充了最終執行的java命令的參數。包括classpath、java命令的堆棧參數等。下面分析下實現過程:

1.org.apache.spark.launcher.Main是一個單獨的路徑,不屬于core的一部分。

2.org.apache.spark.launcher.Main這個類對于org.apache.spark.deploy.SparkSubmit這個的調用,創建了builder = new SparkSubmitCommandBuilder(args);用來規整sparksubmit命令的java參數。

3.對于其他的調用(應該主要是master和worker的調用),創建了builder = new SparkClassCommandBuilder(className, args);用于規整其他命令的java參數。

對于上面兩種情況,都是先初始化,然后調用builder的buildCommand方法兩步就生成了java代碼的參數。

SparkSubmitCommandBuilder通過調用內部類class OptionParser extends SparkSubmitOptionParser 進行對參數的解析。

classpath主要在

buildCommand

buildSparkSubmitCommand

buildJavaCommand(在父類中)

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

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

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

----------------------------spark-class獲取java參數分析 結束----------------------------------------------------------

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

  1. spark-submit

通過spark-class調用的類名:org.apache.spark.deploy.SparkSubmit

下面來分析,是怎么把driver啟動起來的,分析類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

傳入的參數主要是:

--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函數,通過val appArgs = new SparkSubmitArguments(args)獲取到進一步解析的參數,然后調用submit(appArgs),就實現了提交。

SparkSubmitArguments類,先調用上面org.apache.spark.launcher.Main調用過的org.apache.spark.launcher.SparkSubmitOptionParser的parse來對參數進行解析,然后調用loadEnvironmentArguments對環境中可能配置的參數進行解析或者賦予默認值。最后給action參數賦予SUBMIT的默認值:

action = Option(action).getOrElse(SUBMIT)

下面看submit的方法的處理過程:

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

a.定義driver代碼類childArgs、childClasspath、sysProps、childMainClass。可以這樣理解:submit提交了很多信息,比如使用的核數(對應的executor的個數)、每個核用的內存數、執行的driver代碼(driver代碼也視為一種提交的內容)

b.定義集群管理clusterManager,根據master的前綴進行區分。yarn,spark,mesos,local

c.定義提交模式deployMode,CLIENT則driver在當前機器;CLUSTER則使用某個worker作為driver。

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

e.將各個參數填入options變量中。

f.對于if (deployMode == CLIENT) { 填充四個參數。 直接將childMainClass = args.mainClass填充,在sparkSubmit中直接被runMain調用執性。

f.對于isStandaloneCluster模式(standalone和cluster模式),區分legacy和rest兩種事項方式來啟動一個client來執性dirver

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

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

在sparksubmit中執行上面的類,而將args.mainClass作為參數傳給上面的類。

g.對于cluster模式忽略spark.driver.host參數。

h.返回四個參數

四個參數的解釋:

  • 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. 調用doRunMain

runMain

調用提交的childMainClass,

mainClass = Utils.classForName(childMainClass)

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

mainMethod.invoke(null, childArgs.toArray)

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

通過spark-class調用的類名:org.apache.spark.deploy.master.Master

調用時帶的參數:

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

通過spark-class調用的類名:org.apache.spark.deploy.worker.Worker

調用時帶的參數:

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

同心县| 扎赉特旗| 古蔺县| 吉木乃县| 道真| 安多县| 秭归县| 龙江县| 阿克| 海原县| 宁阳县| 宣武区| 比如县| 昌图县| 昭苏县| 昌乐县| 衡东县| 娱乐| 东城区| 恩施市| 新晃| 石柱| 安西县| 富川| 泸水县| 七台河市| 历史| 沙河市| 大英县| 精河县| 九寨沟县| 莱西市| 禹州市| 罗江县| 巫山县| 祁阳县| 调兵山市| 平江县| 离岛区| 襄樊市| 永川市|