1、任務中如何確定spark RDD分區數、task數目、core個數、worker節點個數、excutor數量
(1)hdfs 上的文件的存儲形式是以 Block 的形式存儲的,每個 File 文件都包含了很多塊,一個Block默認是128M大小。當 spark 從 hdfs 上讀取數據的時候,會根據具體數據格式對應的 InputFormat 進行解析,一般是將若干個Block合並成一個輸入分片,稱為 InputSplit,其中要注意InputSplit不能跨越文件 File。
(2)spark 會為這些分片生成具體的 task,InputSplit 與 Task 是一 一對應的關系,隨后這些具體的 Task 每個都會被分配到集群上的某個節點的某個 Executor 去執行,每個 task 執行的結果就生成了RDD的一個 partiton。
- 每個 worker 節點可以起一個或多個 Executor。
- 每個 Executor 由若干 core 組成,每個 Executor 的每個 core 一次只能執行一個 Task。
- 每個 Task 執行的結果就是生成了目標 RDD 的一個 partiton。
注意: 這里的 core 是虛擬的 core 而不是機器的物理 CPU 核,可以理解為就是 Executor 的一個工作線程。
Task被執行的並發度 = Executor數目 * 每個Executor核數(=core總個數)
2、RDD 中 partition 的數目:
對於數據讀入階段,例如 sc.textFile,輸入文件被划分為多少 InputSplit 就會需要多少初始 Task。
在 Map 階段 partition 數目保持不變。
在 Reduce 階段,RDD 的聚合會觸發 shuffle 操作,聚合后的 RDD 的 partition 數目跟具體操作有關,例如 repartition 操作會聚合成指定分區數,還有一些算子是可配置的。
RDD 在計算的時候,每個分區都會起一個 task,所以 rdd 的分區數目決定了總的 task 數目。
申請的計算節點(Executor)數目和每個計算節點核數,決定了你同一時刻可以並行執行的 task。
例如:
RDD有100個分區,那么計算的時候就會生成100個task,你的資源配置為10個計算節點,每個2個核,同一時刻可以並行的task數目為20,計算這個RDD就需要5個輪次。
如果計算資源不變,你有101個task的話,就需要6個輪次,在最后一輪中,只有一個task在執行,其余核都在空轉。
如果資源不變,你的RDD只有2個分區,那么同一時刻只有2個task運行,其余18個核空轉,造成資源浪費。
參考博客:https://blog.csdn.net/weixin_38750084/article/details/82725176