'''sh-3.2# spark-submit \
--class org.apache.spark.sql.timo.examples.SearchOps
--master spark://172.27.27.205:7070
--deploy-mode cluster
--conf spark.rpc.message.maxSize=1024
--driver-memory 96g --executor.memory 80g
--total-executor-cores 56
Timo.jar'''
Spark通過將上述命令把任務遞交到集群后棺聊,該命令在spark-submit腳本中調用shell spark-class,最終運行exec:
exec
然后運行SparkSubmit下的main():
image.png
其中最重要的是SparkSubmitArguments對象歹袁,該對象把args任務參數打包成一個類實例并返回蜈膨,其中包括有該任務executor所需要的內存,cores等信息:
image.png
然后通過該對象進行action操作
image.png
調用submit(appArgs,uninitLog)
image.png
過程分兩步:
1.通過集群模式準備任務所有需要的運行環(huán)境骡送,如StandAlone|Mesos模式下等蔓肯。2.使用該環(huán)境調用main()方法稚失。
如StandAlone模式下:
deploy-mode為client時搀绣,上面的childMainClass為用戶自己編寫的Main函數飞袋,即Driver啟動在執(zhí)行spark-submit命令的節(jié)點。最終通過反射調用client的main():
然后創(chuàng)建driver,rpcEnv,并通過ClientEndpoint的onStart發(fā)送消息給Master链患,注冊Driver.
注意一點巧鸭,Spark使用Driver啟動用戶APP的main函數,而不是直接啟動麻捻,這是為了Driver程序和啟動Driver的Worker程序共命運蹄皱,即如果此Worker掛了览闰,對應的Driver也會停止芯肤。至此巷折,Client提交Driver流程結束了。
此外崖咨,Master會根據提交的參數去集群中尋找相應的結點滿足Executor需求锻拘,以啟動相應的Executor。