輸入可能以多個文件的形式存儲在HDFS上蛆楞,每個File都包含了很多塊溯乒,稱為Block。
當(dāng)Spark讀取這些文件作為輸入時豹爹,會根據(jù)具體數(shù)據(jù)格式對應(yīng)的InputFormat進(jìn)行解析裆悄,一般是將若干個Block合并成一個輸入分片,稱為InputSplit臂聋,注意InputSplit不能跨越文件光稼。
隨后將為這些輸入分片生成具體的Task。InputSplit與Task是一一對應(yīng)的關(guān)系孩等。
隨后這些具體的Task每個都會被分配到集群上的某個節(jié)點(diǎn)的某個Executor去執(zhí)行艾君。
每個節(jié)點(diǎn)可以起一個或多個Executor。
每個Executor由若干core組成肄方,每個Executor的每個core一次只能執(zhí)行一個Task腻贰。
每個Task執(zhí)行的結(jié)果就是生成了目標(biāo)RDD的一個partiton。
注意:?這里的core是虛擬的core而不是機(jī)器的物理CPU核扒秸,可以理解為就是Executor的一個工作線程播演。
而 Task被執(zhí)行的并發(fā)度 = Executor數(shù)目 * 每個Executor核數(shù)。
至于partition的數(shù)目:
對于數(shù)據(jù)讀入階段伴奥,例如sc.textFile写烤,輸入文件被劃分為多少InputSplit就會需要多少初始Task。
在Map階段partition數(shù)目保持不變拾徙。
在Reduce階段洲炊,RDD的聚合會觸發(fā)shuffle操作,聚合后的RDD的partition數(shù)目跟具體操作有關(guān)尼啡,例如repartition操作會聚合成指定分區(qū)數(shù)暂衡,還有一些算子是可配置的。
1崖瞭,Application
application(應(yīng)用)其實(shí)就是用spark-submit提交的程序狂巢。比方說spark examples中的計算pi的SparkPi。一個application通常包含三部分:從數(shù)據(jù)源(比方說HDFS)取數(shù)據(jù)形成RDD书聚,通過RDD的transformation和action進(jìn)行計算唧领,將結(jié)果輸出到console或者外部存儲(比方說collect收集輸出到console)。
2雌续,Driver
?Spark中的driver感覺其實(shí)和yarn中Application Master的功能相類似斩个。主要完成任務(wù)的調(diào)度以及和executor和cluster manager進(jìn)行協(xié)調(diào)。有client和cluster聯(lián)眾模式驯杜。client模式driver在任務(wù)提交的機(jī)器上運(yùn)行受啥,而cluster模式會隨機(jī)選擇機(jī)器中的一臺機(jī)器啟動driver。從spark官網(wǎng)截圖的一張圖可以大致了解driver的功能。
3滚局,Job
?Spark中的Job和MR中Job不一樣不一樣叁温。MR中Job主要是Map或者Reduce Job。而Spark的Job其實(shí)很好區(qū)別核畴,一個action算子就算一個Job膝但,比方說count,first等谤草。
4, Task
Task是Spark中最新的執(zhí)行單元跟束。RDD一般是帶有partitions的,每個partition的在一個executor上的執(zhí)行可以任務(wù)是一個Task丑孩。?
5, Stage
Stage概念是spark中獨(dú)有的冀宴。一般而言一個Job會切換成一定數(shù)量的stage。各個stage之間按照順序執(zhí)行温学。至于stage是怎么切分的略贮,首選得知道spark論文中提到的narrow dependency(窄依賴)和wide dependency( 寬依賴)的概念。其實(shí)很好區(qū)分仗岖,看一下父RDD中的數(shù)據(jù)是否進(jìn)入不同的子RDD逃延,如果只進(jìn)入到一個子RDD則是窄依賴,否則就是寬依賴轧拄。寬依賴和窄依賴的邊界就是stage的劃分點(diǎn)