前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0588-6.1.0-命令行动态指定MapReduce运行参数无效问题分析

0588-6.1.0-命令行动态指定MapReduce运行参数无效问题分析

作者头像
Fayson
发布2019-04-28 18:07:56
1.2K0
发布2019-04-28 18:07:56
举报
文章被收录于专栏:Hadoop实操

作者:余枫

1

文档编写目的

在本地完成MapReduce程序的开发后,打包提交到服务器上,然后在命令行使用hadoop jar命令运行,并在运行时动态的指定参数(如:Map和Reduce的内、资源池等参数)。通过在命令行添加“-D mapreduce.job.queuename=资源池名”的方式来指定。本篇文章Fayson主要讲述动态指定MapReduce作业参数无效问题分析。

2

问题描述

Cloudera Manager上资源池放置规则如下:放置规则第一条指定的池不存在时,则自动创建。

在命令行执行如下命令,指定作业到root.test资源池下:

代码语言:javascript
复制
hadoop jar xxx.jar -D mapreduce.job.queuename=root.test

通过上图可以看到,MapReduce作业并未运行在指定的资源池。

3

问题分析

在同一用户下,执行了Hadoop自带的jar,使用同样的方式动态指定资源池,发现任务跑在了指定的资源池下

经上述测试推测可能是自己开发的MapReduce代码的问题,通过对比Hadoop自带的示例代码发现,Hadoop的示例代码中继承了Configured类并实现了Tool接口。而自己写的MapReduce代码如下未继承和实现Hadoop的类。

4

问题解决

在MapReduce代码中添加Configured类的继承并实现了Tool接口。修改后的代码如下:

修改启动类后,再将程序重新打包,运行时指定参数如下:

发现任务成功运行在指定的资源池下:

关于ToolRunner接口的说明:

为什么实现Tool后,动态参数就能生效呢?说到Tool,就不得不提到一个类GenericOptionsParser。该类是Hadoop框架中解析命令行参数的基本类。它能够解析命令行参数,让程序运行时能够动态的指定一些资源上的配置。在上面的代码中可以看到,在main方法中调用了ToolRunner类的run方法。ToolRunner类中的run方法内使用了GenericOptionsParser类来解析命令行参数,最终ToolRunner类的run方法里调用的还是MrDriver类中重写的run方法。见下图源码:

ToolRunner.run方法的参数中看到,传入的tool参数就是我们自己编写的MrDriver类,所以ToolRunner类最终调用了我们自己重写的run方法,并且通过GenericOptionsParser解析命令行参数后将解析的参数Set到Configuration对象中,最终调用MrDriver.run方法实现作业运行参数的动态指定。

5

总结

1.在写MapReduce程序时,应继承Configured类并实现Tool接口,这样在运行jar包时可以动态的指定参数,比在代码中硬编码要灵活很多。

2.当有的参数需要修改时,也不用重新对代码进行打包、编译、部署等操作。

3.不单是资源池相关参数的指定,实现Tool后,配置文件中的其他参数也可以在命令行动态的指定,但一定要注意配置参数不能写错否则不生效。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档