Spark中關(guān)于并發(fā)度涉及的幾個(gè)概念File,Block,Split,Task,Partition,RDD以及節(jié)點(diǎn)數(shù)、Executor數(shù)、core數(shù)目的關(guān)系。
輸入可能以多個(gè)文件的形式存儲(chǔ)在HDFS上,
每個(gè)File都包含了很多塊,稱為Block。
當(dāng)Spark讀取這些文件作為輸入時(shí),
會(huì)根據(jù)具體數(shù)據(jù)格式對(duì)應(yīng)的InputFormat進(jìn)行解析,
一般是將若干個(gè)Block合并成一個(gè)輸入分片,稱為InputSplit,
注意InputSplit不能跨越文件。隨后將為這些輸入分片生成具體的Task。InputSplit與Task是一一對(duì)應(yīng)的關(guān)系。隨后這些具體的Task每個(gè)都會(huì)被分配到集群上的某個(gè)節(jié)點(diǎn)的某個(gè)Executor去執(zhí)行。
每個(gè)節(jié)點(diǎn)可以起一個(gè)或多個(gè)Executor。
每個(gè)Executor由若干core組成,每個(gè)Executor的每個(gè)core一次只能執(zhí)行一個(gè)Task。
每個(gè)Task執(zhí)行的結(jié)果就是生成了目標(biāo)RDD的一個(gè)partiton。
**注意: **
這里的core是虛擬的core而不是機(jī)器的物理CPU核,可以理解為就是Executor的一個(gè)工作線程。
而 Task被執(zhí)行的并發(fā)度 = Executor數(shù)目 * 每個(gè)Executor核數(shù)。
至于partition的數(shù)目:
對(duì)于數(shù)據(jù)讀入階段,例如sc.textFile,輸入文件被劃分為多少InputSplit就會(huì)需要多少初始Task。
在Map階段partition數(shù)目保持不變。
在Reduce階段,RDD的聚合會(huì)觸發(fā)shuffle操作,聚合后的RDD的partition數(shù)目跟具體操作有關(guān),例如repartition操作會(huì)聚合成指定分區(qū)數(shù),還有一些算子是可配置的。
