MapReduce Unit Test
以前用java写MR程序总不习惯写单元测试,就是查错也只是在小规模数据上跑一下程序。昨天工作时,遇到一个bug,查了好久也查出来。估计是业务逻辑上的错误。后来没办法,只好写了个单元测试,一步步跟踪,瞬间找到问题所在。所以说,工作中还是要勤快些。
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
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 com.wanda.predict.GenerateCustomerNatureFeature.NatureFeatureMappper;
import com.wanda.predict.GenerateCustomerNatureFeature.NatureReducer;
import com.wanda.predict.pojo.Settings; /**
* MapReduce 单元测试的模板 , 依赖于junit环境(junit.jar), mrunit.jar , mockito.jar
*
*/
public class MapperReducerUnitTest {
// 一些设置,与正常的mr程序一样,不过这里主要是加载一些信息。性能优化之类的就不要在单元测试里设置了。
Configuration conf = new Configuration();
//Map.class 的测试驱动类
MapDriver<LongWritable, Text, Text, Text> mapDriver;
//Reduce.class 的测试驱动类
ReduceDriver<Text, Text, Text, Text> reduceDriver;
//Map.calss 、 Reduce.class转接到一起的流程测试驱动
MapReduceDriver<LongWritable, Text, Text, Text, Text, Text> mapReduceDriver; @Before
public void setUp() { //测试mapreduce
NatureFeatureMappper mapper = new NatureFeatureMappper();
NatureReducer reducer = new NatureReducer();
//添加要测试的map类
mapDriver = MapDriver.newMapDriver(mapper);
//添加要测试的reduce类
reduceDriver = ReduceDriver.newReduceDriver(reducer);
//添加map类和reduce类
mapReduceDriver = MapReduceDriver.newMapReduceDriver(mapper, reducer); //测试配置参数
conf.setInt(Settings.TestDataSize.getName(), 1);
conf.setInt(Settings.TrainDataSize.getName(), 6);
//driver之间是独立的,谁用到谁就设置conf
reduceDriver.setConfiguration(conf);
mapReduceDriver.setConfiguration(conf);
} @Test
public void testMapper() throws IOException {
mapDriver.withInput(new LongWritable(), new Text("map的输入"));
mapDriver.withOutput(new Text("期望的key"), new Text("期望的value")); //打印实际结果
List<Pair<Text , Text>> result = mapDriver.run();
for(Pair<Text , Text> kv : result){
System.out.println("mapper : " + kv.getFirst());
System.out.println("mapper : " + kv.getSecond());
}
//进行case测试,对比输入输出结果
mapDriver.runTest();
} @Test
public void testReducer() throws IOException {
List<Text> values = new ArrayList<Text>();
values.add(new Text("输入"));
reduceDriver.withInput(new Text("输入"), values);
reduceDriver.withOutput(new Text("期望的输出"), new Text("期望的输出"));
reduceDriver.runTest();
} @Test
public void testMapperReducer() throws IOException {
mapReduceDriver.withInput(new LongWritable(), new Text("输入"));
mapReduceDriver.withOutput(new Text("期望的输出"), new Text("期望的输出"));
//打印实际结果
List<Pair<Text, Text>> list = mapReduceDriver.run();
System.out.println("mapreducedriver size:" + list.size());
for(Pair<Text , Text> lst : list){
System.out.println(lst.getFirst());
System.out.println(lst.getSecond());
}
//进行case测试,对比输入输出结果
mapReduceDriver.runTest();
} @Test
public void testMapperCount() throws IOException {
mapDriver.withInput(new LongWritable(), new Text("输入"));
mapDriver.withOutput(new Text("期望的输出"), new Text("期望的输出"));
mapDriver.runTest();
//判断 map中的counter值是否与期望的相同
assertEquals("Expected 1 counter increment", 1, mapDriver.getCounters().findCounter("data", "suc").getValue());
}
}
MapReduce Unit Test的更多相关文章
- MapReduce和Spark写入Hbase多表总结
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 大家都知道用mapreduce或者spark写入已知的hbase中的表时,直接在mapreduc ...
- mapReduce编程之Recommender System
1 协同过滤算法 协同过滤算法是现在推荐系统的一种常用算法.分为user-CF和item-CF. 本文的电影推荐系统使用的是item-CF,主要是由于用户数远远大于电影数,构建矩阵的代价更小:另外,电 ...
- Hadoop官方文档翻译——MapReduce Tutorial
MapReduce Tutorial(个人指导) Purpose(目的) Prerequisites(必备条件) Overview(综述) Inputs and Outputs(输入输出) MapRe ...
- Hadoop 学习笔记3 Develping MapReduce
小笔记: Mavon是一种项目管理工具,通过xml配置来设置项目信息. Mavon POM(project of model). Steps: 1. set up and configure the ...
- mapReduce编程之google pageRank
1 pagerank算法介绍 1.1 pagerank的假设 数量假设:每个网页都会给它的链接网页投票,假设这个网页有n个链接,则该网页给每个链接平分投1/n票. 质量假设:一个网页的pagerank ...
- hadoop权威指南 chapter2 MapReduce
MapReduce MapReduce is a programming model for data processing. The model is simple, yet not too sim ...
- Hadoop权威指南:MapReduce应用开发
Hadoop权威指南:MapReduce应用开发 [TOC] 一般流程 编写map函数和reduce函数 编写驱动程序运行作业 用于配置的API Hadoop中的组件是通过Hadoop自己的配置API ...
- Hadoop Mapreduce 参数 (二)
MergeManagerImpl 类 内存参数计算 maxInMemCopyUse 位于构造函数中 final float maxInMemCopyUse = jobConf.getFloat(MRJ ...
- MapReduce C++ Library
MapReduce C++ Library for single-machine, multicore applications Distributed and scalable computing ...
随机推荐
- MyBatis 是一款优秀的持久层框架
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
- 【SPOJ】8222. Substrings(后缀自动机)
http://www.spoj.com/problems/NSUBSTR/ 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length(S)) 这题 ...
- shell命令技巧——文本去重并保持原有顺序
简单来说,这个技巧相应的是例如以下一种场景 假设有文本例如以下 cccc aaaa bbbb dddd bbbb cccc aaaa 如今须要对它进行去重处理.这个非常easy,sort -u就能够搞 ...
- 【python】NLTK好文
From:http://m.blog.csdn.net/blog/huyoo/12188573 nltk是一个python工具包, 用来处理和自然语言处理相关的东西. 包括分词(tokenize), ...
- js实现二分搜索法
二分搜索法: 也称折半搜索,是一种在有序数组中查找特定元素的搜索算法. 实现步骤: 1. 首先从数组中间开始查找对比,若相等则找到,直接返回中间元素的索引. 2. 若查找值小于中间值,则在小于中间值的 ...
- 比较好用的Opera 翻译工具 ddict
http://ddict.me
- ios 动画的时候 如果加阴影 会卡顿的
记录一下今天某群的聊天记录,一些算是经验吧,以后有用的.呵呵~ 动画的时候 如果加阴影 会卡顿的 A 10:59:13 _toView.layer.shadowColor ...
- SpringMvc三大组件详解
SpringMvc框架结构图 处理器映射器:用户请求路径到Controller方法的映射 处理器适配器:根据handler(controlelr类)的开发方式(注解开发/其他开发) 方式的不同区寻找不 ...
- SaltStack之编译安装LNMP环境
使用saltstack编译安装LNMP环境 一,系统版本查看 二,安装salt-master和salt-minion 安装配置过程参考SaltStack概述及安装 三,修改配置文件 /etc/salt ...
- hibernate缓存,四种状态
FlushMode.AUTO:Hibernate判断对象属性有没有改变,是默认的清理模式 FlushMode.COMMIT:在事务结束之前清理Session的缓存,其他任何时候都不清理缓存 Flush ...