spark動態資源調整其實也就是說的executor數目支援動態增減,動態增減是根據spark應用的實際負載情況來決定。
1.將spark.dynamicallocation.enabled設定為true。意思就是啟動動態資源功能
2.將spark.shuffle.service.enabled設定為true。 在每個nodemanager上設定外部shuffle服務
2.1 將spark--yarn-shuffle.jar拷貝到每台nodemanager的$/share/hadoop/yarn/lib/下。
2.2 配置yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle,spark_shuffle
yarn.nodemanager.aux-services.spark_shuffle.class
org.apache.spark.network.yarn.yarnshuffleservice
spark.shuffle.service.port
7337
2.3 重啟所有nodemanager
request策略
當有被掛起的任務(pending task)的時候,也就表示當前的executor數量還不足夠所有的task並行執行,這時候spark會申請增加資源,
但是並不是出現pending task就立刻請求增加executor。由下面兩個引數決定,如下:
如果啟用了動態資源分配功能,如果有pending task並且等待了一段時間(預設1秒),則增加executor
隨後每隔n秒(預設1秒),再檢測pending task,如果仍然存在,增加executor。
此外每輪請求的executor數量是指數增長的。 比如,在第一輪中新增1個executor,然後在隨後的輪中新增2、4、8,依此類推。
remove策略
如果某executor空閒超過了一段時間,則remove此executor,由下面引數決定:
spark.dynamicallocation.executoridletimeout:預設60秒
初始executor數量,如果--num-executors設定的值比這個值大,那麼將使用--num-executors設定的值作為初始executor數量。
executor數量的上限,預設是無限制的。
executor數量的下限,預設是0個
如果executor內有快取資料(cache data),並且空閒了n秒。則remove該executor。預設值無限制。也就是如果有快取資料,則不會remove該executor
為什麼?比如在寫shuffle資料時候,executor可能會寫到磁碟也可能會儲存在記憶體中,如果儲存在記憶體中,該executor又remove掉了,那麼資料也就丟失了。
使用spark thriftserver將spark作為乙個長期執行的服務。使用者通過jdbc來提交sql查詢:
$spark_home/sbin/start-thriftserver.sh--executor-memory 20g --executor-cores 5 --driver-memory 10g --driver-cores 5
\--conf spark.dynamicallocation.enabled=true
\--conf spark.shuffle.service.enabled=true
\--conf spark.dynamicallocation.initialexecutors=20
\--conf spark.dynamicallocation.minexecutors=20
\--conf spark.dynamicallocation.maxexecutors=400
\--conf spark.dynamicallocation.executoridletimeout=300s \
--conf spark.dynamicallocation.schedulerbacklogtimeout=10s \
我們先看看,動態資源調整需要解決哪幾個問題:
cache去掉了重算即可。為了防止資料抖動,預設包含有cache的executor是不會被刪除的,因為預設的idle時間設定的非常大:
private val cachedexecutoridletimeouts =conf.gettimeasseconds(你可以自己設定從而去掉這個限制。"spark.dynamicallocation.cachedexecutoridletimeout",
s"$s")
而對於shuffle,則需要和yarn整合,需要配置yarn.nodemanager.aux-services
。具體配置方式,大家可以google。這樣spark executor就不用儲存shuffle狀態了。
我們發現,dra(dynamic resource allocation)涉及到的點還是很多的,雖然邏輯比較簡單,但是和任務排程密切相關,是乙個非常動態的過程。這個設計本身也是面向乙個通用的排程方式。
建議如果採用了dra,可以注意如下幾點:
官網關於動態資源分配的文件:
Spark如何進行動態資源分配
對於spark應用來說,資源是影響spark應用執行效率的乙個重要因素。當乙個長期執行的服務,若分配給它多個executor,可是卻沒有任何任務分配給它,而此時有其他的應用卻資源緊張,這就造成了很大的資源浪費和資源不合理的排程。動態資源排程就是為了解決這種場景,根據當前應用任務的負載情況,實時的增減...
動態規劃 資源分配
動態規劃的決策不是線性的而是全面考慮到各種不同情況分別進行決策,最後通過多階段決策逐步找出問題最優解。而當前決策也會依賴於上一階段的決策,此時便會發生狀態的轉移。動態規劃演算法可以說是一種 聰明的蠻力法 因為動態規劃是會考慮到每一種可能,而聰明的地方是相對於蠻力法,它去掉了很多沒必要的運算。例1 資...
關於spark程式動態資源分配的一些理解
環境 cdh5.7.1 cdh5.7.1中的spark版本為spark1.6 關於如何配置動態資源分配,參見 cloudera manager中的預設配置時開啟了spark 動態資源分配的,也就是spark.dynamicallocation.enabled true,但是動態配置相關的預設引數好像...