导语
在自己的机器上测试了一下三种不同的调度策略
FIFO调度策略
这个策略没啥好讲的,提交一个任务进入队列,调度器根据优先级和到达先后进行排序,一次给每一个应用分配资源,知道没有资源为止。没有人会在生产环境用这个策略,性能太差了。
优点
简单,直接就可以用,不需要额外的配置。早些版本的yarn用FIFO作为默认调度策略,较新版本的yarn用Capacity作为默认调度策略
缺点
- 小应用可能被饿死。大应用进入队列后占用了大量的资源,小应用迟迟得不到资源就卡住了
- 低优先级的任务可能被饿死。当队列内的资源没有剩余时,如果不断有优先级高的任务进入,低优先级的任务不断被往后挤,永远得不到资源
Capacity调度策略
很机智的策略,为了让小任务也能够调度得到资源,划分了多个队列,每个队列内部仍然是FIFO,但是因为划分了不同的资源区,所以可以将小任务提交到资源较少的队列,将大任务提交到资源较多的队列中,但是这样也可能带来资源的浪费
配置
该策略是yarn的默认策略,但是如果不做额外配置的话就只有一个default队列,和FIFO区别不大
通过可以看到,三个子队列分别占据了总资源的10%,20%,70%
从上图可以看到,我配置了三个队列,分别为first,second,third,他们有一个共同的根队列root
弹性资源
资源共享就是为了解决上面说的资源浪费问题的,capacity策略允许队列在空闲时将资源提供给其他队列使用,以此提高资源利用率
我将三个队列的配置都设置为了100,这代表着当我first,second队列无任何任务时,third队列可以占用所有的资源,但这同样会出现问题就是当某个队列占用了大量弹性资源之后其他队列有新任务进来就抢不回资源了
测试
我先向third队列提交了四个任务,可以发现,队列的使用率达到了125%,这说明他占有了一部分本来应该属于first和second队列的资源
之后继续向first队列提交一个任务,占满了所有的资源
继续向second队列提交一个任务,结果就是它搞不到资源了,无法运行
优先级设置
yarn允许我们为application设置优先级,优先级越高的应用越早被调度。只适用于FIFO的调度算法
实际使用时这里有两个坑,会导致优先级设置无效
第一个是需要在yarn-site.xml中指定yarn.cluster.max-application-priority参数,这个参数限制了一个application最大的优先级可以是多少。在yarn-default.xml中我们可以发现这个值默认是0,也就是说如果不改不管我提交的优先级是1,2,4或是8最后都会被改成0,无语死了
第二个是yarn.scheduler.capacity.root.<leaf-queue-path>.default-application-priority参数,指定某个队列的默认优先级,这个不设置好像也没什么问题
仔细看文档还是很重要的
测试
我先提交了四个app,优先级都是3,并且占据了所有的资源。
这时候我继续提交了一个优先级为1的app,状态处于Accept,等待被分配资源
我又继续提交了一个优先级为5的app和6的app,均处于Accept状态
使用yarn application -kill命令kill掉第一个提交的app
观察结果,可以发现优先级为5和6的app都进入到了Running状态,而优先级为1的app仍然在等待资源分配
生命周期设置
yarn.scheduler.capacity.<queue-path>.maximum-application-lifetime参数可以设置某个队列中应用的最大生命周期
yarn.scheduler.capacity.root.<queue-path>.default-application-lifetime参数可以设置默认生命周期
简单理解就是到期了就被kill
用户资源限制
优点
- 防止小应用饿死,通过队列划分达到资源合理分配的目的
缺点
- 队列配置麻烦,父队列,子队列,每个队列还有各自的生命周期,优先级,最大资源,最小资源,用户最大资源,用户最小资源配置,麻烦的不行
- 同一个队列中低优先级任务饿死的情况仍然存在,对于多个用户的情况,可以通过限制队列中单个用户占用资源上限来解决这个问题,但是对于单个用户的情况,没有更好的处理方式
- 队列与队列之间资源占用问题,这其实是个权衡的问题,如果希望提高整体的资源利用率,可以将弹性资源调大一点,如果希望保证队列之间的公平性,就把弹性资源调小一点
Fair调度策略
配置
需要配置下yarn-site.xml指定调度器类型
然后要在配置目录下创建fair-scheduler.xml配置文件
我指定了四个队列,权重都为1,所以理论上他们平分资源才是公平的
可以看到steady fair share都是25%
当我向first队列提交了两个任务之后,可以看到虚线部分是first占用的动态资源