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

前言ide

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


传递参数的方式编码

最多见的方式:spa


Configuration conf = new Configuration();命令行


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


而后在MAP/REDUCE类中:code


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


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


可是,若是咱们想传递一个对象给MAP/REDUCE呢?接口

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

若是利用conf.set的方式那么将很是繁琐,也不利于程序的可读性。



传递对象给MR的思路:


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


步骤:


1.实现序列化接口 


implements Serializable只是一个标示,标志能够进行序列化,并不须要咱们去实现什么。


咱们仅仅须要注意的是,若是本类有属性是对象类型的,没有实现序列化接口的,都应该实现这个接口,好比:


wKioL1WfbGKxs3G6AAEkSspHEno583.jpg




wKioL1WfbKSgyYFOAAA4TwOFBsY158.jpg

wKiom1WfatKRvaovAAA14aQIOa0682.jpg



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


例如:


wKioL1WfbQPDSdOLAAGK7cYp1uw081.jpg


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



wKioL1Wfb67AIa1nAAGAUuY2fOA357.jpg


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



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


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