1. 程式人生 > >Spark如何進行動態資源分配

Spark如何進行動態資源分配

一、操作場景

對於Spark應用來說,資源是影響Spark應用執行效率的一個重要因素。當一個長期執行的服務,若分配給它多個Executor,可是卻沒有任何任務分配給它,而此時有其他的應用卻資源緊張,這就造成了很大的資源浪費和資源不合理的排程。

動態資源排程就是為了解決這種場景,根據當前應用任務的負載情況,實時的增減Executor個數,從而實現動態分配資源,使整個Spark系統更加健康。

二、動態資源策略

1、資源分配策略

開啟動態分配策略後,application會在task因沒有足夠資源被掛起的時候去動態申請資源,這種情況意味著該application現有的executor無法滿足所有task並行執行。spark一輪一輪的申請資源,當有task掛起或等待spark.dynamicAllocation.schedulerBacklogTimeout

(預設1s)`時間的時候,會開始動態資源分配;之後會每隔spark.dynamicAllocation.sustainedSchedulerBacklogTimeout(預設1s)時間申請一次,直到申請到足夠的資源。每次申請的資源量是指數增長的,即1,2,4,8等。
之所以採用指數增長,出於兩方面考慮:其一,開始申請的少是考慮到可能application會馬上得到滿足;其次要成倍增加,是為了防止application需要很多資源,而該方式可以在很少次數的申請之後得到滿足。

2、資源回收策略

當application的executor空閒時間超過spark.dynamicAllocation.executorIdleTimeout(預設60s)

後,就會被回收。

三、操作步驟

1、yarn的配置

首先需要對YARN進行配置,使其支援Spark的Shuffle Service。

修改每臺叢集上的yarn-site.xml:

 - 修改
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle,spark_shuffle</value>
</property>
- 增加
<property>
<name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
<value>org.apache.spark.network.yarn.YarnShuffleService</value>
</property>
<property>
<name>spark.shuffle.service.port</name>
<value>7337</value>
</property>

  

將$SPARKHOME/lib/spark-X.X.X-yarn-shuffle.jar拷貝到每臺NodeManager的${HADOOPHOME}/share/hadoop/yarn/lib/下, 重啟所有修改配置的節點。

 

2、Spark的配置

配置$SPARK_HOME/conf/spark-defaults.conf,增加以下引數:

spark.shuffle.service.enabled true   //啟用External shuffle Service服務
spark.shuffle.service.port 7337 //Shuffle Service預設服務埠,必須和yarn-site中的一致
spark.dynamicAllocation.enabled true  //開啟動態資源分配
spark.dynamicAllocation.minExecutors 1  //每個Application最小分配的executor數
spark.dynamicAllocation.maxExecutors 30  //每個Application最大併發分配的executor數
spark.dynamicAllocation.schedulerBacklogTimeout 1s 
spark.dynamicAllocation.sustainedSchedulerBacklogTimeout 5s

  

四、啟動

使用spark-sql On Yarn執行SQL,動態分配資源。以yarn-client模式啟動ThriftServer:

cd $SPARK_HOME/sbin/
./start-thriftserver.sh \
--master yarn-client \
--conf spark.driver.memory=10G \
--conf spark.shuffle.service.enabled=true \
--conf spark.dynamicAllocation.enabled=true \
--conf spark.dynamicAllocation.minExecutors=1 \
--conf spark.dynamicAllocation.maxExecutors=300 \
--conf spark.dynamicAllocation.sustainedSchedulerBacklogTimeout=5s

啟動後,ThriftServer會在Yarn上作為一個長服務來運