1. 程式人生 > >淺析MapReduce單元測試框架—MRUnit

淺析MapReduce單元測試框架—MRUnit

  1. 什麼是MRUnit

    MRUnit 是對MapReduce進行單元測試的一個框架,它可以很方便的測試mapper和reducer程式,MRUnit自己實現了一套Mock物件來控制OutputCollector的操作,其可以攔截map以及reduce上下文的輸出,和我們的預期結果進行比較。

  2. 為什麼使用MRunit

    我們在進行MapReduce開發時,對於結果的驗證比較繁瑣,需要編譯、打包然後將其提交到叢集上執行來驗證結果輸出,而此時如果發現有bug,仍需要重複前面的步驟進行驗證,總是這樣來測試程式的話,時間成本太大。因此尋找一個好的辦法來對寫好的程式測試顯得尤為重要,而MRUnit正是對MR程式進行單元測試的java框架。

  3. 如何使用MRUnit

    如果你的專案是由maven進行管理的,我們只需要引入相應的依賴即可,首先引入MRUnit包:

    除此還需要引入另外一個Java單元測試包JUnit:

    將測試需要的jar包引入之後,就可以對MR進行單元測試了。MRUnit針對不同測試物件分別使用一下幾種Driver:【MapDriver】對mapper進行測試;【ReduceDriver】對reducer進行測試;【MapReduceDriver】對mapper和reducer一起進行測試;【PipelineMapReduceDriver】對多個Map-Reduce pair一起測試。

  4. 例項分析

新建一個測試類:TestAdStatByMRUnit

   在測試類中定義驅動類變數:

private
MapDriver mapDriver; private ReduceDriver reduceDriver; private MapReduceDriver mapReduceDriver; 定義待測試的MR類變數: private AdStatByVerMapper mapper; private AdMonitorStatReducerreducer; 定義完類變數之後,對其進行初試化操作,此處利用@Before標籤 @Before public void setup() { mapper = new AdStatByVerMapper(); reducer = new
AdMonitorStatReducer(); //初始化驅動類 mapDriver = MapDriver.newMapDriver(mapper); reduceDriver = ReduceDriver.newReduceDriver(reducer); mapReduceDriver = MapReduceDriver.newMapReduceDriver(mapper, reducer); } 初始化完畢後就可以對具體的MR方法進行測試,由於各種驅動的使用原理相同,此處僅列舉MapReduceDriver對mapper和reducer進行測試: @Test public void testStatbyAdId() { mapReduceDriver.getConfiguration().set("type", "ad"); Text key = new Text("e8bba8b134cbe8bba8b134cb"); Text val = new Text("130007,-,330005,18324,ape_b_1,-,39590,-,aphone,61,1,2.1.1.1"); mapReduceDriver.withInput(key, val); Text expKey = new Text("18324,2.1.1.1,aphone"); Text expVal = new Text("0,0,0,0,0,1"); mapReduceDriver.withOutput(expKey, expVal); mapReduceDriver.runTest(false); }

總結

通過採用MRUnit對MR進行單元測試,可以使我們更快的定位問題,節省測試時間,提高程式碼魯棒性。

除了起到單元測試的作用,通過測試程式碼的輸入和預期結果,我們還可以更加清楚地知道map、reduce究竟輸入、輸出了什麼等細節,藉助其可以更好的讓我們瞭解MR框架的工作原理。

單元測試是很重要,可以幫助我們及早的發現問題,但是隻有單元測試還是不夠的,作為一個分散式的計算框架,還需要將其整合到hadoop叢集上進行測試,以保證整個專案的正確執行。