【问题标题】:Hadoop MRUnit IllegalStateException when using Hadoop-The Definitive Guide code使用 Hadoop 时的 Hadoop MRUnit IllegalStateException-权威指南代码
【发布时间】:2014-09-07 14:29:09
【问题描述】:

我正在从权威指南书中学习 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));
}

}

测试: 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 中执行的第一个代码,它抛出了这个错误。任何帮助表示赞赏。提前致谢

【问题讨论】:

  • 你需要一个键和一个值,你只提供了值。

标签: java hadoop mrunit


【解决方案1】:

正如@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() 只是一个任意键。


编辑

所以经过进一步的测试,你的代码没有问题(除了弃用,但这不是原因)。

我使用我发布的代码运行了相同的测试并得到了完全相同的错误。我用一些旧的练习项目进行了测试。没有正确构建类似乎是一个问题。我创建了一个全新的项目,重写(复制粘贴)映射器类并创建了一个新的测试用例,保存所有内容,运行它,它运行良好。尝试这样做。顺便说一句,我正在使用 Eclipse Hadoop 插件创建 MR 项目

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多