天天看點

如何給Map/Reduce程式傳遞參數?

前言

以前我們啟動一個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隻是一個标示,标志可以進行序列化,并不需要我們去實作什麼。

我們僅僅需要注意的是,如果本類有屬性是對象類型的,沒有實作序列化接口的,都應該實作這個接口,比如:

<a href="http://s3.51cto.com/wyfs02/M00/6F/89/wKioL1WfbGKxs3G6AAEkSspHEno583.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/6F/89/wKioL1WfbKSgyYFOAAA4TwOFBsY158.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/6F/8C/wKiom1WfatKRvaovAAA14aQIOa0682.jpg" target="_blank"></a>

2.提供方法實作Object--&gt;String String--&gt;Object

例如:

<a href="http://s3.51cto.com/wyfs02/M00/6F/89/wKioL1WfbQPDSdOLAAGK7cYp1uw081.jpg" target="_blank"></a>

我們知道JAVA的序列化是将對象弄成位元組序列,在上面的過程實際上,利用IO流的裝飾功能得到序列化後的字元串,然後進行編碼。

<a href="http://s3.51cto.com/wyfs02/M01/6F/89/wKioL1Wfb67AIa1nAAGAUuY2fOA357.jpg" target="_blank"></a>

反序列的功能實際上就是上述序列化的逆向!

3.利用conf.set conf.get設定、取得STRING,利用反序列化得到對象即可

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

本文轉自zfz_linux_boy 51CTO部落格,原文連結:http://blog.51cto.com/zhangfengzhe/1672893,如需轉載請自行聯系原作者