写点什么

Spark 的动态资源分配

用户头像
小舰
关注
发布于: 2021 年 04 月 14 日

在进行 Spark 任务提交的时候,我们知道 Spark 提供了诸如 num-executor、executor-memory 等参数用来控制资源的申请和使用。但是你是否遇到过提交了任务后,当资源队列资源充足的时候,spark 任务一直在吃内存的情况,貌似有点失控,这其实是“动态资源分配”在作怪。

那么什么是动态资源分配呢,简单来讲就是 Spark 根据资源的使用情况来申请资源,需要多少就申请多少,而不是一直独占配置的资源总量。在 Spark 中,是否采用动态资源分配主要靠 spark.dynamicAllocation.enabled 这个配置来决定。如果该值设置为 true,则 Spark 任务会根据工作负载来衡量应该增加或减少 executor 的数量,或者当 executor 有空闲的时候,就会在空闲达到有一定时间之后释放掉。在 CDH 中,该参数默认为 true,在开源版本中,该参数默认为 false。与该参数配置相关的参如下:

spark.dynamicAllocation.enabled 是否开启动态资源配置,根据工作负载来衡量是否应该增加或减少 executor,默认 falsespark.dynamicAllocation.minExecutors 动态分配最小 executor 个数,在启动时就申请好的,默认 0spark.dynamicAllocation.maxExecutors 动态分配最大 executor 个数,默认 infinityspark.dynamicAllocation.initialExecutors 动态分配初始 executor 个数默认值=spark.dynamicAllocation.minExecutorsspark.dynamicAllocation.executorIdleTimeout 当某个 executor 空闲超过这个设定值,就会被 kill,默认 60sspark.dynamicAllocation.cachedExecutorIdleTimeout 当某个缓存数据的 executor 空闲时间超过这个设定值,就会被 kill,默认 infinityspark.dynamicAllocation.schedulerBacklogTimeout 任务队列非空,资源不够,申请 executor 的时间间隔,默认 1sspark.dynamicAllocation.sustainedSchedulerBacklogTimeout 同 schedulerBacklogTimeout,是申请了新 executor 之后继续申请的间隔,默认=schedulerBacklogTimeout


根据以上的配置参数,可以得出在我们日常的 Spark 应用部署时,我们为了达到资源使用的自主可控,可以采取两种措施:

一种是将 spark.dynamicAllocation.enabled 设置为 false,这样我们的 spark 任务就会严格按照我们的参数配置占用资源,例如占用的总资源可以大概估算=executor-memory*num_executor + driver-memory;

另一种是通过设置 spark.dynamicAllocation.maxExecutors 来限制 Spark 任务无上限的使用队列资源,这个参数相当于给 Spark 任务设置了一个资源利用上限,如果申请的总资源达到了这个标准就不再继续申请,哪怕队列还有资源剩余,这也大大减少了队列任务因为资源不够而积压的问题。

下面两个图就分别展示了设置资源上限和不设资源上限所启动的 executor 数量以及资源占用的不同。


总结,我们可以看到,设置了资源使用上限之后,Spark 任务并没有无休止的抢占资源,这对于整个资源队列安全稳定运行还是很重要的。

发布于: 2021 年 04 月 14 日阅读数: 27
用户头像

小舰

关注

公众号:DLab数据实验室 2020.11.12 加入

中国人民大学硕士

评论

发布
暂无评论
Spark的动态资源分配