[HADOOP] MRUnit와 브로가있는 InstantiationException을 제공합니다
HADOOPMRUnit와 브로가있는 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.이거 한번 해봐; 그것은 오류가 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;
from https://stackoverflow.com/questions/22591342/avro-with-mrunit-gives-instantiationexception by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 단지 중복을 방출하는 감속기를 얻는 방법 (0) | 2019.10.11 |
---|---|
[HADOOP] Kerberos는 : 합계 실패 문제를 확인 (0) | 2019.10.11 |
[HADOOP] 읽기 / Windows 서버에서 HDFS에 파일을 작성 (0) | 2019.10.11 |
[HADOOP] 계획에 대한 파일 시스템 없습니다 : HDFS (0) | 2019.10.11 |
[HADOOP] 어떻게 하둡에서 자바에 대한 combineFileInputFormat를 사용 하는가? (0) | 2019.10.11 |