복붙노트

[HADOOP] MRUnit와 브로가있는 InstantiationException을 제공합니다

HADOOP

MRUnit와 브로가있는 InstantiationException을 제공합니다

내가 사용하고 있습니다 :

... 전체 것은 내장 메이븐을 사용하여 테스트되고있다.

내가 직렬화에 브로 NullPointerException이와 MRUnit의 지시 사항을 준수 할 때까지 나는 NullPointerException이 얻고 있었다.

지금은없는 InstantiationException을 얻고있다 :

Running mypackage.MyTest
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
2014-03-23 20:49:21.463 java[27994:1003] Unable to load realm info from SCDynamicStore
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.945 sec <<< FAILURE!
process(mypackage.MyTest)  Time elapsed: 0.909 sec  <<< ERROR!
java.lang.RuntimeException: java.lang.InstantiationException
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:131)
    at org.apache.hadoop.io.serializer.SerializationFactory.add(SerializationFactory.java:72)
    at org.apache.hadoop.io.serializer.SerializationFactory.<init>(SerializationFactory.java:63)
    at org.apache.hadoop.mrunit.internal.io.Serialization.<init>(Serialization.java:37)
    at org.apache.hadoop.mrunit.TestDriver.getSerialization(TestDriver.java:464)
    at org.apache.hadoop.mrunit.TestDriver.copy(TestDriver.java:608)
    at org.apache.hadoop.mrunit.TestDriver.copyPair(TestDriver.java:612)
    at org.apache.hadoop.mrunit.MapDriverBase.addInput(MapDriverBase.java:118)
    at org.apache.hadoop.mrunit.MapDriverBase.withInput(MapDriverBase.java:207)
    at mypackage.MyTest.process(MyTest.java:92)
...

아 브로 모델은 다음과 같습니다 :

{
    "namespace": "model",
    "type": "record",
    "name": "Blob",
    "fields": [
        { "name": "value", "type": "string" }
    ]
}

맵퍼는 다음과 같습니다 :

public class MyMapper
    extends Mapper<AvroKey<Blob>, NullWritable, LongWritable, NullWritable>
{
    @Override
    public void map(AvroKey<Blob> key, NullWritable value, Context context)
            throws IOException, InterruptedException {
        context.write(new LongWritable(0), NullWritable.get());
    }
}

실패 테스트 (내가 지금 가지고있는 유일한 검사)는 다음과 같습니다 :

@Test
public void process() throws IOException {
    mapper = new MyMapper();
    job = Job.getInstance();
    mapDriver = MapDriver.newMapDriver(mapper);

    Configuration configuration = mapDriver.getConfiguration();
    //Copy over the default io.serializations. If you don't do this then you will 
    //not be able to deserialize the inputs to the mapper
    String[] serializations = configuration.getStrings("io.serializations");
    serializations = Arrays.copyOf(serializations, serializations.length + 1);
    serializations[serializations.length-1] = AvroSerialization.class.getName();
    configuration.setStrings("io.serializations", serializations);

    //Configure AvroSerialization by specifying the key writer and value writer schemas
    configuration.setStrings("avro.serialization.key.writer.schema", Schema.create(Schema.Type.LONG).toString(true));
    configuration.setStrings("avro.serialization.value.writer.schema", Schema.create(Schema.Type.NULL).toString(true));

    job.setMapperClass(MyMapper.class);
    job.setInputFormatClass(AvroKeyInputFormat.class);
    AvroJob.setInputKeySchema(job, Blob.SCHEMA$);
    job.setOutputKeyClass(LongWritable.class);

    input = Blob.newBuilder()
        .setValue("abc")
        .build();
    mapDriver
        .withInput(new AvroKey<Blob>(input), NullWritable.get())
        .withOutput(new LongWritable(0), NullWritable.get())
        .runTest();
}

나는 아 브로와 MRUnit 모두 아주 새로운, 그래서 나는 아직도 완전히 그들 사이의 동작을 이해하려합니다. 단위 테스트 출력에서 ​​내가 log4j에 대한 경고를보고이 문제의 일부가 아닌 것을 확실히 모른다 (나는 그것을 의심 생각).

해결법

  1. ==============================

    1.이거 한번 해봐; 그것은 오류가 ReflectionUtil에서하지만 외부 프레임은 직렬화에 관한 것입니다 당신이 당신의 쓰기를 구현하지 않습니다하지만. 그래서 아 브로 serializaion를 잘 설정되어 있지 대해이 될 수있다 생각합니다.

    이거 한번 해봐; 그것은 오류가 ReflectionUtil에서하지만 외부 프레임은 직렬화에 관한 것입니다 당신이 당신의 쓰기를 구현하지 않습니다하지만. 그래서 아 브로 serializaion를 잘 설정되어 있지 대해이 될 수있다 생각합니다.

            MapDriver driver = MapDriver.newMapDriver(your mapper);
    
            Configuration conf = driver.getConfiguration();
            AvroSerialization.addToConfiguration(conf);
            AvroSerialization.setKeyWriterSchema(conf, your schema);
            AvroSerialization.setKeyReaderSchema(conf, your schema);
            Job job = new Job(conf);
            job.set... your job settings;
            AvroJob.set... your avro job settings;
    
  2. from https://stackoverflow.com/questions/22591342/avro-with-mrunit-gives-instantiationexception by cc-by-sa and MIT license