碳基体

奋斗在产品安全第一线的安全妹子

如何在mapreduce中处理protocolbuf序列化格式的文件


一、生成proto协议描述文件对应的java文件

对于一些采取protocolbuf序列化存储的日志文件,在做数据分析之前,需要日志解析(反序列化),以java语言为例


公司主流使用protobuf 2.4.1版本,如果采用默认安装版本都会高于此版本,因此需要降级,以mac为例,可以采用以下方式降级

brew tap homebrew/versions

brew install protobuf241

brew link --force --overwrite protobuf241

安装成功后,开始将proto文件转换为java文件,为了规范化编程,需要保证proto文件有以下描述信息

vim test.proto

增加

package tanjiti.web.access;

option java_package = "tanjiti.web.access";

option java_outer_classname = "AccessLogProtos";

option java_generic_services = true;

然后运行以下命令

protoc --proto_path=src --java_out=build/gen  src/test.proto

就会在build/gen目录下生成对应的java包

build/gen/

└── tanjiti
    └── web
        └── access

            └── AccessLogProtos.java


二、MapReduce中调用解析方法

设置输入文件处理格式与将BytesWritable类型转化为byte[] 类型

job.setInputFormat(SequenceFileAsBinaryInputFormat.class); // 将MR输入文件格式设置为二进制序列文件格式

map( Object key, BytesWritable value... //设置map key 为object, value 为BytesWritable 类型

value.setCapacity(value.getSize());// 将BytesWritable类型转化为byte[] 类型

byte[] line = value.getBytes();


接下来,交给自动生成的AccessLogProtos.java文件对应的parseForm(byte [] line)方法,来提取对应字段

来源:碳基体

评论