0

我正在尝试使用 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?

4

1 回答 1

2

在 HBase 0.96 版本中,一些类不再实现 Writable,但是来自 HBase 的人们为它们创建了一个新的序列化类。

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

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

结果类 org.apache.hadoop.hbase.mapreduce.ResultSerialization KeyValue 类 org.apache.hadoop.hbase.mapreduce.KeyValueSerialization Put & Get 类 org.apache.hadoop.hbase.mapreduce.MutationSerialization

于 2014-03-21T10:40:25.307 回答