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

     Client做爲Endpoint的具體實例,下面咱們介紹一下Client啓動以及OnStart指令後的額外工做java

1、腳本概覽
     下面是一個舉例:
/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
 
2、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] = yarn: org.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進行解讀
 
3、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
 
4、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
 
5、RpcMessage處理 (receiveAndReply)
 
消息實例 發起方 接收方 說明
       
 
6、OneWayMessage 處理 (receive)
消息實例 發起方 接收方 說明
SubmitDriverResponse Master Client  
KillDriverResponse   Client
相關文章
相關標籤/搜索