在mapreduce中读取protobuf数据时,会遇到一个坑
BytesWritable。当你把byte[]数据保存到BytesWritable后,通过BytesWritable.getBytes()再读到的数据并不一定是原数据,可能变长了很多,这是因为BytesWritable采用了自动内存增长算法,你保存的数据长度为size时,它可能将数据保存到了长度为capacity(capacity>size)的buffer中,这时候,你通过BytesWritable.getBytes()得到的数据最后一些字符是多余的,如果里面保存的是protobuf序列化后的数据,则无法反序列化,这时候可以使用BytesWritable.setCapacity(BytesWritable.getLength())将后面多余空间剔除掉,然后就可以使用protobuf反序列为原始数据。
关键代码如下