1. 程式人生 > >【Spark2.0源碼學習】-6.Client啟動

【Spark2.0源碼學習】-6.Client啟動

rms permsize wrapper 2.0 proxy waiting 默認 說明 加載器

Client作為Endpoint的具體實例,下面我們介紹一下Client啟動以及OnStart指令後的額外工作

一、腳本概覽 下面是一個舉例:
/opt/jdk1.7.0_79/bin/java
-cp /opt/spark-2.1.0/conf/:/opt/spark-2.1.0/jars/*:/opt/hadoop-2.6.4/etc/hadoop/
-Xmx1g
-XX:MaxPermSize=256m
org.apache.spark.deploy.SparkSubmit
--master spark://zqh:7077
--class org.apache.spark.examples.SparkPi
../examples/jars/spark-examples_2.11-2.1.0.jar 10
二、SparkSubmit啟動流程 SparkSubmit的啟動流程如下:   技術分享
  • SparkSubmitArguments:
    • 解析Client啟動的參數
      • --name --master --class --deploy-mode
      • --num-executors --executor-cores --total-executor-cores --executor-memory
      • --driver-memory --driver-cores --driver-class-path --driver-java-options --driver-library-path
      • --properties-file
      • --kill --status --supervise --queue
      • --files --py-files
      • --archives --jars --packages --exclude-packages --repositories
      • --conf(解析存入Map : sparkProperties中)
      • --proxy-user --principal --keytab --help --verbose --version --usage-error
    • 合並--properties-file(沒有配置默認為conf/spark-defaults.conf)文件配置項(不在--conf中的配置 )至sparkProperties
    • 刪除sparkProperties中不以spark.開頭的配置項目
    • 啟動參數為空的配置項從sparkProperties中合並
    • 根據action(SUBMIT,KILL,REQUEST_STATUS)校驗各自必須參數是否有值
  • Case Submit:
    • 獲取childMainClass
      • [--deploy-mode] = clent(默認):用戶任務啟動類mainClass(--class)
      • [--deploy-mode] = cluster & [--master] = spark:* & useRest: org.apache.spark.deploy.rest.RestSubmissionClient
      • [--deploy-mode] = cluster & [--master] = spark:* & !useRest : org.apache.spark.deploy.Client
      • [--deploy-mode] = cluster & [--master] = yarnorg.apache.spark.deploy.yarn.Client
      • [--deploy-mode] = cluster & [--master] = mesos:*: org.apache.spark.deploy.rest.RestSubmissionClient
    • 獲取childArgs(子運行時對應命令行組裝參數)
      • [--deploy-mode] = cluster & [--master] = spark:* & useRest: 包含primaryResource與mainClass
      • [--deploy-mode] = cluster & [--master] = spark:* & !useRest : 包含--supervise --memory --cores launch 【childArgs】, primaryResource, mainClass
      • [--deploy-mode] = cluster & [--master] = yarn:--class --arg --jar/--primary-py-file/--primary-r-file
      • [--deploy-mode] = cluster & [--master] = mesos:*: primaryResource
    • 獲取childClasspath
      • [--deploy-mode] = clent:讀取--jars配置,與primaryResource信息(../examples/jars/spark-examples_2.11-2.1.0.jar)
    • 獲取sysProps
      • 將sparkPropertie中的所有配置封裝成新的sysProps對象,另外還增加了一下額外的配置項目
    • 將childClasspath通過當前的類加載器加載中
    • 將sysProps設置到當前jvm環境中
    • 最終反射執行childMainClass,傳參為childArgs
下面僅針對於org.apache.spark.deploy.Client進行解讀 三、Client啟動流程 Client的啟動流程如下:   技術分享
  • SparkConf:加載key以spark.開頭的系統屬性(Utils.getSystemProperties)
  • ClientArguments:
    • 解析Client啟動的參數
      • --cores -c --memory -m --supervise -s --verbose -v
      • launch jarUrl master mainClass
      • kill master driverId
    • 將--properties-file(沒有配置默認為conf/spark-defaults.conf)中spark.開頭的配置存入SparkConf
    • 在沒有配置情況下,cores默認為1核
    • 在沒有配置情況下,memory默認為1G
    • NettyRpcEnv中的內部處理遵循RpcEndpoint統一處理,這裏不再贅述
  • 最終守護進程會一直存在等待結束信awaitTermination
四、Client的OnStart監聽事件 Client的啟動完成後異步執行工作如下:   技術分享
  • 如果是發布任務(case launch),Client創建一個DriverDescription,並向Master發起RequestSubmitDriver請求
    技術分享技術分享
    • Command中的mainClass為: org.apache.spark.deploy.worker.DriverWrapper
    • Command中的arguments為: Seq("{{WORKER_URL}}", "{{USER_JAR}}", driverArgs.mainClass)
  • Master接受RequestSubmitDriver請求後,將DriverDescription封裝為一個DriverInfo,
    技術分享技術分享
    • startTime與submitDate都為當前時間
    • driverId格式為:driver-yyyyMMddHHmmss-nextId,nextId是全局唯一的
  • Master持久化DriverInfo,並加入待調度列表中(waitingDrivers),觸發公共資源調度邏輯(公共資源調度詳解見下一節內容)
  • Master公共資源調度結束後,返回SubmitDriverResponse給Client
五、RpcMessage處理(receiveAndReply)
消息實例 發起方 接收方 說明
六、OneWayMessage處理(receive)
消息實例 發起方 接收方 說明
SubmitDriverResponse Master Client
KillDriverResponse Client

【Spark2.0源碼學習】-6.Client啟動