一、生成proto协议描述文件对应的java文件
对于一些采取protocolbuf序列化存储的日志文件,在做数据分析之前,需要日志解析(反序列化),以java语言为例公司主流使用protobuf 2.4.1版本,如果采用默认安装版本都会高于此版本,因此需要降级,以mac为例,可以采用以下方式降级
安装成功后,开始将proto文件转换为java文件,为了规范化编程,需要保证proto文件有以下描述信息brew tap homebrew/versions
brew install protobuf241brew link --force --overwrite protobuf241
增加vim test.proto
然后运行以下命令package tanjiti.web.access;
option java_package = "tanjiti.web.access";option java_outer_classname = "AccessLogProtos";option java_generic_services = true;
就会在build/gen目录下生成对应的java包protoc --proto_path=src --java_out=build/gen src/test.proto
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)方法,来提取对应字段