在mapreduce中读取protobuf数据时,会遇到一个坑
BytesWritable。当你把byte[]数据保存到BytesWritable后,通过BytesWritable.getBytes()再读到的数据并不一定是原数据,可能变长了很多,这是因为BytesWritable采用了自动内存增长算法,你保存的数据长度为size时,它可能将数据保存到了长度为capacity(capacity>size)的buffer中,这时候,你通过BytesWritable.getBytes()得到的数据最后一些字符是多余的,如果里面保存的是protobuf序列化后的数据,则无法反序列化,这时候可以使用BytesWritable.setCapacity(BytesWritable.getLength())将后面多余空间剔除掉,然后就可以使用protobuf反序列为原始数据。
关键代码如下
conf.setInputFormat(SequenceFileAsBinaryInputFormat.class);
public void map(Object key, BytesWritable values, OutputCollector output, Reporter reporter) throws IOException { values.setCapacity(values.getLength());// very important !!! byte[] data = values.getBytes(); // more code }