命令行执行phpunit 类找不到_0588-6.1.0-命令行动态指定MapReduce运行参数无效问题分析...

作者:余枫

1.文档编写目的

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

2.问题描述

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

f5b9cfa12c570bee5cb3ea4a04bc924e.png

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

hadoop jar xxx.jar -D mapreduce.job.queuename=root.test
f3435d3759849e74b652f4b1394be6f4.png

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

3.问题分析

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

cb9e1c448ab0558c84d08ad368e7cca0.png

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

ea956a3c850a5b2dd318540b48fca135.png

4.问题解决

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

d1a07ee11b0e07e42ff9bdb551c2e5bc.png

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

97c19882250ba8d342c6846f26526a37.png

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

bec607219894df8f5e9555af5be87fcd.png

关于ToolRunner接口的说明:

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

74c98d80a4e0c54daf4d243273829148.png
b3daa72731e3b21ca392858c6cd2557b.png

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

5.总结

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值