使用MRUnit對MapReduce進行單元測試


1. 為什么需要單元測試

  一旦MapReduce項目提交到集群之后,若是出現問題是很難定位和修改的,只能通過打印日志的方式進行篩選。又如果數據和項目較大時,修改起來則更加麻煩。所以,在將MapReduce項目提交到集群上之前,我們需要先對其進行單元測試。

2. 使用什么框架進行單元測試

  MRUnit是Cloudera公司專為Hadoop MapReduce寫的單元測試框架,其API非常簡潔實用。該框架對不同的測試對象使用不同的Driver,因此分為了:MapDriver、ReduceDriver和MapReduceDriver。

3. 測試過程

  准備工作:將mrunit-hadoop.jar包導入Built Path。

  項目目錄如下:

 

 3.1 MapDriver測試

  MapReduce的代碼使用MapReduce項目之氣溫統計中的代碼,但注意有一點變化如下

   測試函數代碼如下:

package com.hadoop.test; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mrunit.mapreduce.MapDriver; import org.junit.Before; import org.junit.Test; public class TemperarureMapperTest { private Mapper mapper; private MapDriver driver; @Before public void init() {   //初始化
        mapper = new Temperature.TemperatureMapper(); //通過Temperature下的Mapper方法對mapper進行初始化
        driver = new MapDriver(mapper); } @Test //使用注解添加測試方法,獲得入口函數
    public void test() throws IOException { String line = "2005 01 01 00 22 -6 10117 210 77 6 0 0"; driver.withInput(new LongWritable(), new Text(line)) .withOutput(new Text("03103"), new IntWritable(22)) //"03103"代表測試文件編號;22代表輸入測試數據中第五位數,代表氣溫值
 .runTest(); } }

   如上述代碼所示,插入注解后即可獲取到測試函數入口,右鍵 -> Run As -> JUnit Test運行可得到如下結果。

  3.2 ReduceDriver測試

  測試函數代碼如下:

package com.hadoop.test; import java.io.IOException; import java.util.List; import java.util.ArrayList; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mrunit.mapreduce.ReduceDriver; import org.junit.Before; import org.junit.Test; public class TeperatureReducerTest { private Reducer reducer; private ReduceDriver driver; @Before public void init() { reducer = new Temperature.TemperatureReducer(); //通過Temperature下的Reducer方法對Reducer進行初始化
        driver = new ReduceDriver(reducer); } @Test //使用注解添加測試方法,獲得入口函數
    public void test() throws IOException { //因為Reduce的輸入幾位Map的輸出,所以需要先獲取Map的輸出
        String key = "03103"; List values = new ArrayList(); values.add(new IntWritable(22)); values.add(new IntWritable(10)); driver.withInput(new Text(key), values) .withOutput(new Text(key), new IntWritable(16)) //輸出平均氣溫(22+10)/2
 .runTest(); } }

  測試結果如下:

  3.3 MapReduceDriver測試

  測試函數代碼如下:

package com.hadoop.test; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mrunit.mapreduce.MapReduceDriver; import org.junit.Before; import org.junit.Test; public class TemperatureMapReduceTest { private Mapper mapper; private Reducer reducer; private MapReduceDriver driver; @Before public void init() { mapper = new Temperature.TemperatureMapper(); reducer = new Temperature.TemperatureReducer(); driver = new MapReduceDriver(mapper, reducer); } @Test //使用注解添加測試方法,獲得入口函數
    public void test() throws IOException { String line1 = "2005 01 01 00 22 -6 10117 210 77 6 0 0"; String line2 = "2005 01 01 06 6 -17 10131 240 41 8 -1 999"; driver.withInput(new LongWritable(), new Text(line1)) .withInput(new LongWritable(), new Text(line2)) .withOutput(new Text("03103"), new IntWritable(14)) .runTest(); } }

  測試結果如下:

  根據以上結果可以看出,測試結果和預期結果是一致的,也就是說我們的代碼是完全正確的,並且可以放心的放到集群上運行。

 

以上就是博主為大家介紹的這一板塊的主要內容,這都是博主自己的學習過程,希望能給大家帶來一定的指導作用,有用的還望大家點個支持,如果對你沒用也望包涵,有錯誤煩請指出。如有期待可關注博主以第一時間獲取更新哦,謝謝!

 

 版權聲明:本文為博主原創文章,未經博主允許不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM