暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spark原理与实战(九)--Spark的动态资源分配策略

DLab数据实验室 2020-12-25
890

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

作者:小舰 中国人民大学计算机硕士

来源:DLab数据实验室(ID:rucdlab)



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


二、资源控制
根据以上的配置参数,可以得出在我们日常的Spark应用部署时,我们为了达到资源使用的自主可控,可以采取两种措施:
一种是将spark.dynamicAllocation.enabled设置为false,这样我们的spark任务就会严格按照我们的参数配置占用资源,例如占用的总资源可以大概估算=executor-memory*num_executor + driver-memory;
另一种是通过设置spark.dynamicAllocation.maxExecutors
来限制Spark任务无上限的使用队列资源,这个参数相当于给Spark任务设置了一个资源利用上限,如果申请的总资源达到了这个标准就不再继续申请,哪怕队列还有资源剩余,这也大大减少了队列任务因为资源不够而积压的问题。
三、总结
下面两个图就分别展示了设置资源上限和不设资源上限所启动的executor数量以及资源占用的不同。

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

文章转载自DLab数据实验室,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论