一、现状
当前yarn上任务只有队列间的资源抢占,队列内缺乏任务优先级配置,因此所有任务的优先级都是默认的,默认优先级的配置通过此参数配置yarn.scheduler.capacity.root.<leaf-queue-path>.default-application-priority,默认值为0;此外hive on tez的任务在maper阶段会尽可能申请所需的最大资源来运行,极端情况下如果存在一个有问题的任务一直占用集群所有资源会导致其他任务都无法运行,因此需要一种方式能够让重要的任务尽可能的抢占到资源。
当前yarn的队列资源调度使用的是capacity容量调度器,该调度器支持队列间和队列内抢占的,当前的集群配置也是启用了两类抢占方式的,但队列内的抢占依赖任务的优先级,从网上找到的内容是需要在任务运行前配置SET mapreduce.job.priority=50,尝试过没有效果,造成无效有两个原因:
一是最大优先级参数(yarn.cluster.max-application-priority)没有配置,hadoop官网可以查到该值得默认值是0,设置为大于最大优先级的值时均按最大优先级设置;
二是tez中设置任务优先级的参数确实不是mapreduce.job.priority,通过查看tez源码发现对应的参数应该为tez.am.application.priority,该值越大代表获取资源的优先级越高。
二、集群配置
增加最大优先级参数配置yarn.cluster.max-application-priority=100;意味着在配置任务优先级tez.am.application.priority时值不能大于该值。
三、使用方式
在hive sql运行前配置set tez.am.application.priority=【0到100之间的数字】
验证方式: 在yarn页面中找到对应任务,查看Application Priority值是否为配置的值。