2015-04-30 4 views
0

Когда я запускаю основную MRUnit с MultipleOutputs я получаю следующее исключение:MRUnit не работает с MultipleOutputs

java.lang.NullPointerException 
at org.apache.hadoop.fs.Path.<init>(Path.java:105) 
at org.apache.hadoop.fs.Path.<init>(Path.java:94) 
at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.getDefaultWorkFile(FileOutputFormat.java:264) 
at org.apache.hadoop.mapreduce.lib.output.TextOutputFormat.getRecordWriter(TextOutputFormat.java:125) 
at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.getRecordWriter(MultipleOutputs.java:405) 
at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.write(MultipleOutputs.java:387) 
at com.skobbler.scratch.MOutputReduce.reduce(MOutputReduce.java:45) 
at com.skobbler.scratch.MOutputReduce.reduce(MOutputReduce.java:28) 
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:164) 
at org.apache.hadoop.mrunit.mapreduce.ReduceDriver.run(ReduceDriver.java:265) 
at org.apache.hadoop.mrunit.mapreduce.ReducePhaseRunner.runReduce(ReducePhaseRunner.java:85) 
at org.apache.hadoop.mrunit.mapreduce.MapReduceDriver.run(MapReduceDriver.java:249) 
at org.apache.hadoop.mrunit.TestDriver.runTest(TestDriver.java:640) 
at org.apache.hadoop.mrunit.TestDriver.runTest(TestDriver.java:627) 

Я обнаружил, что конфигурация mapred.output.dir испрашивается, которая равна нулю. Эта проблема не появляется с простым выходом.

код MRUnit:

@Test 
public void testMultiOutput() throws IOException{ 
    MapReduceDriver<LongWritable, Text, Text, Text, Text, Text> mapReduceDriver = createMapReduceDrive(); 
    mapReduceDriver.withInput(new LongWritable(0L), new Text("a,b")); 
    mapReduceDriver.withInput(new LongWritable(0L), new Text("a,c")); 
    mapReduceDriver.withMultiOutput("foo", new Text("a"), new Text("2")); 
    mapReduceDriver.runTest(); 
} 

private MapReduceDriver<LongWritable, Text, Text, Text, Text, Text> createMapReduceDrive() { 
    MOutputMap mapper = new MOutputMap(); 
    MOutputReduce reducer = new MOutputReduce(); 
    return MapReduceDriver.newMapReduceDriver(mapper, reducer); 
} 

Как я могу запустить тест без указания системы Hadoop/путь вывода.

Hadoop 2, MRUnit 1.1.0

+0

У меня возникли проблемы с воспроизведением вашей проблемы. Обычно я вижу нечто вроде «Отсутствие ожидаемых результатов для namedOutput ...» или «java.lang.IllegalArgumentException: Именованный вывод» someOutput «не определено», но не «NullPointerException». Не могли бы вы предоставить больше своего кода или небольшой образец, который можно было бы протестировать? – Keegan

+0

Я использовал обходное решение, издевался над испусканием редуктора, чтобы вместо этого использовать context.write(). Возможно, это проблема с версией windows/hadoop. –

ответ

1

Я столкнулся с этим же вопросом в последнее время. Я использовал @RunWith (SpringJUnit4ClassRunner.class) аннотаций и раньше, но в соответствии с замечаниями в вопросах JIRA для MRUnit в https://issues.apache.org/jira/browse/MRUNIT-13 и https://issues.apache.org/jira/browse/MRUNIT-213 мы должны использовать @RunWith (PowerMockRunner.class) @PrepareForTest (MyMapper.class) или @PrepareForTest (MyReducer.class) для запуска тестов, использующих MultipleOutput.

Я надеюсь, что это поможет кому-то другому, кто сталкивается с этой проблемой.

1

Да, я столкнулся с этой проблемой. Но я нахожу решение из его исходного кода.

TestDriver.java

Ваш метод может использовать getConfiguration(), чтобы получить JobConfiguration объект, а затем установите OutputDir.

Configuration conf = mapReduceDriver.getConfiguration(); 
    conf.set("mapreduce.output.fileoutputformat.outputdir", "aa"); 

 Смежные вопросы

  • Нет связанных вопросов^_^