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

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


РЕДАКТИРОВАТЬ

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

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

Другие вопросы по тегам