码迷,mamicode.com
首页 > 其他好文 > 详细

如何给Map/Reduce程序传递参数?

时间:2015-07-10 16:53:55      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:给map/reduce传递参数

前言

以前我们启动一个Map/Reduce,经常是利用hadoop jar ./xxx.jar yyy.KK input output的方式在SHELL脚本或者命令行直接提交作业。但是最近涉及到的一个项目,需要根据配置动态的启动MR作业,也就是涉及到向MAP,REDUCE处理类传递参数的问题。


传递参数的方式

最常见的方式:


Configuration conf = new Configuration();


conf.set("key","value");


然后在MAP/REDUCE类中:


String value = conf.get("key");


这种方式,非常方便的处理了字符串信息的传递,也是常用的方式。


但是,如果我们想传递一个对象给MAP/REDUCE呢?

如果一个对象内部,还有一些对象类型的属性,这种复杂对象又该如何传递呢?

如果利用conf.set的方式那么将非常繁琐,也不利于程序的可读性。



传递对象给MR的思路:


我们知道,一个对象无论多么复杂,不论对象内部的属性是不是对象类型,到最后,都是由一个一个的基本数据类型构成,我们当然可以override toString方法,得到一个我们想要的string,比如以,号分割的一些有用信息,然后利用conf.set的方式传递,MR收到后,进行解析即可得到。但是能不能,利用conf.set设置的是一个STRING,但是MR收到后进行“解析”成对象,然后我们就可以“随心所欲”的调用这个对象的属性和方法?答案是可以的,比如,我们可以将对象序列化成STRING,利用conf.set设置,MR收到后,反序列化STRING,这样就能得到我们想要的对象了!


步骤:


1.实现序列化接口 


implements Serializable只是一个标示,标志可以进行序列化,并不需要我们去实现什么。


我们仅仅需要注意的是,如果本类有属性是对象类型的,没有实现序列化接口的,都应该实现这个接口,比如:


技术分享




技术分享

技术分享



2.提供方法实现Object-->String String-->Object


例如:


技术分享


我们知道JAVA的序列化是将对象弄成字节序列,在上面的过程实际上,利用IO流的装饰功能得到序列化后的字符串,然后进行编码。



技术分享


反序列的功能实际上就是上述序列化的逆向!



3.利用conf.set conf.get设置、取得STRING,利用反序列化得到对象即可


Action action = Tool.decodeString(context.getConfiguration().get("action"));






本文出自 “努力奋斗” 博客,请务必保留此出处http://zhangfengzhe.blog.51cto.com/8855103/1672893

如何给Map/Reduce程序传递参数?

标签:给map/reduce传递参数

原文地址:http://zhangfengzhe.blog.51cto.com/8855103/1672893

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!