整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

5.3.1用MRUnit来写单元测试 关于Mapper

hadoop 小红牛 6℃ 0评论

MapReduce中,map函数和reduce函数的独立测试非常方便,这是由函数风格决定的。MRUnit(/?"p:///?jcMZ»fl/o/*.apacAe.org/mrMm7/)是一个测试库,它便于将已知的输入传递给mapper或者检査reducer的输出是否符合预期。MRUnit与标准的执行框架(如JUnit)—起使用,因此可以将MapReduce作业的测试作为正常开发环境的一部分运行。例如这里描述的所有测试都可根据5.2节介绍的指令在IDE中运行。

范例5-5是一个mapper的测试。

范例5-5.MaxTemperatureMapper的单元测试

import java.io.IOException; import ong.apache.hadoop.io.*;

import org.apache.hadoop.mrunit.mapreduce.MapDriver; import org.junit.*;

 

gTest

public
void processesValidRecord() throws IOException,InterruptedException {
Text value = new
Text("0043011990999991950051518004+68750+023550FM-12+0382" +

// YearAAAA

"99999V0203201N00261220001CN9999999N9-00111+99999999999");

// TemperatureAAAAA

new MapDriver<LongWritable, Text, Text, IntWritable>()

•withMapper(new MaxTemperatureMapper())

• withinputValue(Value)

.withOutput(new Text (,r1950w), new IntWritable(-11))

.runTest();

测试很简单:传递一个天气记录作为mapper的输人,然后检査输出是否是读入的年份和气温。

由于测试的是mapper,所以可以使用MRUnitMapDriver.在调用runTest()方法执行这个测试之前,在test(MaxTemperatureMapper)下配置mapper、输入值、期望的输出key(1950,表示年份的Text对象)和期望的输 出值(-1.1X:,表示温度的IntWritable)。如果没有期望的输出值发出mapper,MRUnit测试失败。注意,由于mapper忽略输入key,因此,我们此处不需要设置输入key

在测试驱动的方式下,范例5-6创建了一个能够通过测试的Mapper实现。由于本章要进行类的扩展,所以每个类被放在包含版本信息的不同包中。例如,vl.MaxTemperatur'eMapper'是MaxTemperatureMapper的第一个版本。当然,不重新打包实际上也可以对类进行扩展。

范例5-6.第一个版本的Mapper函数通过了MaxTemperatureMapper测试

public class MaxTemperatureMapper*extends Mapper<LongWritableiText, Text, IntWritable> {

^Override

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

String line = value.toString();

String year = line.substring(15, 19);

int airTemperature = Integer.parselnt(line.substring(87, 92)); context.write(new Text(year), new IntWritable(airTemperature));

这是i个非常简单的实现,从行中抽出年份和气温,并将它们写到Context

 

中。现在,让我们增加一个缺失值的测试,该值在原始数据中表示气温+9999:

@Test*

public void ignoresMissingTemperatureRecord() throws IOException { InterruptedException {

Text value = new Text("0043011990999991950051518004+68750+023550FM-12+0382" + // YearAAAA

,,99999V0203201N00261220001CN9999999N9+99991+99999999999,');

// TemperatureAAAAA

new MapDpiver<LongWritable, Text, Text, IntWritable>()

.withMapper(new MaxTemperatureMapper())

.withinputValue(value)

.runTest();

}

根据withOutput()被调用的次数,MapDriver能用来检査0、1或多个输

出记录。在这个测试中由于缺失温度的记录已经被过滤掉,该测试保证对于这种特定的输入值不产生任何输出。

由于parselnt()不能解析带加号的整数,所以测试最后抛出NumberFormatException异常,以失败告终。下面修改此实现(版本2)来处理缺失值:

@Overide

public void map(LongWritable key, Text value, Context context)

throws IOException, InterruptedException {

String line = value.toString();

String year = line.substring(15, 19);

String temp = line.substring(87, 92); if (!missing(temp)) {

int airTemperature = Integer.parselnt(temp);

output.collect(new Text(year), new IntWritable(airTemperature));

private boolean missing(String temp) { return temp.equals("+9999");

这个测试通过后,我们接下来写reducer

转载请注明:全栈大数据 » 5.3.1用MRUnit来写单元测试 关于Mapper

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址