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 ...
随机推荐
- php if语句判定my查询是否为空
<?php header("Content-type: text/html; charset=utf-8"); $username=$_GET['username']; $p ...
- 如果可能的话,使用 PC-Lint、LogiScope 等工具进行代码审查
如果可能的话,使用 PC-Lint.LogiScope 等工具进行代码审查. #include <iostream> #include <algorithm> #include ...
- hdu 3336:Count the string(数据结构,串,KMP算法)
Count the string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- MFC存储图片到SQL Server数据库
第一步:建立数据库表,比如:id char,pic image. 第二步:建立MFC单文档应用程序,再添加类CMyRecordset,基类选择CRecordset,导入数据库的刚建立的表. 第三步:在 ...
- ANSI、ASCII、GB2312、GBK
ASCII 在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a.b.c.d这样的52个字母(包括大写).以及0.1等数字还有一些常用的符号 ...
- css属性image-redering详解
What? image-rendering作为现阶段还处于实验性质中的css属性,他的作用是在浏览器对图片进行比例缩放时,设置其缩放使用的算法,从而来得到我们最终想要的图片结果.而且这个属性可以应用于 ...
- Rename a local and remote branch in git
If you have named a branch incorrectly AND pushed this to the remote repository follow these steps b ...
- Angular2 兼容 UC浏览器、QQ浏览器、猎豹浏览器
找到/src/polyfills.ts文件 把/** IE9, IE10 and IE11 requires all of the following polyfills. **/下注释掉的代码恢复 ...
- 常用快捷键—Webstorm入门指南
提高代码编写效率,离不开快捷键的使用,Webstorm拥有丰富的代码快速编辑功能,你可以自由配置功能快捷键. 快捷键配置 点击“File”-> “settings” Webstorm预置了其他编 ...
- LeetCode 笔记系列16.1 Minimum Window Substring [从O(N*M), O(NlogM)到O(N),人生就是一场不停的战斗]
题目: Given a string S and a string T, find the minimum window in S which will contain all the charact ...