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
2 ответа
Да, я сталкиваюсь с этой проблемой. Но я нахожу решение из его исходного кода.
Вы можете использовать метод getConfiguration(), чтобы получить объект JobConfiguration, а затем установить outputdir.
Configuration conf = mapReduceDriver.getConfiguration();
conf.set("mapreduce.output.fileoutputformat.outputdir", "aa");
Я столкнулся с этой же проблемой недавно. Ранее я использовал аннотацию @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) для запуска тестов, использующих MultipleOutputs.
Я надеюсь, что это помогает кому-то еще, кто сталкивается с этой проблемой.