使用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(""), 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进行单元测试的更多相关文章
- Hadoop专业解决方案-第5章 开发可靠的MapReduce应用
本章主要内容: 1.利用MRUnit创建MapReduce的单元测试. 2.MapReduce应用的本地实例. 3.理解MapReduce的调试. 4.利用MapReduce防御式程序设计. 在WOX ...
- 大数据技术 - MapReduce 应用的配置和单元测试
上一章的 MapReduce 应用中,我们使用了自定义配置,并用 GenericOptionsParser 处理命令行输入的配置,这种方式简单粗暴.但不是 MapReduce 应用常见的写法,本章第一 ...
- Hadoop MapReduce开发最佳实践(上篇)
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- [转] Hadoop MapReduce开发最佳实践(上篇)
前言 本文是Hadoop最佳实践系列第二篇,上一篇为<Hadoop管理员的十个最佳实践>. MapRuduce开发对于大多数程序员都会觉得略显复杂,运行一个WordCount(Hadoop ...
- apache基金会开源项目简介
apache基金会开源项目简介 项目名称 描述 HTTP Server 互联网上首屈一指的HTTP服务器 Abdera Apache Abdera项目的目标是建立一个功能完备,高效能的IETF ...
- 招募贴:Hadoop专业解决方案招募义务翻译人员
一.招募启事 招募贴:Hadoop专业解决方案招募义务翻译人员,英文原著名称:<Wrox.Professional.Hadoop.Solutions>.愿意参与到此项工作中来的请加群:31 ...
- 《Wrox.Professional.Hadoop.Solutions》中文目录全稿
前言:最近有朋友给推荐一本书,英文原版<Wrox.Professional.Hadoop.Solutions>,感觉很好打算翻译成中文,共享给朋友,时间关系,不知能否成行,先干着吧.以下部 ...
- 使用MRUnit,Mockito和PowerMock进行Hadoop MapReduce作业的单元测试
0.preliminary 环境搭建 Setup development environment Download the latest version of MRUnit jar from Apac ...
- 6.3 MRUnit写Mapper和Reduce的单元测试
1.1 MRUnit写单元测试 作用:一旦MapReduce项目提交到集群之后,若是出现问题是很难定位和修改的,只能通过打印日志的方式进行筛选.又如果数据和项目较大时,修改起来则更加麻烦.所以,在将 ...
随机推荐
- 时尚与深度学习系列:Fashion forward: Forecasting visual style in fashion
https://arxiv.org/pdf/1705.06394.pdf 将深度学习与时尚预测联系在一起,是一个很有趣但是估计结果会没什么成效的话题.因为,时尚预测这一领 ...
- Mysql常用命令行大全(三)
/**操作数据库*/ SHOW DATABASES; CREATE DATABASE db; SHOW DATABASES; DROP DATABASE db; /**操作表*/ USE db; S ...
- 微信公众平台:扫一扫demo
ylbtech-微信公众平台:扫一扫demo 1.返回顶部 1.Web.config <appSettings> <add key="appid" value=& ...
- Jenkins Email Extension Plugin 邮件插件
1:系统管理-管理插件-可选插件 搜索Email 可列出Email Extension Plugin插件 2:选择相应的插件点 下载并安装之后重启,等待 3:安装完后,自己去重启tomcat,先s ...
- HDOJ-2153
仙人球的残影 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 条款32:确定你的public继承塑模出is-a的关系
Make sure public inheritance models "is –a " 如果令clsss D 以public的形式继承class B,你便是告诉编译器说,每一个类 ...
- celery和supervisor配合使用,实现supervisor管理celery进程
在这里我选择redis作为celery异步任务的中间人,系统选择CentOS6.5 64位.redis.celery和supervisor的安装参见官方文档. 安装完毕后: 1, 创建celery的实 ...
- 10. windows下原来可以这样隐藏webshell
1.利用保留字隐藏 windows系统有些保留文件夹名,windows系统不允许用这些名字命名文件夹,如 aux|prn|con|nul|com1|com2|com3|com4|com5|com6|c ...
- IE11浏览器中的My97日历控件刷新后无法打开问题解决办法
IE11浏览器中的My97日历控件刷新后无法打开问题解决办法 IE11浏览器中的My97日历控件刷新后无法打开问题解决办法:(谷歌浏览器下正常.IE11失效) 解决办法:1:找到WdatePick ...
- 转换为标准IPv4格式
Insus.NET刚写了一个函数,把一个IP地址转换为标准格式,即每段位均是由3个数字组成. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- = ...