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(); } }
測試結果如下:
根據以上結果可以看出,測試結果和預期結果是一致的,也就是說我們的代碼是完全正確的,並且可以放心的放到集群上運行。
以上就是博主為大家介紹的這一板塊的主要內容,這都是博主自己的學習過程,希望能給大家帶來一定的指導作用,有用的還望大家點個支持,如果對你沒用也望包涵,有錯誤煩請指出。如有期待可關注博主以第一時間獲取更新哦,謝謝!
版權聲明:本文為博主原創文章,未經博主允許不得轉載。