前言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只是一个标示,标志能够进行序列化,并不须要咱们去实现什么。 咱们仅仅须要注意的是,若是本类有属性是对象类型的,没有实现序列化接口的,都应该实现这个接口,好比: 2.提供方法实现Object-->String String-->Object 例如: 咱们知道JAVA的序列化是将对象弄成字节序列,在上面的过程实际上,利用IO流的装饰功能获得序列化后的字符串,而后进行编码。 反序列的功能实际上就是上述序列化的逆向! 3.利用conf.set conf.get设置、取得STRING,利用反序列化获得对象便可 Action action = Tool.decodeString(context.getConfiguration().get("action")); |