Protobuf结合Spark Structured Streaming使用

背景

    在项目开发中对流式数据使用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;    //英文
    //以下补充标准列表
}

//日志字符编码枚举
enum CodeType {
    CODE_TYPE_UNKNOWN = 0;  //为止类型
    UTF8 = 1;   //utf8
    GBK = 2;    //gbk
}

message Log {
    //以上ID小于129的字段为预留字段,不能添加,用户自有字段ID从130开始
    optional int64 connection_code = 130;   //用户连接号
    optional string action_json = 131;  //用户行为数据
    required string send_time = 132;    //请求发送时间
}

    自己电脑安装proto编译器,Window、Mac环境的安装教程一搜一大堆,自己去下载,安装就行。
    因为我的程序运行环境问题,我在本机上安装了2.4.1版本,下载路径如下:https://github.com/protocolbuffers/protobuf/releases/tag/v2.4.1
    我的系统是MAC,所以安装完成后,在终端输入命令

protoc --version

结果显示为

libprotoc 2.4.1

就成功了。

protobuf编译成Java类

在本机终端输入命令:

protoc -I=proto文件存储目录 --java_out=最终Java类想要存放目标目录的绝对路径 proto文件的绝对路径

就会在--java_out参数指定的路径下生成目标Java类,我使用test.proto生成了Test.java类;将生成的Test.java类移到代码中指定目录下。

Maven依赖

我的项目是Scala项目,所以需要在maven项目中需添加protobuf-java依赖才可以使用上面的Java类,我的POM依赖如下:

<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>2.4.1</version>
</dependency>

Maven依赖的坑

  • Maven依赖版本一定要和本地生成Java类的protoc编译器版本保持一致,否则将造成proto对应的Java类不可用;
  • 我们的Hadoop环境中依赖的protobuf版本为2.5.0,但是引入的spark-core依赖,使用的是protobuf2.4.1,其中,2.4.1和2.5.0不可兼容。
    • 可在项目路径下使用命令mvn dependency:tree来查看maven依赖自身还依赖了哪些包及具体版本;
    • 一开始我安装了最新的3.5.1版本,但是编译运行时,报错信息为:
java.lang.NoSuchMethodError

但是我在本地跳转却可以跳转到相应的方法中去,造成这种情况是因为包冲突,所以我将protoc版本降到了2.5.0,但是报错信息为:

java.lang.VerifyError:class com.XX.XX.Test$Log overrides final method......

这是因为虽然Hadoop环境中用到了2.5.0,但在运行Spark程序的时候,还是会去调用2.4.1,所以我又将版本降成了2.4.1。在降为2.4.1后,对一些与2.4.1版本无法兼容的其他依赖的版本做了相应修改。
调用成功!

Spark代码

val inputStream = spark.readStream
    ......
    .load
    .as[Array[Byte]]
    .map(row => {
        val log = Test.Log.parseFrom(row)
        val action_json = log.getActionJson
        action_json
    })
    .toDF("value")

[图片上传失败...(image-b2d825-1627808612072)]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容