2012-04-12 5 views
1

입력,지도 출력 및 출력 감소에 AVRO를 사용하는 매퍼 & 감속기를 만들었습니다. MRUnit 테스트를 만들 때 나는 다음과 같은 스택 트레이스를 얻을 :MRUnit과 AVRO를 함께 사용하십시오.

(나는 아 브로 맵리 듀스 API 구현을 만든) 다음과 같이 드라이버가 초기화됩니다
java.lang.NullPointerException 
at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73) 
at org.apache.hadoop.mrunit.mock.MockOutputCollector.deepCopy(MockOutputCollector.java:74) 
at org.apache.hadoop.mrunit.mock.MockOutputCollector.collect(MockOutputCollector.java:110) 
at org.apache.hadoop.mrunit.mapreduce.mock.MockMapContextWrapper$MockMapContext.write(MockMapContextWrapper.java:119) 
at org.apache.avro.mapreduce.AvroMapper.writePair(AvroMapper.java:22) 
at com.bol.searchrank.phase.day.DayMapper.doMap(DayMapper.java:29) 
at com.bol.searchrank.phase.day.DayMapper.doMap(DayMapper.java:1) 
at org.apache.avro.mapreduce.AvroMapper.map(AvroMapper.java:16) 
at org.apache.avro.mapreduce.AvroMapper.map(AvroMapper.java:1) 
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) 
at org.apache.hadoop.mrunit.mapreduce.MapDriver.run(MapDriver.java:200) 
at org.apache.hadoop.mrunit.mapreduce.MapReduceDriver.run(MapReduceDriver.java:207) 
at com.bol.searchrank.phase.day.DayMapReduceTest.shouldProduceAndCountTerms(DayMapReduceTest.java:39) 

:

driver = new MapReduceDriver<AvroWrapper<Pair<Utf8, LiveTrackingLine>>, NullWritable, AvroKey<Utf8>, AvroValue<Product>, AvroWrapper<Pair<Utf8, Product>>, NullWritable>().withMapper(new DayMapper()).withReducer(new DayReducer()); 

이 io.serialization있는 구성 객체를 추가 도움이되지 않습니다 :

Configuration configuration = new Configuration(); 
    configuration.setStrings("io.serializations", new String[] { 
     AvroSerialization.class.getName() 
    }); 
    driver = new MapReduceDriver<AvroWrapper<Pair<Utf8, LiveTrackingLine>>, NullWritable, AvroKey<Utf8>, AvroValue<Product>, AvroWrapper<Pair<Utf8, Product>>, NullWritable>().withMapper(new DayMapper()).withReducer(new DayReducer()).withConfiguration(configuration); 

을 나는 클라우 데라와 브로 MapRed 1.6.3에서 하둡 & MRUnit 0.20.2-cdh3u2를 사용합니다.

+0

비교할 수 할 필요가 없게 K2 유형 매개 변수에 대한 제한을 완화? –

+0

드라이버가 생성되기 전에 컨피규레이션이 생성됩니다. 또한 버전 번호도 추가되었습니다. – Salandur

+0

여기에 누락 된 코드가 더 있습니다 - MapReduceDriver 생성자 라인에 대한 컴파일 오류가 발생했습니다 :'바인딩 불일치 : 유형 AvroKey 이 MapReduceDriver 유형의 바운드 매개 변수 K2, V2, K3, V3>'이다. (MRUnit없이) 작동하는 직렬화 팩토리의 간단한 단위 테스트를 얻을 수 있습니다. –

답변

1

SerializationFactory가 io.serializations에서 직렬화를 구현하는 허용 가능한 클래스를 찾지 못해서 NPE를 얻고 있습니다.

MRUnit에는 MRUNIT-45, MRUNIT-70, MRUNIT-77, MRUNIT-86, https://issues.apache.org/jira/browse/MRUNIT 등의 Writable 외에 일련 번호와 관련된 몇 가지 버그가있었습니다. 이 버그에는 SerializationFactory 생성자에 올바르게 전달되지 않는 conf가 있거나 코드에 모든 Writable에있는 Key 또는 Value의 기본 생성자가 필요합니다. 이 모든 수정 사항은 아파치 MRUnit 0.9.0에 나타납니다.이 바이러스는 이번 주 언젠가 공개 될 것입니다.

Cloudera의 0.20.2-cdh3u2 MRUnit은 Apache MRUnit 0.5.0- 잠복기에 가깝습니다. 나는 당신의 코드가 0.9.0-incubating에서도 여전히 문제가 될 수 있다고 생각한다. [email protected]에 전체 코드 예제를 이메일로 보내주기 바란다. 아파치 MRUnit 프로젝트는 그것을보기 위해 기뻐할 것이다.

이 지금 MRUNIT-99를 컴파일 당신이 사용하고 드라이버를 만들기 전에 구성`io.serializations`를 구성하는 mrunit 어떤 버전의

+0

0.9.0 인큐베이팅으로 전환하고 이제 대부분 실행합니다. 또 다른 예외가 있습니다 : java.lang.ClassCastException : java.lang.Long은 java.lang.CharSequence로 형변환 될 수 없습니다. 지금 바로 그걸 살펴보기 – Salandur

+0

또한보십시오 http://stackoverflow.com/a/15235952/1408527 – oby1

관련 문제