背景
在项目开发中对流式数据使用Spark Structured Streaming进行处理,处理流程为:消息中间件(source) -> Spark Structured Streaming(work) -> AFS(sink)。
在source->work这个过程中,消息以protobuf形式存储,其中 Spark Structured Streaming接受到的数据格式为Array[Byte],所以我们需要将Array[Byte]形式的数据通过protobuf反序列化出来,得到最终完整的String。
PS:一开始比较懒,直接使用new String(Array[Byte])的方式企图将数据粗暴的转成String,最后果然只能看到其中一部分数据,剩下的另外很大一部分数据全都是乱码,或者直接是空格,导致我拿不到我想要的字段内容,所以最后还是老老实实使用protobuf进行反序列化。
心酸历程
废话少说,过程如下:
需准备的东西
- 一个可以拿到protoBuf格式数据的消息中间件;
- Spark Structured Streaming运行环境,我是用的是Hadoop环境;
- 消息中间件中protobuf数据对应的.proto文件;
- 本地可以执行protoc命令的protobuf编译器;
protobuf及本地环境相关准备
protobuf相关知识、proto语法等proto相关基础知识见proto官网:https://developers.google.cn/protocol-buffers/ 或者可以自己去搜一搜一些别人的博客之类的。
我的test.proto文件如下:
syntax = "proto2";
//语言种类枚举,后续可持续补充
enum LanguageTypes {
CH = 0; //中文
ENGLISH = 1;