在HADOOP中使用MRUNIT进行单元测试
在HADOOP中使用MRUNIT进行单元测试
前提
1. 了解JUnit4.x的使用。
2. 了解Mock的概念在单元测试中的应用。
3. 了解Hadoop中MapReduce的编程模型。
如果您对Junit和Mock不了解,可以先阅读[翻译]Unit testing with JUnit 4.x and EasyMock in Eclipse - Tutorial。
如果您对Hadoop中MapReduce的编程模型不了解,可以先阅读Map/Reduce Tutorial。
介绍
MRUnit是一款由Couldera公司开发的专门针对Hadoop中编写MapReduce单元测试的框架。
它可以用于0.18.x版本中的经典org.apache.hadoop.mapred.*的模型,也能在0.20.x版本org.apache.hadoop.mapreduce.*的新模型中使用。
官方的介绍如下:
MRUnit is a unit test library designed to facilitate easy integration between your MapReduce development process and standard development and testing tools such as JUnit. MRUnit contains mock
objects that behave like classes you interact with during MapReduce execution (e.g., InputSplit and OutputCollector) as well as test harness "drivers" that test your program's correctness while maintaining compliance with the MapReduce semantics. Mapper and
Reducer implementations can be tested individually, as well as together to form a full MapReduce job.
安装
在目前Hadoop的发行版中,并没有默认包含MRUnit。你需要去Couldera公司的官网中去下载一个由他们再次发行的版本。
推荐的版本为:hadoop-0.20.1+133.tar.gz。
下载这个文件后,你将在hadoop-0.20.1+133\contrib\mrunit目录中找到我们需要的jar包:hadoop-0.20.1+133-mrunit.jar。
为了使用MRUnit,我们需要将hadoop-0.20.1+133-mrunit.jar和Junit4.x使用的jar包:junit.jar都添加到我们开发Hadoop程序项目的classpath中。
示例
代码是最好的文档,我们先看一个简单的map单元测试示例,代码如下:
package gpcuster.cnblogs.com; import junit.framework.TestCase;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.lib.IdentityMapper;
import org.junit.Before;
import org.junit.Test;
import org.apache.hadoop.mrunit.MapDriver; public class TestExample extends TestCase { private Mapper<Text, Text, Text, Text> mapper;
private MapDriver<Text, Text, Text, Text> driver; @Before
public void setUp() {
mapper = new IdentityMapper<Text, Text>();
driver = new MapDriver<Text, Text, Text, Text>(mapper);
} @Test
public void testIdentityMapper() {
driver.withInput(new Text("foo"), new Text("bar"))
.withOutput(new Text("foo"), new Text("bar"))
.runTest();
}
}
在这段示例代码中,我们使用的map是org.apache.hadoop.mapred.lib.IdentityMapper。这是一个非常简单的map函数:输入什么,就输出什么。
org.apache.hadoop.mrunit.MapDriver是我们从MRUnit框架中导入的一个专门用于测试map的类。
我们通过withInput指定输入的参数,通过withOutput指定我们期望的输出,然后通过runTest运行我们的测试。
功能
1. 测试Map,我们可以使用MapDriver。
2. 测试Reduce,我们可以使用ReduceDriver。
3. 测试一个完整的MapReduce,我们可以使用MapReduceDriver。
4. 测试多个MapReduce组合而成的操作,我们可以使用PipelineMapReduceDriver。
实现
MRUnit框架非常精简,其核心的单元测试依赖于JUnit。
由于我们编写的MapReduce函数中包含有一个OutputCollector的对象,所以MRUnit自己实现了一套Mock对象来控制OutputCollector的操作。
局限
通过阅读MRUnit的源代码我们会发现:
1. 不支持MapReduce框架中的分区和排序操作:从Map输出的值经过shuffle处理后直接就导入Reduce中了。
2. 不支持Streaming实现的MapReduce操作。
虽然MRUnit有这些局限,但是足以完成大多数的需求。
参考资料
http://www.cloudera.com/hadoop-mrunit
本文地址:博客园 逖靖寒 http://gpcuster.cnblogs.com
在HADOOP中使用MRUNIT进行单元测试的更多相关文章
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- Hadoop中客户端和服务器端的方法调用过程
1.Java动态代理实例 Java 动态代理一个简单的demo:(用以对比Hadoop中的动态代理) Hello接口: public interface Hello { void sayHello(S ...
- [转] - hadoop中使用lzo的压缩
在hadoop中使用lzo的压缩算法可以减小数据的大小和数据的磁盘读写时间,不仅如此,lzo是基于block分块的,这样他就允许数据被分解成chunk,并行的被hadoop处理.这样的特点,就可以让l ...
- Hadoop中WritableComparable 和 comparator
1.WritableComparable 查看HadoopAPI,如图所示: WritableComparable继承自Writable和java.lang.Comparable接口,是一个Writa ...
- hadoop中常见元素的解释
secondarynamenode 图: secondarynamenode根据文件的的大小对namenode的编辑日志和镜像日志 进行合并. 光从字面上来理解,很容易让一些初学者先入为主的认为:Se ...
- Hadoop中常用的InputFormat、OutputFormat(转)
Hadoop中的Map Reduce框架依赖InputFormat提供数据,依赖OutputFormat输出数据,每一个Map Reduce程序都离不开它们.Hadoop提供了一系列InputForm ...
- hadoop中Text类 与 java中String类的区别
hadoop 中 的Text类与java中的String类感觉上用法是相似的,但两者在编码格式和访问方式上还是有些差别的,要说明这个问题,首先得了解几个概念: 字符集: 是一个系统支持的所有抽象字符的 ...
- hadoop 中对Vlong 和 Vint的压缩方法
hadoop 中对java的基本类型进行了writeable的封装,并且所有这些writeable都是继承自WritableComparable的,都是可比较的:并且,它们都有对应的get() 和 s ...
- 在Eclipse中使用JUnit4进行单元测试
在Eclipse中使用JUnit4进行单元测试(初级篇) 在Eclipse中使用JUnit4进行单元测试(中级篇) 在Eclipse中使用JUnit4进行单元测试(高级篇)
随机推荐
- 29. docker swarm 创建 三个节点 swarm 的集群
1.使用 vagrant 部署 三台 centos/7 的 环境 ###Vagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.req ...
- winter_holiday_2019
个人逐利对他人的影响:私营企业主的个人付出.作为长辈对晚辈的付出 是2020要实现精准扶贫吗?精准扶贫的概念,是针对一个家庭还是针对家里的每个人的平均收入.精准扶贫比教育更有作用,刘传铁(湖北省委高校 ...
- jQuery下锚点的平滑跳转
对于锚点的平滑跳转,我觉得要谨慎使用,在个人站点或是这个效果含有功能提示可以用一用,在一般的商业性质的网站上,权衡来讲,不用更好,当然,这只是我的个人意见.jQuery库已经为我们做了很多的工作了,所 ...
- 结点选择(树形DP)
Description 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多少? Input 接下来的一行包含 n ...
- 微服务项目开发学成在线_day01_CMS服务端开发
05-CMS需求分析-什么是CMS 什么是CMS?CMS (Content Management System)即内容管理系统,不同的项目对CMS的定位不同.CMS有哪些类型? 每个公司对每个项目的C ...
- Python编译遇到的一些错误及解决办法
nunicodeessscape codec can't decode bytes in position2-3:truncated\UXXXXXXXX escape 描述:im=Image.open ...
- Maven--排除依赖
传递性依赖会给项目隐式地引入很多依赖,这极大地简化了项目依赖的管理,但是有些时候这种特性也会带来问题. 例如,当前项目有一个第三方依赖,而这个第三方的依赖由于某些原因依赖了另外一个类库的 SNAPSH ...
- Django_前介
Django 1.软件框架 一个公司是由公司中的各部部门来组成的,每一个部门拥有特定的职能,部门与部门之间通过相互的配合来完成让公司运转起来. 一个软件框架是由其中各个软件模块组成的,每一个模 ...
- 使用pythonnet调用halcon脚本
最近的项目中遇到了使用python程序结合不同部分,其中包括使用halcon处理拍摄到的图像. halcon本身提供了c++与.NET的开发库,但无python库,网上有pyhalcon之类的库,但功 ...
- 14 微服务电商【黑马乐优商城】:day04-项目搭建(一)
本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...