前言
以前我们启动一个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")); |
本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1672893,如需转载请自行联系原作者