1. 程式人生 > >[Hadoop]Hadoop單元測試MRUnit

[Hadoop]Hadoop單元測試MRUnit

在MapReduce中,map函式和reduce函式的獨立測試是非常方便的,這是由函式風格決定的 。MRUnit是一個測試庫,它便於將已知的輸入傳遞給mapper或者檢查reducer的輸出是否符合預期。MRUnit與標準的執行框架(JUnit)一起使用。

1. 設定開發環境

mrunit-x.x.x-incubating-hadoop2.jar。同時還需要下載JUnit最新版本jar。

如果使用Maven方式則使用如下方式:

<junit.version>4.12</junit.version>
<mrunit.version>1.1.0</mrunit.version
>
<!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- mrunit --> <dependency> <groupId>org.apache.mrunit</groupId
>
<artifactId>mrunit</artifactId> <version>${mrunit.version}</version> <classifier>hadoop2</classifier> <scope>test</scope> </dependency>

備註

如果你使用的是hadoop 2.x版本,classifier設定為hadoop2

2. MRUnit 測試用例

MRUnit測試框架基於Junit,可以測試hadoop版本為0.20,0.23.x,1.0.x,2.x的map reduce程式。

下面是一個使用MRUnit對統計一年最高氣溫的Map Reduce程式進行單元測試。

測試資料如下:

0096007026999992016062218244+00000+000000FM-15+702699999V0209999C000019999999N999999999+03401+01801999999ADDMA1101731999999REMMET069MOBOB0 METAR 7026 //008 000000 221824Z AUTO 00000KT //// 34/18 A3004=

這隻有一天的資料,氣溫是340,Mapper輸出為該天氣溫340

下面是相應的Mapper和Reducer:

MaxTemperatureMapper:

package com.sjf.open.maxTemperature;
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 com.google.common.base.Objects;
/**
 * Created by xiaosi on 16-7-27.
 */
public class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    private static final int MISSING = 9999;
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();
        // 年份
        String year = line.substring(15, 19);
        // 溫度
        int airTemperature;
        if(Objects.equal(line.charAt(87),"+")){
            airTemperature = Integer.parseInt(line.substring(88,92));
        }
        else{
            airTemperature = Integer.parseInt(line.substring(87,92));
        }
        // 空氣質量
        String quality = line.substring(92, 93);
        if(!Objects.equal(airTemperature, MISSING) && quality.matches("[01459]")){
            context.write(new Text(year), new IntWritable(airTemperature));
        }
    }
}

MaxTemperatureReducer:

package com.sjf.open.maxTemperature;
import java.io.IOException;
import java.util.Iterator;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/**
 * Created by xiaosi on 16-7-27.
 */
public class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        // 一年最高氣溫
        int maxValue = Integer.MIN_VALUE;
        for(IntWritable value : values){
            maxValue = Math.max(maxValue, value.get());
        }//for
        // 輸出
        context.write(key, new IntWritable(maxValue));
    }
}

下面是MRUnit測試類:

package com.sjf.open.maxTemperature;
import com.google.common.collect.Lists;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mrunit.mapreduce.MapDriver;
import org.apache.hadoop.mrunit.mapreduce.MapReduceDriver;
import org.apache.hadoop.mrunit.mapreduce.ReduceDriver;
import org.apache.hadoop.mrunit.types.Pair;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
/**
 * Created by xiaosi on 16-12-8.
 */
public class MaxTemperatureTest {
    private MapDriver mapDriver;
    private ReduceDriver reduceDriver;
    private MapReduceDriver mapReduceDriver;
    @Before
    public void setUp(){
        MaxTemperatureMapper mapper = new MaxTemperatureMapper();
        mapDriver = MapDriver.newMapDriver(mapper);
        MaxTemperatureReducer reducer = new MaxTemperatureReducer();
        reduceDriver = ReduceDriver.newReduceDriver();
        reduceDriver.withReducer(reducer);
        mapReduceDriver = MapReduceDriver.newMapReduceDriver(mapper, reducer);
    }
    @Test
    public void testMapper() throws IOException {
        Text text = new Text("0096007026999992016062218244+00000+000000FM-15+702699999V0209999C000019999999N999999999+03401+01801999999ADDMA1101731999999REMMET069MOBOB0 METAR 7026 //008 000000 221824Z AUTO 00000KT //// 34/18 A3004=");
        mapDriver.withInput(new LongWritable(), text);
        mapDriver.withOutput(new Text("2016"), new IntWritable(340));
        mapDriver.runTest();
        // 輸出
        List<Pair> expectedOutputList = mapDriver.getExpectedOutputs();
        for(Pair pair : expectedOutputList){
            System.out.println(pair.getFirst() + " --- " + pair.getSecond()); // 2016 --- 340
        }
    }
    @Test
    public void testReducer() throws IOException {
        List<IntWritable> IntWritableList = Lists.newArrayList();
        IntWritableList.add(new IntWritable(340));
        IntWritableList.add(new IntWritable(240));
        IntWritableList.add(new IntWritable(320));
        IntWritableList.add(new IntWritable(330));
        IntWritableList.add(new IntWritable(310));
        reduceDriver.withInput(new Text("2016"), IntWritableList);
        reduceDriver.withOutput(new Text("2016"), new IntWritable(340));
        reduceDriver.runTest();
        // 輸出
        List<Pair> expectedOutputList = reduceDriver.getExpectedOutputs();
        for(Pair pair : expectedOutputList){
            System.out.println(pair.getFirst() + " --- " + pair.getSecond());
        }
    }
    @Test
    public void testMapperAndReducer() throws IOException {
        Text text = new Text("0089010010999992014010114004+70933-008667FM-12+000999999V0201201N006019999999N999999999+00121-00361100681ADDMA1999990100561MD1810171+9990REMSYN04801001 46/// /1206 10012 21036 30056 40068 58017=");
        mapReduceDriver.withInput(new LongWritable(), text);
        mapReduceDriver.withOutput(new Text("2014"), new IntWritable(12));
        mapReduceDriver.runTest();
        // 輸出
        List<Pair> expectedOutputList = mapReduceDriver.getExpectedOutputs();
        for(Pair pair : expectedOutputList){
            System.out.println(pair.getFirst() + " --- " + pair.getSecond()); // 2014 --- 12
        }
    }
}

如果測試的是Mapper,使用MRUnit的MapDiver,如果測試Reducer,使用ReduceDriver,如果測試整個MapReduce程式,則需要使用MapReduceDriver。在呼叫runTest()方法之前,需要配置mapper(或者Reducer),輸入值,期望的輸出key,期望的輸出值等。如果與期望的輸出值不匹配,MRUnit測試失敗。根據withOutput()被呼叫的次數,MapDiver(ReduceDriver,MapReduceDriver)能來檢查0,1,或者多個輸出記錄。

備註

注意 MapDriver,ReduceDriver,MapReduceDriver 引入的jar包版本:

import org.apache.hadoop.mrunit.mapreduce.MapDriver;
import org.apache.hadoop.mrunit.mapreduce.MapReduceDriver;
import org.apache.hadoop.mrunit.mapreduce.ReduceDriver;

而不是:

import org.apache.hadoop.mrunit.MapDriver;
import org.apache.hadoop.mrunit.MapReduceDriver;
import org.apache.hadoop.mrunit.ReduceDriver;

這分別對應Hadoop新老版本API,第一類對應新版本的Mapper和Reducer:

import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;

第二類對應老版本的Mapper和Reducer:

import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.Reducer;

相關推薦

[Hadoop]Hadoop單元測試MRUnit

在MapReduce中,map函式和reduce函式的獨立測試是非常方便的,這是由函式風格決定的 。MRUnit是一個測試庫,它便於將已知的輸入傳遞給mapper或者檢查reducer的輸出是否符合預期。MRUnit與標準的執行框架(JUnit)一起使用。1. 設定開發環境m

HADOOP中使用MRUNIT進行單元測試

前提1. 瞭解JUnit4.x的使用。2. 瞭解Mock的概念在單元測試中的應用。3. 瞭解Hadoop中MapReduce的程式設計模型。如果您對Hadoop中MapReduce的程式設計模型不瞭解,可以先閱讀Map/Reduce Tutorial。介紹MRUnit是一款由Couldera公司開發的專門針對

hadoop單元測試方法--使用和增強MRUnit[1]

hadoop單元測試方法--使用和增強MRUnit 1前言 hadoop的mapreduce提交到叢集環境中出問題的定位是比較麻煩的,有時需要一遍遍的修改程式碼和打出日誌來排查一個很小的問題,如果資料量大的話除錯起來相當耗時間。因此有必要使用良好的單元測試手段來儘

Hadoop-使用MRUnit來寫單元測試

簡介 單元測試是用來對一個模組、一個函式或者一個類來進行正確性檢驗的測試工作。在MapReduce開發中,如果能對Mapper和Reducer進行詳盡的單元測試,將及早發現問題,加快開發進度。 本文結合具體的例子,簡單總結如何使用MRUnit來對Hadoop的Mapper和

Hadoop學習筆記之三:用MRUnit單元測試

引言 借年底盛宴品鑑之風,繼續抒我Hadoop之情,本篇文章介紹如何對Hadoop的MapReduce進行單元測試。MapReduce的開發週期差不多是這樣:編寫mapper和reducer、編譯、打包、提交作業和結果檢索等,這個過程比較繁瑣,一旦提交到分散式環境出了問題要定位除錯,重複這樣的過程實在無趣

hadoop中關於mapreduce的單元測試

這個功能好像是CDH那邊開發的。。。 1.  首先下載jar包:hadoop-0.21.0-mrunit.jar。(經測試,這個jar包是關聯舊API的。請自己根據情況決定) 2.  在eclipse的build path中加入此jar包。 3.  編寫測試程式: pack

使用mrunithadoop進行單元除錯

1.出現java.lang.NoClassDefFoundError: org/powermock/tests/utils/ArrayMerger之類的錯誤,都是由於缺少jar包,對於hadoop2.7.3,下載mrunit1.0.0 for hadoop2,解壓後手動新增

2018-08-06 期 MapReduce MRUnit安裝及單元測試

程序 數據 moc rgb 輸出 bte -- 輸入 信息 一、MRUnit測試jar包mrunit-1.1.0-hadoop2.jar第三方依賴MRUnit\apache-mrunit-1.1.0-hadoop1-bin\lib二、在現有工程裏面配置MRUnit單元測試1

10分鐘從無到有搭建hadoop環境並測試mapreduce

2012-05-22 來源:http://abloz.com/2012/05/22/hadoop-installation.html 目標: 安裝測試本地單機hadoop。 花費時間:10分鐘 前提: java環境已經準備好

Hadoop第一個測試例項WordCount的執行

首先確保hadoop已經正確安裝、配置以及執行。 拷貝WordCount.java到我們的資料夾,下載的hadoop裡帶有WordCount.java,路徑為: hadoop-0.20.203.0/src/examples/org/apache/hadoop/example

怎樣選擇Hadoop的基準測試

我們部署好Hadoop叢集,在測試和學習環境下對通過引數配置來提供叢集資源的利用效率重視不夠,但是在實際工作環境下這一點相當重要,這直接影響線上任務的執行時間,系統的吞吐量和資源利用率等。 怎麼才能得到符合實際工作需要的最佳引數配置呢?一般是基於在各種情況下對叢集效能進行測

hadoop學習筆記(一)——hadoop安裝及測試

這幾天乘著工作之餘,學習了一下hadoop技術,跌跌撞撞的幾天,終於完成了一個初步的hadoop的安裝及測試,具體如下: 動力:工作中遇到的資料量太大,伺服器已經很吃力,sql語句執行老半天,故想用大

淺析MapReduce單元測試框架—MRUnit

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

使用Docker快速搭建Hadoop,Spark測試環境

合適的hadoop,Spark映象:git clone https://github.com/big-data-europe/docker-hadoop-spark-workbench.git  進入下載後的目錄  docker-hadoop-spark-wor

hadoop學習之HDFS(2.5):windows下eclipse遠端連線linux下的hadoop叢集並測試wordcount例子

windows下eclipse遠端連線linux下的hadoop叢集不像在linux下直接配置eclipse一樣方便,會出現各種各樣的問題,處處是坑,連線hadoop和執行例子時都會出現問題,而網上的

MapReduce的單元測試框架MRUnit

import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.apache.hadoop.io.*;import org.apache.hadoop.mrunit.mapreduce.MapDriv

MapReduce 單元測試工具 MRUnit 使用

MRUnit的使用很簡單,流程如下: 1:根據業務要求編寫Map類,Reduce類 2:編寫測試類。 3:執行測試,得到結果。 準備測試資料: CDRID;CDRTyp

NUnit.Framework在VS2015中如何進行單元測試

開放 ron 微軟 strong 擴展 分享 方案 mar 項目 微軟在VS2015中加入了自動化生成測試功能, 在需要測試的源文件的公共方法中右鍵既可以創建單元測試。 不過需要註意的是,要在公共方法中創建,否則會提示這個錯誤 如下是自動化單元測試界面,可以發

Spring Boot的單元測試(Unit Test)

java spring boot unit test 最近做了一些Spring Boot單元測試方面的東西,總結一下。單元測試盡量要和Spring Boot框架減少耦合度,當你在測試某一項功能點是需要mock太多的對象時你就應該意識到這個功能點的耦合度太高了使用Constructor Inject

ASP.NET Zero--單元測試

正在 模型 ldl git target xuni false pre misc 單元測試 ASP.NET Zero啟動項目包含單元和集成測試。使用以下工具開發測試: xUnit作為測試框架。 Shouldly 作為斷言庫。 Microsoft.EntityFr