Hadoop MRUnit IllegalStateException при использовании кода Hadoop-The Definitive Guide

Я изучаю 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, и он выдает эту ошибку. Любая помощь приветствуется. заранее спасибо


person BrownBeast    schedule 07.09.2014    source источник
comment
Вам нужен ключ и значение, вы указали только значение.   -  person Thomas Jungblut    schedule 07.09.2014


Ответы (1)


Как указал @Thomas Junblut, вам нужно указать ключ вместе со значением.

Но (при условии, что вы используете mrunit 1.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() - это просто произвольный ключ.


ИЗМЕНИТЬ

Итак, после дальнейшего тестирования это не проблема с вашим кодом (за исключением устаревания, но это не причина).

Я провел тот же тест, используя код, который я разместил, и получил точно такую ​​​​же ошибку. Я тестировал с каким-то старым тренировочным проектом, который у меня был. Казалось, что проблема в неправильном построении классов. Я создал совершенно новый проект, переписал (скопировал-вставил) класс картографа и создал новый тестовый пример, все сохранил, запустил, и все заработало нормально. Попробуйте сделать это. Кстати, я нахожусь в eclipse, используя плагин Eclipse Hadoop для создания проекта MR.

person Paul Samsotha    schedule 07.09.2014