spark on mesos 兩種執行模式
spark on mesos 有粗粒度(coarse-grained)和細粒度(fine-grained)兩種執行模式,細粒度模式在spark2.0後開始棄用。
細粒度模式
優點
spark預設執行的就是細粒度模式,這種模式支援資源的搶佔,spark和其他frameworks以非常細粒度的執行在同一個叢集中,每個application可以根據任務執行的情況在執行過程中動態的獲得更多或更少的資源(mesos動態資源分配),但是這會在每個task啟動的時候增加一些額外的開銷。這個模式不適合於一些低延時場景例如互動式查詢或者web服務請求等。
啟動spark-shell,啟動時不佔有資源,需要執行task後才去申請
缺點
spark中執行的每個task的執行都需要去申請資源,也就是說啟動每個task都增加了額外的開銷。
在一些task數量很多,可是任務量比較輕的應用中,該開銷會被放大。
例如:
遍歷一個hdfs中擁有3w分割槽的資料(56億條)任務:
粗粒度模式耗時 | 細粒度模式耗時 |
---|---|
50s | 420s |
粗粒度模式
該模式的優點是啟動task的時候開銷比較小,但是該模式執行的時候每個application會一直佔有一定的資源,直到整個application結束後才會釋放資源。
啟動spark-shell,啟動應用時即佔有資源
可以在conf/spark-default.conf中開啟粗粒度模式
spark.mesos.coarse true
在粗粒度模式下,一個application啟動時會獲取叢集中所有的cpu(mesos資源邀約的所有cpu), 這會導致在這個application執行期間你無法再執行其他任務。你可以控制一個application獲取到的最大資源來解決這個問題。
例如你可以設定最大的cpu使用數
在conf/spark-default.conf中設定
spark.cores.max 10
這樣提交任務後,application會一直佔用10個cpu,不會增加也不會減少,直到完全執行結束。
spark在1.5中提供了動態executor調整的功能,可以緩解資源長期不釋放的問題。
一些相關引數
屬性名 | 預設值 | 描述 |
---|---|---|
spark.mesos.coarse | false | 是否使用粗粒度模式執行spark任務| |
spark.mesos.extra.cores | 0 | 只能在粗粒度模式下使用,為每個task增加額外的cpu,但是總的cpu數不會超過spark.cores.max設定的數量 |
spark.mesos.mesosExecutor.cores | 1.0 | 即使spark task沒有執行,每個mesos executor也會持續的擁有這些cpu,可以設定浮點數 |
spark.mesos.executor.memoryOverhead | executor memory * 0.10, with minimum of 384 | 每個executor額外的一些記憶體,單位是mb,預設情況下,該值是spark.executor.memory 的0.1倍,且不小於384mb。如果進行了設定,就會變成你設定的值 |