您的位置:首页 > 运维架构

hadoop中读取protobuf数据

2015-05-14 00:00 537 查看
在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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mapreduce hadoop protobuf