Notzuonotdied 2020-01-21
环境:CDH5.13.3 spark2.3
在提交任务之后,发现executor运行少量几台nodemanager,而其他nodemanager没有executor分配。
通过spark-shell模拟如下:
第一次尝试分配6个exeutor,具体如下
spark2-shell --driver-memory 1G --executor-memory 2G --num-executors 6 --executor-cores 3
第二次尝试分配20个executor,具体如下
spark2-shell --driver-memory 1G --executor-memory 2G --num-executors 20 --executor-cores 3
环境调度策略为公平调度,即FairScheduler,而这种情况是由公平调度中的一个参数有关:
<property>
<name>yarn.scheduler.fair.assignmultiple</name>
<value>true</value>
<discription>whether to allow multiple container assignments in one heratbeat defaults to false</discription>
</property>
在一次心跳请求中,是否分配多个container,CDH5.13.3默认设置为true。原生hadoop默认是false
<property>
<name>yarn.scheduler.fair.max.assign</name>
<value>-1</value>
</property>
如果上面设置的允许一次分配多个container,那么最多分配多少个,默认无限制。根据实际资源情况
将yarn.scheduler.fair.assignmultiple设置为false,再测试如下:
spark2-shell --driver-memory 1G --executor-memory 2G --num-executors 6 --executor-cores 3
如果在生产环境下,spark任务的executor数量和内存都相对要高很多,所以这种情况会相对有所缓解,具体根据实际情况确定是否需要调整。