在這里主要說(shuō)明一下再YARN相關(guān)模式下的參數(shù)傳遞。在YARN相關(guān)模式中,這些環(huán)境變量首先要通過(guò)YARN client設(shè)置到Spark AM的運(yùn)行環(huán)境中,之后Spark AM在啟動(dòng)Executor時(shí)再將環(huán)境變量設(shè)置到Executor中。
JAR包和依賴文件的分發(fā)
Spark程序的運(yùn)行主要有兩類依賴:
Spark運(yùn)行庫(kù)及其依賴
應(yīng)用程序自身的額外依賴
在Local模式下,不存在JAR包分發(fā)的問(wèn)題。在這里主要介紹下YARN模式下的文件分發(fā)。
在YARN相關(guān)模式中,運(yùn)行庫(kù)和程序運(yùn)行所以來(lái)的其他文件首先通過(guò)HDFS客戶端API上傳到作業(yè)的.sparkStaing目錄下,然后將對(duì)應(yīng)的文件和URL映射關(guān)系通知YARN,YARN的Node Manager在啟動(dòng)Container的時(shí)候會(huì)從指定URL處下載相關(guān)文件作為運(yùn)行環(huán)境的一部分。
對(duì)于需要進(jìn)一步分發(fā)到Executor運(yùn)行環(huán)境的文件,Spark YARN客戶端將需要分發(fā)的文件的相關(guān)屬性(例:URL、時(shí)間戳、尺寸等)打包成字符串,通過(guò)特定的環(huán)境變量(SPARK_YARN_CACHE_XXXX)傳遞給Spark AM,Spark AM在創(chuàng)建Executor的Container時(shí)還原特定環(huán)境變中的各個(gè)文件,并通過(guò)調(diào)用setLocalResources函數(shù)初始化Container。
任務(wù)管理和序列化
Spark任務(wù)的運(yùn)行要解決的問(wèn)題為:
以正確的順序運(yùn)行任務(wù),有效地管理和分派任務(wù)
將任務(wù)及運(yùn)行所需相關(guān)數(shù)據(jù)有效地發(fā)送到遠(yuǎn)端
收集運(yùn)行結(jié)果
Spark任務(wù)通過(guò)DAGScheduler調(diào)用TaskScheduler.submitTasks進(jìn)行派發(fā),該接口將相關(guān)的一組任務(wù)一起提交并進(jìn)行調(diào)度。
任務(wù)的運(yùn)行結(jié)果在Executor端被序列化并發(fā)送回SchedulerBackend,由于受到Akka幀尺寸的限制,如果運(yùn)行結(jié)果數(shù)據(jù)過(guò)大,結(jié)果會(huì)存儲(chǔ)到BlockManager中,這時(shí)候發(fā)送到SchedulerBackend的是對(duì)應(yīng)數(shù)據(jù)的BlockID,TaskScheduler最終會(huì)調(diào)用TaskResultGetter在線程池中以異步的方式讀取結(jié)果,TaskSetManager再根據(jù)運(yùn)行結(jié)果更新任務(wù)狀態(tài)(比如失敗重試等)并匯報(bào)給DAGScheduler等。