且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-09-13 17:43:07

前言

以前我们启动一个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只是一个标示,标志可以进行序列化,并不需要我们去实现什么。


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


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




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

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



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


例如:


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


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



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


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



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


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



本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1672893,如需转载请自行联系原作者