带有HBase和MapReduce的MRUnit在序列化时出错

时间:2014-03-20 11:59:55

标签: mapreduce hbase mrunit

我尝试使用MRUnit测试我的MapReduce,当我进行集成测试时,它可以工作。我有一些单元测试,我也希望通过它们。

我的MRUnit驱动程序和MapReduce类是:

MapDriver<ImmutableBytesWritable, Result, ImmutableBytesWritable, KeyValue>

public final class HashMapper extends
    TableMapper<ImmutableBytesWritable, KeyValue> 

当我定义输入时,我收到错误:

mapDriver.withInput(new ImmutableBytesWritable(Bytes
                .toBytes("query")), new Result(kvs1));

java.lang.NullPointerException
    at org.apache.hadoop.mrunit.internal.io.Serialization.copy(Serialization.java:73)
    at org.apache.hadoop.mrunit.internal.io.Serialization.copy(Serialization.java:91)
    at org.apache.hadoop.mrunit.internal.output.MockOutputCollector.collect(MockOutputCollector.java:48)
    at org.apache.hadoop.mrunit.internal.mapreduce.AbstractMockContextWrapper$4.answer(AbstractMockContextWrapper.java:90)
    at org.mockito.internal.stubbing.StubbedInvocationMatcher.answer(StubbedInvocationMatcher.java:29)
    at org.mockito.internal.MockHandler.handle(MockHandler.java:95)
    at org.mockito.internal.creation.MethodInterceptorFilter.intercept(MethodInterceptorFilter.java:47)

我猜它是因为它不像Result和KeyValue对象,因为它们不可写,但我不会忽略为什么集成测试会起作用。当所有这些对象实现Writable时,它正在使用Hbase 0.94,现在我正在使用HBase 0.96。有什么线索我应该在这里使用MRUnit吗?

1 个答案:

答案 0 :(得分:2)

对于HBase 0.96版本,某些类不再实现Writable,但HBase的人员为它们创建了一个新的序列化类。

因此,解决方案是在配置中指出MRUnit必须使用的类:

该属性称为 io.serializations 不同的序列号是:

结果类org.apache.hadoop.hbase.mapreduce.ResultSerialization KeyValue类org.apache.hadoop.hbase.mapreduce.KeyValueSerialization 放&amp;获取类org.apache.hadoop.hbase.mapreduce.MutationSerialization