spark动态资源分配

2018-06-11  本文已影响73人  尼小摩

spark动态资源分配默认是不开启的,并且只要设置了num-executors设置了作业的executor数,就不再有效;
http://spark.apache.org/docs/latest/configuration.html#dynamic-allocation
作业中设置,需要在conf中加入以下配置项:

spark.dynamicAllocation.enabled false 是否要开启DRA功能,要开启则设置为true,设置为true需要将spark.shuffle.service.enabled
设置为true;
spark.dynamicAllocation.executorIdleTimeout 60s executor空闲多长时间就被移除释放
spark.dynamicAllocation.cachedExecutorIdleTimeout infinity 这个要考虑cache数据的时候,有cache数据要空闲多长时间才能移除;默认无限,首先保证cache的数据后面操作需要的时候是不能移除的,这个要注意;
spark.dynamicAllocation.initialExecutors spark.dynamicAllocation.minExecutors 初始化的executor数
spark.dynamicAllocation.maxExecutors infinity 动态的时候最多executor数
spark.dynamicAllocation.minExecutors 0 动态的时候最少executor数
spark.dynamicAllocation.schedulerBacklogTimeout 1s 表示积压多久任务的时候要新申请executor
spark.dynamicAllocation.sustainedSchedulerBacklogTimeout schedulerBacklogTimeout

例如:

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

动态资源分配策略:

开启动态分配策略后,application会在task因没有足够资源被挂起的时候去动态申请资源,这种情况意味着该application现有的executor无法满足所有task并行运行。spark一轮一轮的申请资源,当有task挂起或等待spark.dynamicAllocation.schedulerBacklogTimeout(默认1s)时间的时候,会开始动态资源分配;之后会每隔spark.dynamicAllocation.sustainedSchedulerBacklogTimeout(默认1s)时间申请一次,直到申请到足够的资源。每次申请的资源量是指数增长的,即1,2,4,8等。

之所以采用指数增长,出于两方面考虑:其一,开始申请的少是考虑到可能application会马上得到满足;其次要成倍增加,是为了防止application需要很多资源,而该方式可以在很少次数的申请之后得到满足。

资源回收策略

当application的executor空闲时间超过spark.dynamicAllocation.executorIdleTimeout(默认60s)后,就会被回收。

上一篇下一篇

猜你喜欢

热点阅读