我正在Spark羣集上分發一些下載任務。輸入來自一個源,它不能總是與Spark的常規方法並行,如parallelize
或textFile
等等。相反,我有一個服務爲我提供了一堆使用parallelize
分發的下載任務(URL +封裝的邏輯來讀取和解密它)。控制Spark中任務的分配
當有幾千個任務時,Spark將任務平均分配給所有從服務器,從而實現最高水平的並行性。但是,當有幾百個任務時,Spark認爲數據集很小,可以在幾個從站上計算,以減少通信時間並增加數據局部性。但是在我的情況中,這是錯誤的,每個任務都可以生成數千個JSON記錄,並且我希望下載能夠通過與羣集中一樣多的機器來執行。
我的那一刻兩個想法:
- 使用
repartition
到分區的數量設置爲使用repartition
設置分區的號碼下載任務數的核心 - 數量
我不喜歡第一個,因爲我必須傳遞一段代碼中的核心數量,這些代碼當前並不需要知道它有多少資源。我一次只運行一個Spark作業,但將來可能會有更多這樣的作業,所以實際上我必須將核心數量除以要在羣集上運行的並行作業數量。我不喜歡第二個,因爲當我只有40個節點時,劃分成數千個分區似乎很尷尬。
有沒有辦法告訴Spark儘可能分配RDD的元素?如果不是,兩種選擇中的哪一種更可取?
你說你不能使用'parallelize'並且你也使用'parallelize'。我理解正確嗎? :) –
啊,我想我明白了!你的意思是你沒有預先提供的數據,只有網址。所以你不能通過'parallelize'分發數據,而是使用'parallelize'來分發這些URL。不介意我... –
@DanielDarabos你說得對了 – Dici