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));
}
}
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