2017-02-13 120 views
0

我想我不明白如何發佈工作。如何啓動並行火花作業?

我有一項工作需要60秒才能完成。我用下面的命令來運行它:

spark-submit --executor-cores 1 \ 
      --executor-memory 1g \ 
      --driver-memory 1g \ 
      --master yarn \ 
      --deploy-mode cluster \ 
      --conf spark.dynamicAllocation.enabled=true \ 
      --conf spark.shuffle.service.enabled=true \ 
      --conf spark.dynamicAllocation.minExecutors=1 \ 
      --conf spark.dynamicAllocation.maxExecutors=4 \ 
      --conf spark.dynamicAllocation.initialExecutors=4 \ 
      --conf spark.executor.instances=4 \ 

如果我增加分區的數量從代碼和執行者,應用程序將更快地完成,它是確定的數量。但是,如果我只增加executor-cores,結束時間是一樣的,我不明白爲什麼。我預計時間會低於初始時間。

我的第二個問題是,如果我啓動兩次以上的代碼,我希望這兩個作業在60秒內完成,但這不會發生。兩個工作120秒後完成,我不明白爲什麼。

我在AWS EMR上運行此代碼,在2個實例上(每個4 cpu,每個cpu有2個線程)。從我在默認EMR配置中看到的,使用CapacityScheduler將紗線設置爲FIFO(默認)模式。

您對這個問題有什麼看法?

回答

1

Spark根據數據源中的邏輯創建分區。在你的情況下,它可能會創建一個小於執行程序執行程序內核數量的分區,所以只是增加內核不會使它運行得更快,因爲這些分區會空閒。當你也增加分區數時,它可以更快地工作。

當你運行spark-submit兩次,動態分配很有可能在第二個啓動之前達到執行程序的最大分配(在你的情況下默認大約需要4秒)。根據定義紗線的方式,這可能會填滿所有可用的執行程序(可能是因爲定義的線程數太少或內存已滿)。在任何情況下,如果確實發生這種情況,第二個spark-submit將不會開始處理,直到某個執行器被釋放,這意味着它需要時間總和。

順便說一句,在集羣模式下,司機也拿起一個執行器...