標籤:

在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 partition個數是邏輯上把數據分成了多少個片。

CPU核數是物理上用幾個CPU去執行(沒真正配置過,不清楚這個咋配置的)。

集群節點個數,應該是指的實際上起了幾個進程在跑作業。

RDD partition個數如果很大,就表示邏輯上這個數據可以分成許多小片。但雖然分成許多小片,但你只有一個CPU去運行,那也只能一個小片一個小片的串列執行。

RDD partition個數如果很小,則邏輯上不可多分成許多片,則即使你有無窮多個CPU去跑,也同時最多有partiiton個數的節點可以分到任務幹活。


1.partition的個數是split size決定的,spark的底層還是用的hadoop的fileformat,當你制定了一個可以切分的format,他就會按照splitsize去切partition,這個決定了任務會被分成多少份。

2.節點個數跟cpu的核數決定了你能起多少實例,就是資源池。

3.如果你partition的數量多,能起實例的資源也多,那自然並發度就多,如果你partition數量少,資源很多,它也不會有很多並發,如果你partition的數量很多,但是資源少,那麼並發也不大,他會算完一批再繼續起下一批


最好還是看看官方的Guide,RDD分區個數就是把數據分成了多少塊,是可以動態調整的,一個分區對應一個task,節點上的CPU數量是可以設置分配幾個給executor的,樓上有人說每個節點分配1核沒什麼用,這個的確有點不當,比如在Spark Streaming中1個節點給1個核,那就只能接收數據不能處理數據了,這些在Guide中都有提及。影響並行度的因素有很多,並不是單純的正相關和負相關,比如一般的分散式系統都存在的擴展性問題,視具體情況而定吧。


圖來自官方 Cluster Mode Overview

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 )

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


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


集群是是並行的基礎,剛需。RDD 分區數決定了Task數量 ,為並行提供了可能。至於能否並行執行由CPU的核數來決定。比如8核,那麼那麼一台機器可以同時跑8個任務,如果是3核的話,8個任務輪流執行


一般來說,這三個Metrics與並行度都是正相關。多核可以理解為也就是多節點。但是有如下幾個特殊情況(我實驗證明過):節點數遠大於RDD partitions數目,RDD partitions數目遠大於節點數。這兩種情況都會出現負相關。


並行度,當然是這個越多越好,但是時效性就不是了,都是追求時效,看並行沒什麼用。


http://stackoverflow.com/questions/31359219/relationship-between-rdd-partitions-and-nodes


我要搭建個集群,集群中的伺服器需要分配給各個節點CPU、內存資源,這個怎麼實現?需要什麼開源軟體?


推薦閱讀:

1.5版本的Spark自己來管理內存而不是使用JVM,這不使用JVM而是自己來管理內存是咋回事?
還有必要學習Hadoop 么?
大家覺得目前 初學者學數據做hadoop時的集群配置是不是特別麻煩?有沒有一種便捷的方法?
如何在 Spark 機器學習中應用 scikit-learn?
Hadoop、spark、SaaS、PaaS、IaaS、雲計算概念區分?

TAG:Spark |