2016-04-17 37 views
10

我不太明白spark.task.cpus參數。在我看來,如果你願意,執行者中的「任務」對應於「線程」或「進程」。假設我將「spark.task.cpus」設置爲2.Spark中每個任務的CPU數量

  1. 線程如何能夠同時使用兩個CPU?難道它不需要鎖定並導致同步問題?

  2. 我正在查看launchTask()在deploy/executor/Executor.scala中的函數,並且我沒有在此處看到「每個任務的cpus數量」的概念。那麼,Spark最終會在獨立模式下爲多少CPU分配一個任務?

回答

10

要盡我所知spark.task.cpus的你在一些特定的任務,已知有自己內部的(自定義)並行的情況下,集羣控制任務的並行性。

更詳細: 我們知道spark.cores.max定義了多少個線程(又名核)您的應用需求。如果您離開spark.task.cpus = 1,那麼您將同時運行#spark.cores.max個併發Spark任務。

你只需要改變spark.task.cpus如果你知道你的任務本身並行(也許每個任務的派生兩個線程,使用外部工具等進行交互)通過設置相應spark.task.cpus,你成爲一個優秀的「公民」 。現在,如果你有spark.cores.max = 10和spark.task.cpus = 2 Spark只會創建10/2 = 5個併發任務。考慮到你的任務在內部需要(比如說)2個線程,執行線程的總數永遠不會超過10個。這意味着你永遠不會超出你的初始合同(由spark.cores.max定義)。

+4

我會補充說,儘管它在運行時沒有被強制執行(更多的資源利用率提示而不是硬性限制),但它在整個源代碼中被用作'CPUS_PER_TASK' – zero323

+0

您是否有任何示例顯示如何將任務內部並行化? @ zero323,CPUS_PER_TASK用於非常高級別的調度內容,它永遠不會傳遞給執行器。所以,我的問題是「我們如何確保任務獲得它請求的spark.task.cpus核心?」 – smz

+1

最簡單的方法(不是很有用):'rdd.mapPartitions(_。toVector.par.map(foo))'。並回答你的第二個問題 - 我們根本就沒有。它只是說,如果你聲明四個執行核心,並且'spark.task.cpus'等於2,那麼它只能啓動兩個任務。但是有物理內核分配或類似的東西。 Spark中的'core'只是一個線程。 – zero323

相關問題