1

Я написал карту только hasoop, в которой я использовал концепцию MultipleOutputs. Проблема здесь в том, что я хочу протестировать этот код с помощью MRUnit. Я не вижу никакого рабочего примера для тестирования MultipleOutput.Пример MRUnit для множественных выходов

Мой картографа код будет похож,

public void map(LongWritable key, Text value, Context context) 
     throws IOException, InterruptedException { 

    String inputString = value.toString(); 
    String outputString = null; 
    Text resultValue = null; 

    String finalResult = null; 
    String exceptionMessage = null; 

    try { 

     outputString = processInput(dataSet, inputString); 

    } catch (MalformedURLException me) { 
     System.out.println("MalformedURLException Occurred in Mapper:" 
       + me.getMessage()); 
     exceptionMessage = me.getMessage(); 
    } catch (SolrServerException se) { 
     System.out.println("SolrServerException Occurred in Mapper:" 
       + se.getMessage()); 
     exceptionMessage = se.getMessage(); 
    } 
    if (outputString == null || outputString.isEmpty() 
      && exceptionMessage != null) { 
     exceptionMessage = exceptionMessage.replaceAll("\n", ", "); 
     finalResult = inputString + "\t[Error] =" + exceptionMessage; 
     resultValue = new Text(finalResult); 
     multipleOutputs.write(SearchConstants.FAILURE_FILE,NullWritable.get(), resultValue); 
    } else { 
     finalResult = inputString + outputString; 
     resultValue = new Text(finalResult); 
     multipleOutputs.write(SearchConstants.SUCCESS_FILE,NullWritable.get(), resultValue); 
    } 

} 

Может кто-нибудь из вас, ребята, дайте мне рабочий пример теста MRUnit с MultipleOutputs?

ответ

1

Вот пример с несколько упрощенной версией вашего класса

import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.NullWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs; 

import java.io.IOException; 

public class SomeMapper extends Mapper<LongWritable, Text, NullWritable, Text> { 
    public static final String SUCCESS_FILE = "successFile"; 
    private static MultipleOutputs<NullWritable, Text> multipleOutputs; 
    private static Text result = new Text(); 

    @Override 
    public void setup(Context context) throws IOException, InterruptedException { 
     multipleOutputs = new MultipleOutputs<>(context); 
     super.setup(context); 
    } 

    @Override 
    public void map(LongWritable key, Text value, Mapper.Context context) throws IOException, InterruptedException { 
     String outputString = "some result"; // logic here 

     result.set(outputString); 
     multipleOutputs.write(SUCCESS_FILE, NullWritable.get(), result); 
    } 
} 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.NullWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs; 
import org.apache.hadoop.mrunit.mapreduce.MapDriver; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({MultipleOutputs.class, SomeMapper.class}) 
public class SomeMapperTest { 
    @Test 
    public void someTest() throws Exception { 
     MapDriver<LongWritable, Text, NullWritable, Text> mapDriver = MapDriver.newMapDriver(new SomeMapper()); 
     mapDriver.withInput(new LongWritable(0), new Text("some input")) 
      .withMultiOutput(SomeMapper.SUCCESS_FILE, NullWritable.get(), new Text("some result")) 
      .runTest(); 
    } 
} 

и build.gradle

apply plugin: "java" 
sourceCompatibility = 1.7 
targetCompatibility = 1.7 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile "org.apache.hadoop:hadoop-client:2.4.0" 
    testCompile "junit:junit:4.12" 
    testCompile("org.apache.mrunit:mrunit:1.1.0:hadoop2") { 
    exclude(group: "org.mockito") 
    } 
    testCompile "org.powermock:powermock-module-junit4:1.6.2" 
    testCompile "org.powermock:powermock-api-mockito:1.6.2" 
} 

Примечание исключение Mockito. Без этого я получил исключение java.lang.NoSuchMethodError: org.mockito.mock.MockCreationSettings.getSerializableMode()Lorg/mockito/mock/SerializableMode;, потому что эта зависимость Hadoop вытащила org.mockito:mockito-core:1.9.5, что противоречило версии Мокито, которую Powermock хотел использовать.

Дополнительные примеры в модульных тестах MRUnit org.apache.hadoop.mrunit.mapreduce.TestMultipleOutput.

+0

Я использую Maven. Я получил ошибку ниже, когда пытался использовать PowerMock. Я также исключил зависимость от mockito. – Jahathesh

+1

Я использую Maven. Я получил ошибку ниже, когда пытался использовать PowerMock. Я также исключил зависимость от mockito. 'java.lang.NoClassDefFoundError: орг/Mockito/CGLIB/прокси/энхансер на org.powermock.api.extension.proxyframework.ProxyFrameworkImpl.isProxy (ProxyFrameworkImpl.java:50)' ' \t орг. apache.mrunit \t mrunit \t 1.1.0 \t hadoop2 \t \t \t \t \t org.mockito \t \t Mockito-жильный \t \t \t ' – Jahathesh

+0

Были ли ваши версии зависимостей, отличных от тех, в моем примере? Очевидно, что 'mvn dependency: tree' может дать некоторое представление. Это похоже на то, что ваша версия Powermock не включает Mockito. – Keegan