hadoop mrunit illegalstateexception当使用hadoop时的最终指导代码

z9ju0rcb  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(266)

我正在学习hadoop的权威指导书,并试图执行这段代码,这是导致错误的。
第五章的例子。链接到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));
}

}
测试:https://github.com/tomwhite/hadoop-book/blob/master/ch05/src/test/java/v1/maxtemperaturemappertest.java

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中执行的第一个代码,它抛出了这个错误。感谢您的帮助。提前谢谢

r7knjye2

r7knjye21#

正如@thomasjunblut所指出的,您需要在指定值的同时指定一个键。
但是(假设您使用的是mrunit1.0或更高版本), withInputKey|Value 已弃用。你应该改用 withInput(K1 key, V1 val) ,其中在一个方法中指定键和值,而不是 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上使用eclipsehadoop插件创建mr项目

相关问题