由于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/
目录。
- 设置队列名称
由于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>
- 设置各队列资源分配
向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>
- 设置各队列资源使用上限
这里需要注意一点,使用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. 指定队列提交任务
- 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. 提交任务文章来源:https://www.toymoban.com/news/detail-569879.html
在-D
参数后设置任务要提交到的调度器队列,其余参数的解释见【Hadoop】MapReduce分布式计算实践(统计文本单词数量),提交任务的命令如下:文章来源地址https://www.toymoban.com/news/detail-569879.html
hadoop jar db_hadoop-1.0-SNAPSHOT-jar-with-dependencies.jar com.imooc.Hadoop.YARN.WordCountJobYARN -D mapreduce.job.queuename=offline /words.txt /out3
到了这里,关于【Hadoop】YARN多资源队列配置及使用实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!