[英]Spark 2.0 Standalone mode Dynamic Resource Allocation Worker Launch Error
[英]how does Spark standalone implement resource allocation
我一直在閱讀Spark的源代碼,但我仍然無法理解Spark獨立如何實現資源隔離和分配。 例如,Mesos使用LXC或Docker來實現容器以進行資源限制。 那么Spark Standalone如何實現這一點呢。 例如,我在一個執行程序中運行了10個線程,但Spark只給執行程序一個核心,那么Spark如何保證這10個線程只在一個cpu核心上運行。
在下面的測試代碼之后,事實證明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()
}
}
下面的問題:我很好奇,如果我在Spark + Mesos上運行上面的代碼,會發生什么,Mesos會限制只在一個核心上運行的4個線程。
但我仍然無法理解Spark獨立如何實現資源隔離和分配。
使用Spark,我們有一個Master節點和Worker節點的表示法。 我們可以將后者視為資源池。 每個worker都有CPU和RAM,它帶來了池,Spark作業可以利用該池中的資源來進行計算。
Spark Standalone具有Executor的表示法,Executor是處理計算的過程,我們從資源池中提供資源。 在任何給定的執行器中,我們運行由不同任務組成的計算的不同階段 。 現在,我們可以控制給定任務使用的計算能力(核心)量(通過spark.tasks.cpu
配置參數),並且我們還可以控制給定作業可能具有的一般計算能力(通過spark.cores.max
,它告訴集群管理器中總的資源如何,我們想給我們正在運行的特定作業)。 請注意,默認情況下Standalone是最安全的,並將在群集中的每個Worker節點上安排執行程序。 通過使用動態分配,我們可以對我們擁有的實際執行程序數量進行更精細的控制。
例如,我在一個執行程序中運行了10個線程,但Spark只給執行程序一個核心,那么Spark如何保證這10個線程只在一個cpu核心上運行。
Spark不會驗證執行只發生在單個核心上。 Spark不知道它將從底層操作系統獲得哪個CPU周期。 Spark Standalone嘗試做的是資源管理,它告訴你“看,你有X個CPU和Y量的RAM,如果你沒有正確地划分你的資源,我不會讓你安排工作”。
Spark standalone僅處理資源分配 ,這是一項簡單的任務。 所需要的就是密切關注:
它沒有處理資源隔離 。 具有更廣范圍的YARN和Mesos不實現資源隔離,而是依賴於Linux控制組( cgroups
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.