spark默认调度模式:
Spark中的调度模式主要有两种:FIFO和FAIR。默认情况下Spark的调度模式是FIFO(先进先出),谁先提交谁先执行,后面的任务需要等待前面的任务执行。
而FAIR(公平调度)模式支持在调度池中为任务进行分组,不同的调度池权重不同,任务可以按照权重来决定执行顺序。使用哪种调度器由参数spark。scheduler。mode来设置,可选的参数有FAIR和FIFO,默认是FIFO。
含义
Spark默认采取FIFO策略运行多个Jobs,它提供一个队列来保存已经提交的Jobs,如果队头的Job不需要占用所有的集群资源,那么后续的 Job可以立即运行,但是如果队头的Job需要占用所有的集群资源,且运行时间很长,那么即使后续的Job很小,也要等待前面的Job执行完后才可以执 行,这样就造成了大量的延迟。
如前文,为了彻底解决Yarn提交任务之后停留在ACCEPTED的问题,我们对Yarn的资源分配做了多组实验,过程及结果如下。
调度方式:FairScheduler
节点配置信息:
Spark on Yarn实验:
client模式和cluster模式差距不大,统一用client运行一个资源消耗比较大的连表Spark SQL查询并输出。
实验结果:
成功运行
Driver:1核3g
excutor:1核3g
executor数量:6个
实验结果:
成功运行:
Driver:1核3G
Executor:1核3G
Executor个数:2个
实验结论1:在Fair模式下,不指定Executor数量,则会尽量多的配置,结果不固定;指定数量的话,按照指定的来配置。
实验结果:
成功运行:
Driver:1核5G
Executor:2核5G
Executor个数:2个
实验结果:
成功运行
Driver:1核5G
Executor:2核5G
Executor个数:2个
Driver: 2核4g
executor:3核8g
executor/container数量:未指定
实验结果:
在Spark端就挂掉了
java.lang.IllegalArgumentException: Required executor memory (8192), overhead (819 MB), and PySpark memory (0 MB) is above the max threshold (6144 MB) of this cluster! Please check the values of 'yarn.scheduler.maximum-allocation-mb' and/or 'yarn.nodemanager.resource.memory-mb'.
这个主要是因为我们设置了单个应用最大申请的资源为3核6g,超过的拒绝接受,发token。
实验结果:
Driver:1核5g(不知道为什么CPU核被削减了)
Exexutor:3核6g
executor/container数量:2个
实验结果:
运行成功
Driver:1核5g
Exexutor:3核6g
executor/container数量:未指定
综上来看,对每个任务进行资源限制,是非常重要的!!
接下来我们测试多任务在Fair Scheduler的调度情况。
我们统一设置为一个队列。
任务2资源申请同任务1
实验结果:
任务1运行成功,任务2ACCEPTED。
任务1运行结束,任务2RUNNING。
任务2资源申请同任务1
实验结果:
任务1运行成功,分配了4个Executor
任务2Accepted了..
在任务1运行结束后,任务2长时间ACCEPTED了。。。
原来是同事把主机名给改了,看了日志才知道,Yarn不认识,一直在发请求,重新实验。
同时RUNNING起来了。
经验教训:多读日志!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)