mrunit_使用MRUnit测试Hadoop程序

mrunit

这篇文章将略微绕开使用MapReduce实现数据密集型处理中发现的模式,以讨论同样重要的测试。 汤姆•惠勒 ( Tom Wheeler)在纽约2012年Strata / Hadoop World会议上参加的一次演讲给了我部分启发。 当处理大型数据集时,想到的并不是单元测试。 但是,当考虑到无论集群有多大或有多少数据时,都将相同的代码推送到所有节点以运行MapReduce作业,因此Hadoop映射器和化简器非常适合进行单元测试。 但是,对框架进行Hadoop的单元测试并不容易。 幸运的是,有一个使Hadoop测试相当容易的库– MRUnit 。 MRUnit基于JUnit并允许对映射器,化简器进行单元测试以及对映射器进行一些有限的集成测试-归化器与组合器,自定义计数器和分区器之间的交互。 在撰写本文时,我们正在使用最新版本的MRUnit 0.9.0。 所有测试的代码均来自上一则有关使用本地聚合计算平均值的文章 。

建立

要开始使用,请从此处下载MRUnit。 解压缩tar文件后,将cd插入mrunit-0.9.0-incubating / lib目录。 在其中,您应该看到以下内容:

  1. mrunit-0.9.0-incubating-hadoop1.jar
  2. mrunit-0.9.0-incubating-hadoop2.jar

我敢肯定,mrunit-0.9.0-incubating-hadoop1.jar用于Hadoop的MapReduce版本1,mrunit-0.9.0-incubating-hadoop2.jar用于处理Hadoop的新版本的MapReduce。 对于本文以及其他所有后续文章,我们将使用Cloudera CDH4.1.1发行版中的hadoop-2.0版本,因此我们需要mrunit-0.9.0-incubating-hadoop2.jar文件。 我在Intellij中将MRUnit,JUnit和Mockito添加为库(JUnit和Mockito与MRUnit jar文件位于同一目录中)。 现在我们已经建立了依赖关系,让我们开始测试。

测试映射器

设置测试映射器非常简单,最好先查看一些代码来说明。 我们将使用上一篇文章中的映射器内合并示例:

@Test
public void testCombiningMapper() throws Exception {new MapDriver<LongWritable,Text,Text,TemperatureAveragingPair>().withMapper(new AverageTemperatureCombiningMapper()).withInput(new LongWritable(4),new Text(temps[3])).withOutput(new Text('190101'),new TemperatureAveragingPair(-61,1)).runTest();}

注意流利的api样式,这增加了创建测试的难度。 要编写测试,您将:

  1. 实例化完全与被测映射器参数化的MapDriver类的实例。
  2. 在withMapper调用中添加要测试的Mapper实例。
  3. 在withInput调用中,输入您的键和输入值,在这种情况下,一个LongWritable具有任意值和一个Text对象,其中包含来自NCDC天气数据集的行,该数据集包含在名为“ temps”的字符串数组中,该数组早先在2000年建立。测试(此处不会显示,因为它会脱离演示文稿)。
  4. 在withOutput调用中指定期望的输出,在这里我们期望一个Text对象的值为“ 190101”,一个TemperatureAveragingPair对象的值为-61(温度)和1(计数)。
  5. 最后一个调用runTest将指定的输入值输入到映射器中,并将实际输出与“ withOutput”方法中设置的预期输出进行比较。

需要注意的一件事是,MapDriver每次测试仅允许一个输入和输出。 您可以根据需要多次调用withInput和withOutput,但是MapDriver会用新值覆盖现有值,因此您将只能在任何时间使用一个输入/输出进行测试。 要指定多个输入,我们将使用MapReduceDriver,稍后将介绍几节,但接下来将测试化简器。

测试减速器

测试减速器遵循与映射器测试相同的模式。 再次,让我们开始看一个代码示例:

@Test
public void testReducerCold(){List<TemperatureAveragingPair> pairList = new ArrayList<TemperatureAveragingPair>();pairList.add(new TemperatureAveragingPair(-78,1));pairList.add(new TemperatureAveragingPair(-84,1));pairList.add(new TemperatureAveragingPair(-28,1));pairList.add(new TemperatureAveragingPair(-56,1));new ReduceDriver<Text,TemperatureAveragingPair,Text,IntWritable>().withReducer(new AverageTemperatureReducer()).withInput(new Text('190101'), pairList).withOutput(new Text('190101'),new IntWritable(-61)).runTest();}
  1. 该测试首先创建一个TemperatureAveragingPair对象列表,以用作减速器的输入。
  2. 实例化了ReducerDriver,并且与MapperDriver一样,对它的参数设置也与被测试的reducer完全一样。
  3. 接下来,我们传递要在withReducer调用中测试的reducer实例。
  4. 在withInput调用中,我们传入键“ 190101”和在测试开始时创建的pairList对象。
  5. 接下来,我们指定我们期望减速器发出的输出,相同的键“ 190101”和一个IntWritable,它表示列表中的温度平均值。
  6. 最终调用runTest,它将为我们的减速器提供指定的输入,并将减速器的输出与期望输出进行比较。

ReducerDriver具有与MapperDriver相同的限制,即不接受多个输入/输出对。 到目前为止,我们已经单独测试了Mapper和Reducer,但我们也想在集成测试中一起测试它们。 可以通过使用MapReduceDriver类来完成集成测试。 MapReduceDriver还是用于测试组合器,自定义计数器或自定义分区程序使用情况的类。

整合测试

为了测试您的mapper和reducer一起工作,MRUnit提供了MapReduceDriver类。 如您现在所期望的,MapReduceDriver类有两个主要区别。 首先,参数化映射器的输入和输出类型以及化简器的输入和输出类型。 由于映射器输出类型需要与化简器输入类型匹配,因此最终需要3对参数化类型。 其次,您可以提供多个输入并指定多个预期输出。 这是我们的示例代码:

@Test
public void testMapReduce(){new MapReduceDriver<LongWritable,Text,Text,TemperatureAveragingPair,Text,IntWritable>().withMapper(new AverageTemperatureMapper()).withInput(new LongWritable(1),new Text(temps[0])).withInput(new LongWritable(2),new Text(temps[1])).withInput(new LongWritable(3),new Text(temps[2])).withInput(new LongWritable(4),new Text(temps[3])).withInput(new LongWritable(5),new Text(temps[6])).withInput(new LongWritable(6),new Text(temps[7])).withInput(new LongWritable(7),new Text(temps[8])).withInput(new LongWritable(8),new Text(temps[9])).withCombiner(new AverageTemperatureCombiner()).withReducer(new AverageTemperatureReducer()).withOutput(new Text('190101'),new IntWritable(-22)).withOutput(new Text('190102'),new IntWritable(-40)).runTest();}

从上面的示例中可以看到,设置与MapDriver和ReduceDriver类相同。 您传入映射器,reducer和(可选)组合器的实例进行测试。 MapReduceDriver允许我们传递具有不同键的多个输入。 此处的“临时”数组与在映射器示例中引用的数组相同,并包含来自NCDC天气数据集的几行,而这些示例行中的键是1901年1月和2月的月份,分别表示为“ 190101”和“ 190102“。 该测试是成功的,因此我们对映射器和化简器一起工作的正确性有了更多的信心。

结论

希望我们已经证明了MRUnit对于测试Hadoop程序有多么有用。 我想用我自己的一些观点来总结这篇文章。 尽管MRUnit使映射器和化简器代码的单元测试变得容易,但是这里介绍的映射器和化简器示例相当简单。 如果您的映射和/或精简代码开始变得更加复杂,则最好将代码与Hadoop框架解耦,然后单独测试新类。 另外,与MapReduceDriver类一样,它对于集成测试非常有用,很容易达到不再测试代码,而已经测试Hadoop框架本身的地步。 我提出了自己打算继续使用的测试策略:

  1. 单元测试映射/减少代码。
  2. 可能使用MapReduceDriver类编写一个集成测试。
  3. 作为一个健全性检查,请在单节点安装(在我的笔记本电脑上)上运行MapReduce作业,以确保其在Hadoop框架上运行。
  4. 然后,在我的案例中,使用Apache Whirr在EC2的测试集群上运行我的代码。

讨论如何在笔记本电脑(OSX Lion)上设置单节点安装以及如何使用Whirr在EC2上建立群集将使这篇文章过长,因此我将在下一篇文章中介绍这些主题。 谢谢你的时间。

资源资源

  • Jimmy Lin和Chris Dyer 使用MapReduce进行的数据密集型处理
  • Hadoop: Tom White 的权威指南
  • 来自博客的源代码
  • Hadoop API
  • MRUnit用于单元测试Apache Hadoop映射减少工作
  • Gutenberg项目提供了大量纯文本格式的书籍,非常适合在本地测试Hadoop作业。


参考: 《 随机编码》博客上的JCG合作伙伴 Bill Bejeck的《 使用MRUnit测试Hadoop程序》 。

翻译自: https://www.javacodegeeks.com/2012/11/testing-hadoop-programs-with-mrunit.html

mrunit

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql innodb flush method_对innodb_flush_method的一点解释

官方文档描述如下&#xff1a;By default, InnoDB uses the fsync()system call to flush both the data and log files. Ifinnodb_flush_method option is set to O_DSYNC, InnoDB uses O_SYNC to open and flush thelog files, and fsync()to flush the data files. If O_DIR…

信号量、互斥体和自旋锁

一、信号量 信号量又称为信号灯&#xff0c;它是用来协调不同进程间的数据对象的&#xff0c;而最主要的应用是共享内存方式的进程间通信。本质上&#xff0c;信号量是一个计数器&#xff0c;它用来记录对某个资源&#xff08;如共享内存&#xff09;的存取状况。一般说来&…

alembic教程

安装pip install alembic步骤 1.初始化 alembic 仓库 在终端中&#xff0c; cd 到你的项目目录中&#xff0c;然后执行命令 alembic init alembic &#xff0c;创建一个名叫 alembic 的仓库。2.创建模型 class User(Base):__tablename__ userid Column(Integer,primary_keyTr…

实际的Reactor操作–检索Cloud Foundry应用程序的详细信息

CF-Java-Client是一个库&#xff0c;可通过程序访问Cloud Foundry Cloud Controller API 。 它建立在Project Reactor之上&#xff0c;它是Reactive Streams规范的实现&#xff0c;并且使用此库在Cloud Foundry环境中做一些实际的事情是一个有趣的练习。 考虑一个示例用例–给…

mysql生成app接口_Java实现app接口和Socket消息传递(10)java连接MySQL实现App登录接口...

原创&#xff1a;http://blog.csdn.net/iwanghang1.先来个Androiod端口的GIF效果图App图标大家可能没看清&#xff0c;这个是AndroidStudio3.0最新的默认App图标哦~~2.不要忘记把MySQL的jar导进来jar包放入的位置在这里&#xff1a;D:\eclipse-workspace\.metadata\.plugins\or…

centos yum安装nginx 提示 No package nginx available问题解决方法

问题原因&#xff1a; nginx位于第三方的yum源里面&#xff0c;而不在centos官方yum源里面 解决方法&#xff1a; 安装epel(Extra Packages for Enterprise Linux) a、去epel网站 http://fedoraproject.org/wiki/EPEL下载 b、我的系统是centos5.7&#xff0c;cpu是x86_64&#…

链接生成二维码图片

https://packagist.org/packages/houdunwang/qrcode转载于:https://www.cnblogs.com/pansidong/p/10247663.html

mysql pxc测试_Mysql同步机制 - PXC 压力测试 tpcc安装及使用

tpcc是针对mysql单机制定的测试标准&#xff0c;这个标准对于pxc集群来说要求太高&#xff0c;所有后面即使有些项目没有通过也不必太过在意&#xff0c;主要是压一下事务处理能力。Mysql单机虽然写入速度快&#xff0c;但相比于Mysql集群&#xff0c;单机能承受的并发能力远比…

RHEL(Red Hat Enterprise Linux)配置YUM源

前言 YUM&#xff08;全称为 Yellow dog Updater, Modified&#xff09;是一个在Fedora中的Shell前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的服务器自动下载RPM包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装所有依赖的软体包&#xff…

java中集合判空_Java中的类型安全的空集合

java中集合判空我以前曾在Java Collections类的实用程序上进行过博客撰写&#xff0c;并且特别地在使用Usings Collections Methods上的博客emptyList&#xff08;&#xff09;&#xff0c;emptyMap&#xff08;&#xff09;和emptySet&#xff08;&#xff09;上进行了博客撰写…

cnn验证码识别代码_中文项目:快速识别验证码,CNN也能为爬虫保驾护航

原标题&#xff1a;中文项目&#xff1a;快速识别验证码&#xff0c;CNN也能为爬虫保驾护航机器之心专栏作者&#xff1a;Nick Li随着卷积网络的推广&#xff0c;现在有各种各样的快捷应用&#xff0c;例如识别验证码和数学公式等。本文介绍了一个便捷的验证码识别项目&#xf…

CentOS yum 源的配置与使用

一、yum 简介 yum&#xff0c;是Yellow dog Updater, Modified 的简称&#xff0c;是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器。起初是由yellow dog 这一发行版的开发者Terra Soft 研发&#xff0c;用python 写成&#xff0c;那时还叫做yup(yellow dog updat…

使用ActiveMQ Artemis在两个WildFly服务器之间构建水平JMS桥

有时有必要将不同的Message Broker连接在一起。 在企业消息传递中&#xff0c;此方案称为桥接。 可以使用JMS和其他协议&#xff08;例如AMQP&#xff0c;ActiveMQ Artemis核心协议&#xff09;来完成。 该博客文章重点介绍在WildFly中运行的JMS与两个Apache ActiveMQ Artemis …

mysql 逻辑备份 物理备份_数据库的逻辑备份和物理备份--非RMAN

数据库的逻辑备份和物理备份--非RMAN,不用借助其他工具&#xff0c;只要归档日志和物理备份就可以实现的备份数据库的备份和恢复常规而且重要&#xff0c;恢复得到理想状态逻辑备份利用EXP备份&#xff0c;从数据库提取写入操作系统文件1.可以导出一个完整的数据库2.也可以导出…

如何在myeclipse中导入jar包?

右键项目名--->Build Path—>Configure Build Path... 会弹出来一个框 在那四个选项选择 Libraries 然后再选择 右边 第二个选项Add External Jars... 然后就是你JAR的路径。一般将导入的外部包放在lib目录下。

python入门if语句练习_python入门视频:09 if语句_练习.mp4

本视频课程目录如下&#xff1a;python6天学习基础课程 ├─01天│ python入门视频&#xff1a;01 计算机组成-硬件设备.mp4│ python入门视频&#xff1a;02 计算机组成-软件设备.mp4│ python入门视频&#xff1a;03 程序的执行流程和小结_.mp4│ pyt…

spring依赖日志_Spring:设置日志记录依赖项

spring依赖日志这篇文章描述了如何在Spring中设置日志依赖。 它基于Dave Syer的帖子中提供的信息 。 这里提供有关Java日志记录框架的提醒。 该代码示例可在GitHub的Spring-Logging-Dependencies目录中找到。 Spring使用Jakarta Commons Logging API&#xff08;JCL&#xff0…

网页UTF8转换GBK后出现问号?的原因

网页UTF8转换GBK后出现问号"?"的原因 网页编码转换是进行网页解析和处理的第一步。 互联网上越来越多的网页采用UTF-8编码&#xff0c;UTF-8用1到6个字节编码UNICODE字符&#xff0c;收录了超过10万个字符&#xff0c;BMP部分也有六万多个字符 而在进行编码转换时&…

关于 Number() parsint() abs() 的区别

1. parseInt(‘’) parseInt() 函数可解析一个字符串&#xff0c;并返回一个整数。 如果第一个字符不是数字或者负号&#xff0c;parseInt() 就会返回NaN 2.Number() 函数把对象的值转换为数字 3. Math.abs(x) 取得正数和负数的绝对值 转载于:https://www.cnblogs.com/…

python怎么安装pymysql_Python 安装pyMySQL过程记录

如果你的系统不支持 pip 命令&#xff0c;可以使用以下方式安装&#xff1a;1、使用 git 命令下载安装包安装(你也可以手动下载)&#xff1a;$ git clone https://github.com/PyMySQL/PyMySQL$ cd PyMySQL/$ python3 setup.py install2、如果需要制定版本号&#xff0c;可以使用…