问题背景与现象
Spark任务提交后,任务一直处于Accept状态,无法正常运行。Driver端提示executor memory超限。
原因分析
FusionInsight集群中,Spark任务运行在Yarn的资源管理框架下,由Yarn来负责资源的调度管理,Yarn在接收Spark任务后,任务会先处于Accept状态,待为该任务分配到资源之后,人后然后才会进入Running状态执行如果Yarn上没有足够资源,则任务将一直处于Accept状态。可通过如下方式查看Yarn上资源。
- 查看当前yarn是否有资源可供调度,如果资源不足,则无法正常运行任务。
需要等其他任务运行完才能运行该任务或者考虑扩容,如果资源充足,参考2。
- 确认任务提交的队列是否有足够资源,Spark任务默认提交到default队列,以下以default队列为例。如果队列资源不足,请考虑提交任务到其他队列。如果队列资源充足,参考3。
- 确认当前队列的appmaster资源是否耗尽。
Yarn的资源有参数专门控制有多少比例是给appmster使用,如果该值过小,则会导致,队列有资源的情况下,appmaster正常启动,任务依然无法正常运行。如下图所示,appmster一共有21个vcore已经用尽,此时任务会处于Accept状态。
解决办法
- 对于此种情况属于资源分配不合理,可通过调整参数来增加appmster的可用资源。
- 在C30版本中,可通过调整yarn.scheduler.capacity.maximum-am-resource-percent参数来提高am可用资源比例,修改之后要重启yarn服务。
- 在C50及以后的版本中,该参数废弃掉,需要修改多租户相关参数,在页面选择“Tenant > Dynamic Resource Plan”,修改相应队列的Max Am Resource Percent,修改后,无需重启Yarn。