2016-11-26 53 views
3

我一直在閱讀Spark的源代碼,但是我仍然無法理解Spark standalone如何實現資源隔離和分配。例如,Mesos使用LXC或Docker來實現資源限制的容器。那麼Spark Standalone如何實現這一點。例如我在一個執行程序中運行了10個線程,但Spark只給了執行程序一個核心,那麼Spark如何保證這10個線程只能在一個cpu核心上運行。Spark獨立如何實現資源分配

經過以下測試代碼,事實證明,Spark Standalone資源分配有點虛假。我只有一個Worker(執行器),只給執行器一個內核(該機器共有6個內核),當下面的代碼運行時,我發現有5個內核100%的使用。 (我的代碼拉開序幕4個線程)

object CoreTest { 
    class MyThread extends Thread { 
    override def run() { 
     while (true) { 
     val i = 1+1 
     } 
    } 
    } 
    def main(args: Array[String]) { 
    val conf = new SparkConf().setAppName("core test") 
    val sc = new SparkContext(conf) 
    val memRDD = sc.parallelize(Seq(1), 1) 
    memRDD.foreachPartition { part => 
     part.foreach { 
     x => 
      var hello = new MyThread() 
      hello.start 
      hello = new MyThread() 
      hello.start 
      hello = new MyThread() 
      hello.start 
      hello = new MyThread() 
      hello.start 
      while (true) { 
      val j = 1+2 
      Thread.sleep(1000) 
      } 
     } 
    } 
    sc.stop() 
    } 
} 

以下問題:我很好奇,如果我跑星火+ Mesos上面的代碼,會出現什麼情況,會Mesos限制4個線程只能在一個內核上運行。

回答

3

但我還是不能理解Spark是如何實現資源隔離和分配的。

使用Spark,我們有主節點和工作節點的符號。我們可以將後者視爲資源池。每個工作人員都擁有CPU和RAM,並且Spark作業可以利用該池中的資源進行計算。

Spark Standalone具有Executor的符號,Executor是處理計算的過程,我們從資源池中爲其提供資源。在任何給定的執行者中,我們運行不同的階段,其計算由不同的任務組成。現在,我們可以控制給定任務使用的計算能力(核心)數量(通過spark.tasks.cpu配置參數),並且我們還控制給定作業可能具有的計算能力的總量(通過spark.cores.max,它告訴集羣管理器有多少總計我們想給予我們正在運行的特定工作)。請注意,默認情況下,Standalone是greety,並會在集羣中的每個Worker節點上安排執行程序。我們可以通過使用Dynamic Allocation來更好地控制我們有多少實際的執行者。

例如我在一個執行程序中運行了10個線程,但Spark只給了執行程序一個核心,那麼Spark如何保證這10個線程只能在一個cpu核心上運行。

Spark不驗證執行只發生在單個內核上。 Spark不知道它將從底層操作系統獲得哪個CPU週期。Spark Standalone試圖做的是資源管理,它告訴你:「看,你有X個CPU和Y個RAM,如果你沒有正確分配你的資源,我不會讓你安排任務。」

+0

謝謝Yuval,我在我的問題上寫了更多詳細信息 – Jack

+0

@jack一般不建議您在提問後修改問題,並且人們會努力回答。也許考慮問一個新的問題。 –

2

火花獨立句柄只有資源分配這是一個簡單的任務。所有這一切都需要密切關注:

  • 可用資源。
  • 已分配資源。

它不關心資源隔離。 YARN和Mesos的範圍更廣,但不實現資源隔離,但依賴於Linux控制組(cgroups)。