1. spark 如何執(zhí)行程序?
首先看下spark 的部署圖:
節(jié)點(diǎn)類型有:
1. master 節(jié)點(diǎn): 常駐master進(jìn)程,負(fù)責(zé)管理全部worker節(jié)點(diǎn)。
2. worker 節(jié)點(diǎn): 常駐worker進(jìn)程,負(fù)責(zé)管理executor 并與master節(jié)點(diǎn)通信。
dirvier:官方解釋為: The process running the main() function of the application and creating the SparkContext。即理解為用戶自己編寫的應(yīng)用程序
Executor:執(zhí)行器:
在每個(gè)WorkerNode上為某應(yīng)用啟動的一個(gè)進(jìn)程,該進(jìn)程負(fù)責(zé)運(yùn)行任務(wù),并且負(fù)責(zé)將數(shù)據(jù)存在內(nèi)存或者磁盤上,每個(gè)任務(wù)都有各自獨(dú)立的Executor。
Executor是一個(gè)執(zhí)行Task的容器。它的主要職責(zé)是:
1、初始化程序要執(zhí)行的上下文SparkEnv,解決應(yīng)用程序需要運(yùn)行時(shí)的jar包的依賴,加載類。
2、同時(shí)還有一個(gè)ExecutorBackend向cluster manager匯報(bào)當(dāng)前的任務(wù)狀態(tài),這一方面有點(diǎn)類似hadoop的tasktracker和task。
總結(jié):Executor是一個(gè)應(yīng)用程序運(yùn)行的監(jiān)控和執(zhí)行容器。Executor的數(shù)目可以在submit時(shí),由?--num-executors (on yarn)指定.
Job:
包含很多task的并行計(jì)算,可以認(rèn)為是Spark RDD 里面的action,每個(gè)action的計(jì)算會生成一個(gè)job。
用戶提交的Job會提交給DAGScheduler,Job會被分解成Stage和Task。
Stage:
一個(gè)Job會被拆分為多組Task,每組任務(wù)被稱為一個(gè)Stage就像Map Stage, Reduce Stage。
Stage的劃分在RDD的論文中有詳細(xì)的介紹,簡單的說是以shuffle和result這兩種類型來劃分。在Spark中有兩類task,一類是shuffleMapTask,一類是resultTask,第一類task的輸出是shuffle所需數(shù)據(jù),第二類task的輸出是result,stage的劃分也以此為依據(jù),shuffle之前的所有變換是一個(gè)stage,shuffle之后的操作是另一個(gè)stage。比如 rdd.parallize(1 to 10).foreach(println) 這個(gè)操作沒有shuffle,直接就輸出了,那么只有它的task是resultTask,stage也只有一個(gè);如果是rdd.map(x => (x, 1)).reduceByKey(_ + _).foreach(println), 這個(gè)job因?yàn)橛衦educe,所以有一個(gè)shuffle過程,那么reduceByKey之前的是一個(gè)stage,執(zhí)行shuffleMapTask,輸出shuffle所需的數(shù)據(jù),reduceByKey到最后是一個(gè)stage,直接就輸出結(jié)果了。如果job中有多次shuffle,那么每個(gè)shuffle之前都是一個(gè)stage。
Task
即 stage 下的一個(gè)任務(wù)執(zhí)行單元,一般來說,一個(gè) rdd 有多少個(gè) partition,就會有多少個(gè) task,因?yàn)槊恳粋€(gè) task 只是處理一個(gè) partition 上的數(shù)據(jù).
每個(gè)executor執(zhí)行的task的數(shù)目, 可以由submit時(shí),--num-executors(on yarn) 來指定。