2016-12-06 96 views
1

火花是如何將一個分區分配給執行者的。何時以及如何將火花分配給執行者

當我跑在火花殼以下行1個驅動器和第5個執行人:

> var data = sc.textFile("file") // auto generates 2 partitions 
> data.count()     // materialize partitions on two nodes 
> data = data.repartition(10) // repartition data.count()    
> data.count()     // 10 partitions still on original 2 nodes 

重新分區後,將10個分區仍然位於原始的兩個節點上(5分)。這看起來效率很低,因爲5個任務在包含分區的每個節點上重複運行,而不是在節點間均勻分佈。低效率對於在相同rdds上重複多次的迭代任務是最明顯的。

所以我的問題是,火花是如何決定哪個節點具有哪個分區的,有沒有辦法可以強制數據移動到其他節點?

+0

你說的是兩個節點,但你有一個Executor,這沒什麼意義。他在談論什麼? –

+0

對不起,這是一個錯字,剛剛編輯。感謝您指出 – Yituo

+0

您是否遇到Sparks任務分配問題?或者這是一個普遍的問題?每個Executor有多少個內核? –

回答

0

我只是在這裏提供一個猜測來顯示邏輯(不一定是真的發生了什麼)。

讓我們假設你的文件不是很大,也就是說它適合HDFS的1個塊。並假定該塊被複制到2個節點。如果你想在第三節點上進行處理,那麼這意味着你需要複製它。由於count是一個相對較快的計算,因此處理任務所需的時間可能相對較少。 Spark可能已決定等待並在本地執行處理,而不是將數據混洗到其他節點(您可以配置此參數)。

+1

你知道我怎麼配置這樣它會洗牌?我想做一個重複性的迭代任務,因此需要洗牌 – Yituo