1. 程式人生 > >Spark:在Spark叢集中,叢集的節點個數、RDD分割槽個數、​cpu核心個數三者與並行度的關係??

Spark:在Spark叢集中,叢集的節點個數、RDD分割槽個數、​cpu核心個數三者與並行度的關係??

梳理一下Spark中關於併發度涉及的幾個概念File,Block,Split,Task,Partition,RDD以及節點數、Executor數、core數目的關係。

輸入可能以多個檔案的形式儲存在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核數。

至於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分割槽數目,增大任務並行度的做法。

------------------------------------  

Spark叢集的節點個數為叢集的機器的數量。一個機器上有幾個worker,一個woker可以申請多少core是可配置的。一個常用的配置是: 一臺機器一個worker,一個woker可擁有的最大core數是機器邏輯cpu的數量。 在這種情況下,一個core就可以理解為一臺機器的一個邏輯核。

而RDD的分割槽個數決定了這個RDD被分為多少片(partition)來執行,一個片給一個Core。

假設有一個10臺機器的叢集,每臺機器有8個邏輯核,並按照如上的配置,那麼這個spark叢集的可用資源是 80個core(這裡只考慮cpu,實際上還有記憶體)。如果一個任務申請到了叢集的所有資源(所有80個core)。現在有一個被分為100個partition的RDD被map執行,那麼會同時啟動80個Task也就是佔用了所有80個core計算(實際是啟動了80個執行緒),剩餘20個partition等待某些task完成後繼續執行。

當然理論上可以給一臺機器配置更多的worker和core,即使實際上機器只有80個邏輯核,但是你總共配置100個core,就可以同時跑起來100個partition了( no zuo no die )

名詞和某些解釋不嚴格的嚴謹,題主能明白就成。