当前位置: 首页 > 知识库问答 >
问题:

使用Hadoop时的Hadoop MRUnit IllegalStateException-权威指南代码

张财
2023-03-14

我正在从权威指南书中学习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中执行的第一个代码,它会抛出这个错误。感谢任何帮助。提前致谢

共有1个答案

龙欣德
2023-03-14

正如@Thomas Junblut所指出的,您需要在指定值的同时指定一个键。

但是(假设您使用的是mrunit 1.0或更高版本),不推荐使用withInputKeyValue。您应该使用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上使用eclipse Hadoop插件创建MR项目

 类似资料:
  • Yii 是一个高性能,基于组件的 PHP 框架,用于快速开发现代 Web 应用程序。 名字 Yii (读作 易)在中文里有“极致简单与不断演变”两重含义, 也可看作 Yes It Is! 的缩写。

  • 需要说明一下,因为一直有在看《HTTP权威指南》,觉得这是一本很值得称赞的一本高质量的书籍,书中内容涵盖很全面,而且配以插图,使得阅读起来很容易理解。

  • 版本控制是管理数据变更的艺术,无论数据变更是来自同一个人,还是来自不同的人(一个团队)。版本控制系统不但要忠实地记录数据的每一次变更,还要能够帮助还原任何历史改动,以及实现团队的协同工作等。Git就是版本控制系统中的佼佼者。

  • SQLite 的普及很大程度上应该归功于 Michael Owens。Mike 在 The Linux Journal (June 2003)和 The C/C++ Users Journal (March 2004) 上的文章吸引了无数程序员。

  • 前言 版本控制是管理数据变更的艺术,无论数据变更是来自同一个人,还是来自不同的人(一个团队)。版本控制系统不但要忠实地记录数据的每一次变更,还要能够帮助还原任何历史改动,以及实现团队的协同工作等。Git就是版本控制系统中的佼佼者。 我对版本控制系统的兴趣源自于我在个人知识管理中的实践,其核心就是撰写可维护的文档,并保存于版本控制系统中。可维护文档的格式可以是DocBook、FreeMind、reS

  • Ansilbe 是一个部署一群远程主机的工具。远程的主机可以是本地或者远程的虚拟机,也可以是远程的物理机。