前言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")); |