Spark:任務中如何確定spark分區數、task數目、core個數、worker節點個數、excutor數量


先上圖:

 

每一個過程的任務數,對應一個inputSplit1, Partition輸入可能以多個文件的形式存儲在HDFS上,每個File都包含了很多塊,稱為Block。

當Spark讀取這些文件作為輸入時,會根據具體數據格式對應的InputFormat進行解析,一般是將若干個Block合並成一個輸入分片,稱為InputSplit,注意InputSplit不能跨越文件。

隨后將為這些輸入分片生成具體的Task。InputSplit與Task是一一對應的關系
隨后這些具體的Task每個都會被分配到集群上的某個節點的某個Executor去執行

  • 每個節點可以起一個或多個Executor。
  • 每個Executor由若干core組成,每個Executor的每個core一次只能執行一個Task
  • 每個Task執行的結果就是生成了目標RDD的一個partiton

注意: 這里的core是虛擬的core而不是機器的物理CPU核,可以理解為就是Executor的一個工作線程。

Task被執行的並發度 = Executor數目 * 每個Executor核數(=core總個數)


至於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個核空轉,造成資源浪費。

這就是在spark調優中,增大RDD分區數目,增大任務並行度的原因

原文地址:https://blog.csdn.net/u012965373/article/details/80847543


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM