如何給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"));

相關文章
相關標籤/搜索