如果你使用了Python作为编程实现语言,那么做实时计算最好的架构就是Kafka+Spark streaming了。
我简单说说搭建步骤并分析一下你的需求,具体的操作,你可以自己慢慢去尝试
1、先建立kafka集群,kafka本身使用scala开发的,但是你主要是通过spark整合去用kafka,因此搭先建好kafka没有scala要求。为什么要先搭建一个kafka集群?因为作为数据消息队列kafka有着非常强的大吞吐性能,特别适合40万/s还是几百万/s的消息事件排队处理的情况。但是有个要注意的地方就是kafka的集群性能完全是靠着对topic的多分区并发读写实现的,因此各分区数据读取汇聚以后一定不是全局顺序的。需要你在执行task任务的过程中去解决。
2、使用spark streaming来实现数据的任务处理,以及你的算法调用。因为spark具有python版本,spark streaming连接kafka也有python包:from pyspark.streaming.kafka import KafkaUtils,所以对python工程师就很方便了。那么你就需要再搭建一个spark集群环境了。具体方法网上很多,也可以看看我的文章:方顺:CentOS7下Spark 3.x集群安装指南zhuanlan.zhihu.com
3、spark streaming的原理其实就是根据一个批处理时间,例如:每500ms、1s等间隔,一般不小于500ms,对读取到的缓冲区数据做一次RDD批处理,因此也叫做微批,我们可以理解它能达到近实时的效果,对于40万/s的数据量,假设kafka集群设计10个分区,spark streaming集群就同时会用10个分区10个并行任务通过Direct方式从kafka分区直接去取数据并执行任务(调用你的python算法),那么你要就测算4万条数据从写到读再到计算——kafka producer->kafka topic partition -> spark rdd partiton->spark executor task是否在1秒内完成。
4、若实时性达不到指标的话,就要考虑增加kafka与spark的分区和任务数,甚至要考虑网络环境,是否将kafka集群和spark集群放在最近的地方。同时也要考虑算法处理是否还能继续优化。增加分区和任务数实际上就是在对集群节点数量和机器硬件资源升级提出要求了。尽量选择更大的内存和CPU核心数配合一定多的集群节点最优,充分利用单机性能,而不要通过增加太多的廉价的机器,反而带来网络传输的消耗和集群出错的几率
我叫方顺,专注于分享大数据方面的架构与技术经验。请多多关注我的内容,一起交流和学习:方顺www.zhihu.com