我正在从权威指南书中学习Hadoop,并尝试执行这段代码,导致错误。
第5章的例子。链接到Github代码:
资源:
https://github.com/tomwhite/hadoop-book/blob/master/ch05/src/main/java/v1/MaxTemperatureMapper.java
public class MaxTemperatureMapper
extends Mapper<LongWritable, Text, 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.parseInt(line.substring(87, 92));
context.write(new Text(year), new IntWritable(airTemperature));
}
}
public class MaxTemperatureMapperTest {
@Test
public void processesValidRecord() throws IOException, InterruptedException {
Text value = new Text("0043011990999991950051518004+68750+023550FM-12+0382" +
"99999V0203201N00261220001CN9999999N9-00111+99999999999");
new MapDriver<LongWritable, Text, Text, IntWritable>()
.withMapper(new MaxTemperatureMapper())
.withInputValue(value)
.withOutput(new Text("1950"), new IntWritable(-11))
.runTest();
}
我得到的错误如下:
java.lang.IllegalStateException: No input was provided
at org.apache.hadoop.mrunit.MapDriverBase.preRunChecks(MapDriverBase.java:286)
at org.apache.hadoop.mrunit.mapreduce.MapDriver.run(MapDriver.java:142)
at org.apache.hadoop.mrunit.TestDriver.runTest(TestDriver.java:640)
at org.apache.hadoop.mrunit.TestDriver.runTest(TestDriver.java:627)
at book.hadoopdefinitiveguide.chap5.examples.MaxTemperatureMapperTest.processesValidRecord(MaxTemperatureMapperTest.java:12)
这恰好是我在hadoop中执行的第一个代码,它抛出了这个错误。任何帮助表示赞赏。提前致谢
答案 0 :(得分:2)
正如@Thomas Junblut指出的那样,你需要指定一个键和值。
但是(假设你正在使用mrunit 1.0或更高版本),withInputKey|Value
is deprecated。您应该使用withInput(K1 key, V1 val)
,在一个方法中指定bot键和值,而不是withInputValue(..).withInputKey(..)
。所以你有类似的东西
new MapDriver<LongWritable, Text, Text, IntWritable>()
.withMapper(new MaxTemperatureMapper())
.withInput(new LongWritable(), value)
.withOutput(new Text("1950"), new IntWritable(-11))
.runTest();
new LongWritable()
只是一个任意键。
修改强>
因此,经过进一步测试后,您的代码不会出现问题(弃用除外,但原因并非如此)。
我使用我发布的代码运行相同的测试并得到完全相同的错误。我测试了一些旧的练习项目。这些类没有正确构建似乎是一个问题。我创建了一个全新的项目,重写(复制粘贴)mapper类并创建了一个新的测试用例,保存了所有内容,运行它,并且工作正常。试着这样做。顺便说一下,我使用Eclipse Hadoop插件创建了MR项目