文章目录
由于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 =newGenericOptionsParser(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
版权归原作者 chaoql 所有, 如有侵权,请联系我们删除。