環境:
cdh5.7.1
cdh5.7.1中的spark版本為spark1.6
關於如何配置動態資源分配,參見:
cloudera manager中的預設配置時開啟了spark 動態資源分配的,也就是spark.dynamicallocation.enabled=true,但是動態配置相關的預設引數好像不是很合理,比如spark.dynamicallocation.schedulerbacklogtimeout這個引數的預設值是1秒,即當任務排程延遲超過1秒的時候,會請求增加executor,而且是指數形式的請求,比如第一次請求1個(下一次檢測週期是由spark.dynamicallocation.sustainedschedulerbacklogtimeout這個引數來決定,預設是和spark.dynamicallocation.schedulerbacklogtimeout一樣),第二次就會請求2個,第三次4個executor。
spark.dynamicallocation.minexecutors(預設0)和spark.dynamicallocation.maxexecutors(預設無限大)分別來控制動態資源分配的上下線。即申請最多不會超過maxexecutors,**executors到minexecutors,可以通過spark.dynamicallocation.initialexecutors來設定啟動的時候初始化多少個executors,不設定的話,預設初始化spark.dynamicallocation.minexecutors個executor.
當某個executor空閒時間超過spark.dynamicallocation.executoridletimeout值時(預設60秒),會**該executor占用的資源,銷毀該executor.
針對實時程式如果也要動態分配資源的話,有些預設值就需要根據實際情況調整一下了,比如spark.dynamicallocation.initialexecutors設定成2,如果每個executor乙個vcore的話,至少啟動兩個executor,乙個core給receiver用,乙個core用來執行計算任務。
另外實時程式首個batch可能會有一些初始化的動作在裡面,比如初始化了資料庫連線池,初始化redis連線池等等,可能處理時間會較長,如果按spark.dynamicallocation.schedulerbacklogtimeout預設的1秒閾值的話,那麼就會開始申請增加executors了,這樣不是很合理,可以根據實際初始化時長適當將該引數調大一點,比如調成10秒鐘。
當指定了--num-executors,即明確指定了executor的個數,即使你設定了spark.dynamicallocation.enabled=true,動態資源分配也將無效。這點可以在driver stderr的warn日誌中看到如下警告:
17/02/08 15:03:53 warn spark.sparkcontext: dynamic allocation and num executors both set, thus dynamic allocation disabled.
另外還是建議在spark streaming中不要採用動態資源分配,如果資料來源不可靠,比如flume,在**executor的時候可能會導致資料丟失。
spark動態資源分配
spark動態資源調整其實也就是說的executor數目支援動態增減,動態增減是根據spark應用的實際負載情況來決定。1.將spark.dynamicallocation.enabled設定為true。意思就是啟動動態資源功能 2.將spark.shuffle.service.enabled設定為...
Spark如何進行動態資源分配
對於spark應用來說,資源是影響spark應用執行效率的乙個重要因素。當乙個長期執行的服務,若分配給它多個executor,可是卻沒有任何任務分配給它,而此時有其他的應用卻資源緊張,這就造成了很大的資源浪費和資源不合理的排程。動態資源排程就是為了解決這種場景,根據當前應用任務的負載情況,實時的增減...
動態規劃 資源分配
動態規劃的決策不是線性的而是全面考慮到各種不同情況分別進行決策,最後通過多階段決策逐步找出問題最優解。而當前決策也會依賴於上一階段的決策,此時便會發生狀態的轉移。動態規劃演算法可以說是一種 聰明的蠻力法 因為動態規劃是會考慮到每一種可能,而聰明的地方是相對於蠻力法,它去掉了很多沒必要的運算。例1 資...