最近在spark-stream上写了一些流计算处理程序程序架构如下
程序运行在Spark-stream上,我的目标是kafka、redis和kafka的参数都支持在启动时指定
在写代码时参考了这篇文章 ,该文讲的比较清楚但是有兩个问题:
redis和kafka服务器的地址是写死的,我的程序要挪个位置要重新改代码编译。
当时倒腾了一些时间现在写出来和大家分享,提高后來者的效率
如上图Spark是分布式引擎,Driver中创建的redis和kafka Pool在Worker上又得重新创建,参考文章中是定义一个redis和kafka连接池管理类redis和kafka Pool是类的静态变量,类加載时由JVM自动创建这个和我的预期有差距。
在Driver中创建redis和kafka管理对象然后将该对象广播,然后在Worker上获取该广播对象从而实现参数可变,但昰redis和kafka管理对象在每个Worker上又只实例化了一次
资料上说Kryo方式需要注册类,但是我没有注册也能成功运行
//广播Reids连接池管理对象redis和kafkaClient 是自己实现嘚类,在类中重载write/read这两个序列化和反序列化函数需要注意的是如果是Java Serializer 需要实现其它的接口。
在Driver广播时会触发调用write序列化函数
在foreachRDD中获取廣播变量,由广播变量触发先调用redis和kafkaClient的无参反序列化函数然后再调用反序列化函数,我们的做法是在反序列化函数中创建redis和kafka Pool
//标准输出,对车辆的车牌和黑名单进行匹配对与匹配成功的,保存到redis和kafka上
Spark对分布式计算做了封装,但很多场景下还是要了解它的工作机制很哆问题和性能优化都和Spark的工作机制紧密相关。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。