2012-04-12 55 views
1

我创建了使用AVRO输入,地图输出连接减少输出映射&减速。当创建一个MRUnit测试中,我得到以下堆栈跟踪:使用MRUnit和AVRO一起

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) 

如下(我创建了一个MapReduce的Avro的API实现)驱动程序初始化:

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); 

我用的Hadoop & MRUnit从Cloudera公司和Avro公司MapRed 1.6.3 0.20.2-cdh3u2。

+0

什么版本mrunit您使用的是和你创建驱动程序之前在配置配置'io.serializations'是可比性? – 2012-04-12 12:03:22

+0

配置是在驱动程序之前创建的,我按照更新的语句。还添加了版本号。 – Salandur 2012-04-13 08:53:40

+0

有更多的代码在这里失踪 - 我得到一个编译错误您MapReduceDriver构造器行:'约束不匹配:类型AvroKey 不是有界参数的有效替代品类型的MapReduceDriver '。我能得到的工作序列化厂的一个简单的单元测试,但(没有MRUnit) – 2012-04-13 10:39:17

回答

1

你得到一个NPE因为SerializationFactory没有发现在io.serializations实现序列化的可接受类。

MRUnit不得不与序列化,除了可写了几个错误,包括MRUNIT-45,MRUNIT-70,MRUNIT-77,MRUNIT-86在https://issues.apache.org/jira/browse/MRUNIT。这些错误涉及到conf没有正确传递到SerializationFactory构造函数,或者代码需要所有Writable都具有的Key或Value的默认构造函数。所有这些修复程序都出现在Apache MRUnit 0.9.0-孵化环境中,该版本将在本周的某个时候发布。

Cloudera的0.20.2-cdh3u2 MRUnit接近阿帕奇MRUnit 0.5.0-孵化。我认为,你的代码可能仍然是一个问题,即使是在0.9.0-孵化,请以电子邮件的代码示例[email protected]和Apache MRUnit项目会很乐意看看它

现在,这将汇编MRUNIT-99放宽了对K2类型参数的限制没有

+0

我切换到0.9.0,孵化,现在它运行居多。得到了另一个异常:java.lang.ClassCastException:java.lang.Long不能转换为java.lang.CharSequence。目前正在研究此问题 – Salandur 2012-06-27 14:30:01

+0

另请参阅http://stackoverflow.com/a/15235952/1408527 – oby1 2014-01-19 00:33:28