【Hadoop】YARN多资源队列配置及使用实践

       由于MapReduce默认采用Capacity Scheduler(详见【Hadoop】YARN简述),因此理论上可以存在多个队列,而默认只有一个队列(default),现有需求:额外创建两个队列分别为online和offline,将这三个队列的资源分别分配为70%、10%、20%,且允许在资源不足时借用其他队列的资源,但最多不能超过70%(online队列里面运行实时任务,offline队列里面运行离线任务,MapReduce属于离线任务),最后将WordCount任务提交到offline队列执行。

1. 多资源队列配置

       资源队列的配置需要修改capacity-scheduler.xml文件,该文件位于hadoop-3.2.0/etc/hadoop/目录。

  1. 设置队列名称
    由于yarn.scheduler.capacity.root.queues标签已经存在了,只需在<value>中添加另外两个队列的名称即可。
<property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>default,online,offline</value>
    <description>
      The queues at the this level (root is the root queue).
    </description>
</property>
  1. 设置各队列资源分配
    capacity-scheduler.xml文件中添加如下代码:
<property>
    <name>yarn.scheduler.capacity.root.default.capacity</name>
    <value>70</value>
    <description>default队列70%</description>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.online.capacity</name>
    <value>10</value>
    <description>online队列10%</description>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.offline.capacity</name>
    <value>20</value>
    <description>offline队列20%</description>
  </property>

  1. 设置各队列资源使用上限
    这里需要注意一点,使用PC虚拟机学习时如果资源卡得太紧(设置最大使用上限等于资源分配比例),有可能导致向资源分配少的队列中提交Job时,无法启动Map任务。向capacity-scheduler.xml文件中添加如下代码:
<property>
    <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
    <value>70</value>
    <description>
      The maximum capacity of the default queue. 
    </description>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.online.maximum-capacity</name>
    <value>70</value>
    <description>online队列可使用的资源上限.</description>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.offline.maximum-capacity</name>
    <value>70</value>
    <description>offline队列可使用的资源上限.</description>
  </property>

2. 指定队列提交任务

  1. WordCount代码修改

       原项目代码见【Hadoop】MapReduce分布式计算实践(统计文本单词数量),在main函数中添加如下代码:

String[] otherArgs = new GenericOptionsParser(configuration, args).getRemainingArgs();

       上面添加的这段代码会处理一些系统参数,并留下用户真正想传入的其他参数otherArgs,因为传参数的途径发生变化,所以修改输入输出路径相关代码,把所有的args[0]改为otherArgs[0]GenericOptionsParser中处理-D参数的源码如下:

if (line.hasOption('D')) {
     String[] property = line.getOptionValues('D');
     for(String prop : property) {
         String[] keyval = prop.split("=", 2);
         if (keyval.length == 2) {
             conf.set(keyval[0], keyval[1], "from command line");
         }
     }
}

       源码中以空格为分隔符提取了-D参数后的字符串数组,对数组中每个字符串使用=作为分隔符切分,若且分出两部分,则配置Configration,否则作为用户传入的其他参数,在程序中正常引用即可。
2. 提交任务

       在-D参数后设置任务要提交到的调度器队列,其余参数的解释见【Hadoop】MapReduce分布式计算实践(统计文本单词数量),提交任务的命令如下:

hadoop jar db_hadoop-1.0-SNAPSHOT-jar-with-dependencies.jar com.imooc.Hadoop.YARN.WordCountJobYARN -D mapreduce.job.queuename=offline /words.txt /out3
posted @ 2023-01-31 23:49  ccql  阅读(286)  评论(0编辑  收藏  举报  来源