在自己的机器上测试了一下三种不同的调度策略
这个策略没啥好讲的,提交一个任务进入队列,调度器根据优先级和到达先后进行排序,一次给每一个应用分配资源,知道没有资源为止。没有人会在生产环境用这个策略,性能太差了。
简单,直接就可以用,不需要额外的配置。早些版本的yarn用FIFO作为默认调度策略,较新版本的yarn用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
需要配置下yarn-site.xml指定调度器类型
然后要在配置目录下创建fair-scheduler.xml配置文件
我指定了四个队列,权重都为1,所以理论上他们平分资源才是公平的
可以看到steady fair share都是25%
当我向first队列提交了两个任务之后,可以看到虚线部分是first占用的动态资源
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。