閱讀1000 返回首頁    go 技術社區[雲棲]


Spark-0.8新增Fair Scheduler資源調度

不同應用之間的資源調度

standalone集群 默認是simple FIFO scheduler,也就是說允許接入的應用使用全量的cpu和mem。如果想要在多用戶下限製,需要設置參數來控製每個應用占有的資源數,比如System.setProperty("spark.cores.max","10"), System.setProperty("spark.executor.memory ","10g")

在standalone模式,yarn模式,和粗粒度的mesos模式下,都是使用static partition的方式,設定每個應用占用的cpu和mem數

mesos還有一種模式(默認細粒度的模式)是dynamic sharing CPU cores,但是mem還是固定獨立分配的。這種模式可能會帶來不可預估的延遲,因為每個node要取回自己的core來work的時候,需要等待釋放。

以上模式裏都不包含可以共享mem的方式。如果要共享內存裏的數據的話,一方麵可以用shark的jdbc接口,處理sql的時候同時共享某些RDD;另一方麵,在未來的發布版本裏,Tachyon會提供另一種方式共享RDDs。


同一個應用下的資源調度

在同一個SparkContext裏,jobs是可以並行跑的,spark的調度器是線程安全的。

但是默認的調度器處理jobs是FIFO的。每個job有若幹個stages(map和reduce的階段),如果前麵的stage把mem和cpu占滿了,那後續來的job裏的stage可能就卡住不能跑了。所以spark-0.8裏出了fair scheduler這個新的調度模式,對jobs的tasks采用輪詢的方式,短的任務在長任務跑的情況下也可以得到資源並行進行,適合多用戶使用的情況

Fair Scheduler提供pool的概念,pool可以設置weight。比如在一個線程上設置(啟動一個SparkContext前)

context.setLocalProperty("spark.scheduler.pool", "pool1")

指定了一個叫pool1的pool,之後該線程下進行的jobs就都屬於這個pool了。且默認的pool平均分享cpu和mem總量(weight默認是1,可以調),每個pool內的job按FIFO模式(pool內job之間是FIFO或Fair是可以設置的)。這樣的話,比如5個user每人一個默認的pool,那麼大家享有的資源量是一樣的,各自執行的任務還是會按先後順序執行。pool除了可以設置weight和改變內部mode外,還可以設置minShare,指這個pool可以額外分享幾個cpu cores,默認是0。Fair Scheduler每次都會嚐試去滿足active pools的minshare量。

以上每個pool的參數和pool名字(種類)可以在一個xml裏聲明,然後在啟動Context的時候使用:

System.setProperty("spark.scheduler.allocation.file", "/path/to/file")

下圖為源碼裏和這部分相關的類圖:



(全文完)

最後更新:2017-04-03 14:53:52

  上一篇:go ruby便捷進門
  下一篇:go 備份遠程服務器文件簡單shell腳本