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(""), new IntWritable()) //"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 = "";
List values = new ArrayList();
values.add(new IntWritable());
values.add(new IntWritable()); driver.withInput(new Text(key), values)
.withOutput(new Text(key), new IntWritable()) //输出平均气温(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(""), new IntWritable())
.runTest();
}
}

  测试结果如下:

  根据以上结果可以看出,测试结果和预期结果是一致的,也就是说我们的代码是完全正确的,并且可以放心的放到集群上运行。

以上就是博主为大家介绍的这一板块的主要内容,这都是博主自己的学习过程,希望能给大家带来一定的指导作用,有用的还望大家点个支持,如果对你没用也望包涵,有错误烦请指出。如有期待可关注博主以第一时间获取更新哦,谢谢!

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用MRUnit对MapReduce进行单元测试的更多相关文章

  1. Hadoop专业解决方案-第5章 开发可靠的MapReduce应用

    本章主要内容: 1.利用MRUnit创建MapReduce的单元测试. 2.MapReduce应用的本地实例. 3.理解MapReduce的调试. 4.利用MapReduce防御式程序设计. 在WOX ...

  2. 大数据技术 - MapReduce 应用的配置和单元测试

    上一章的 MapReduce 应用中,我们使用了自定义配置,并用 GenericOptionsParser 处理命令行输入的配置,这种方式简单粗暴.但不是 MapReduce 应用常见的写法,本章第一 ...

  3. Hadoop MapReduce开发最佳实践(上篇)

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  4. [转] Hadoop MapReduce开发最佳实践(上篇)

    前言 本文是Hadoop最佳实践系列第二篇,上一篇为<Hadoop管理员的十个最佳实践>. MapRuduce开发对于大多数程序员都会觉得略显复杂,运行一个WordCount(Hadoop ...

  5. apache基金会开源项目简介

    apache基金会开源项目简介   项目名称 描述 HTTP Server 互联网上首屈一指的HTTP服务器 Abdera Apache  Abdera项目的目标是建立一个功能完备,高效能的IETF ...

  6. 招募贴:Hadoop专业解决方案招募义务翻译人员

    一.招募启事 招募贴:Hadoop专业解决方案招募义务翻译人员,英文原著名称:<Wrox.Professional.Hadoop.Solutions>.愿意参与到此项工作中来的请加群:31 ...

  7. 《Wrox.Professional.Hadoop.Solutions》中文目录全稿

    前言:最近有朋友给推荐一本书,英文原版<Wrox.Professional.Hadoop.Solutions>,感觉很好打算翻译成中文,共享给朋友,时间关系,不知能否成行,先干着吧.以下部 ...

  8. 使用MRUnit,Mockito和PowerMock进行Hadoop MapReduce作业的单元测试

    0.preliminary 环境搭建 Setup development environment Download the latest version of MRUnit jar from Apac ...

  9. 6.3 MRUnit写Mapper和Reduce的单元测试

    1.1  MRUnit写单元测试 作用:一旦MapReduce项目提交到集群之后,若是出现问题是很难定位和修改的,只能通过打印日志的方式进行筛选.又如果数据和项目较大时,修改起来则更加麻烦.所以,在将 ...

随机推荐

  1. codeforces 659B B. Qualifying Contest(水题+sort)

    题目链接: B. Qualifying Contest time limit per test 1 second memory limit per test 256 megabytes input s ...

  2. linux命令学习笔记(33):df 命令

    linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了 多少空间,目前还剩下多少空间等信息. .命令格式: df [选项] [文件] .命令 ...

  3. 【LeetCode】Find Minimum in Rotated Sorted Array 在旋转数组中找最小数

    Add Date 2014-10-15 Find Minimum in Rotated Sorted Array Suppose a sorted array is rotated at some p ...

  4. Python基础入门知识

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...

  5. tyvj1061移动服务——DP

    题目:http://www.joyoi.cn/problem/tyvj-1061 DP记录状态为当前任务时不在此任务位置上的两个人的位置(因为一定有一个人在此任务位置上): 不妨设初始位置p[0]=3 ...

  6. 搭建Android 开发环境(精华)

    http://www.cnblogs.com/xdp-gacl/p/4322165.html 孤傲苍狼 只为成功找方法,不为失败找借口! Android开发学习总结(一)——搭建最新版本的Androi ...

  7. [xdoj1216]子树第k小(dfs序+主席树)

    解题关键:dfs序将树映射到区间,然后主席树求区间第k小,为模板题. #pragma comment(linker, "/STACK:1024000000,1024000000") ...

  8. C++ 右值引用与移动操作

    右值引用和移动操作是C++11提出的新概念,通过这些操作,可以降低拷贝操作带来的消耗.先来简单介绍一下左值和右值. 左值一般指的是一个对象,或者说是一个持久的值,例如赋值的返回值.下标操作.解引用以及 ...

  9. c# 任务栏托盘图标鼠标进入MouseEnter和鼠标离开MouseLeave实现

    c#的任务栏托盘图标控件NotifyIcon只有MouseMove事件,MouseMove事件刷新很快,很不好用,而且我们有时需要鼠标进入和离开的事件,但是不知道c#怎么回事,没有提供,那么就只能自己 ...

  10. Android如何解析json数组对象

    import org.json.JSONArray; import org.json.JSONObject; //jsonData的数据格式:[{ "id": "27Jp ...