什么是实时流式计算
实时流式计算,也就是RealTime,Streaming,Analyse,在不同的领域有不同的定义,那么,到底什么是实时流式计算呢?谷歌大神Tyler Akidau在《the-world-beyond-batch-streaming-101》一文中提到过实时流式计算的三个特征:
- 无限数据
- 无界数据处理
- 低延迟
无限数据指的是,一种不断增长的,基本上无限的数据集。这些通常被称为“流数据”,而与之相对的是有限的数据集。
无界数据处理,一种持续的数据处理模式,能够通过处理引擎重复的去处理上面的无限数据,是能够突破有限数据处理引擎的瓶颈的。
低延迟,延迟是多少并没有明确的定义。但我们都知道数据的价值将随着时间的流逝降低,时效性将是需要持续解决的问题。
应用场景
1.日志分析
比如对网站的用户访问日志进行实时的分析,计算访问量,用户画像,留存率等等,实时的进行数据分析,帮助企业进行决策。
2.物联网
比如对智能安防应用来说,对智能门锁、IPCamera、红外感应等设备进行实时的数据采集,加入AI侦测,异常时进行报警。并可根据历史数据进行实时的分析,预测,发现行为异常。
3.CDN
比如监测CDN机器的资源使用情况,当某些地区的机器资源不足时,能触发平台自动扩容,满足业务需求。
业界有那么多的实时计算框架,该如何选型?
产品 | API | 保证次数 | 容错机制 | 状态管理 | 延时 | 吞吐量 |
---|---|---|---|---|---|---|
Storm | 组合式 | At-least-once | Record ACK | 无 | 低 | 低 |
Spark Streaming | 声明式 | Exactly-once | RDD CheckPoint | 基于DStream | 中等 | 高 |
Flink | 声明式 | Exactly-once | CheckPoint | 基于操作 | 低 | 高 |
API
Storm 使用基础 API 进行开发,比如实现一个简单的 sum 求和操作;而 Spark Streaming 和 Flink 中都提供封装后的高阶函数,可以直接拿来使用。
保证次数
在数据处理方面,Storm 可以实现至少处理一次,但不能保证仅处理一次,这样就会导致数据重复处理问题,所以针对计数类的需求,可能会产生一些误差;Spark Streaming 和 Flink 通过事务可以保证对数据实现仅一次的处理。
容错机制
Storm 通过 ACK 机制实现数据的容错机制,而 Spark Streaming 和 Flink 可以通过 CheckPoint 机制实现容错机制。
状态管理
Storm中没有实现状态管理,Spark Streaming 实现了基于 DStream 的状态管理,而 Trident 和 Flink 实现了基于操作的状态管理。
延时
表示数据处理的延时情况,因此 Storm 和 Flink 接收到一条数据就处理一条数据,其数据处理的延时性是很低的;而 Trident 和 Spark Streaming 都是小型批处理,它们数据处理的延时性相对会偏高。
吞吐量
Storm 的吞吐量其实也不低,只是相对于其他几个框架而言较低;Spark Streaming 和 Flink 的吞吐量是比较高的。
为了满足我们的业务场景要求,我们最终选择基于Storm做二次开发,规划了一个Thor平台,实现了告警的实时计算,对于一些敏感型告警,在30秒内即可快速决策
原先我司的告警系统,是在将采集的数据持久化到数据库后,再通过类SQL进行聚合计算生成告警的,对于一些敏感型告警,实时性是满足不了客户要求的。同时对于一些复杂的告警逻辑,类SQL也难以实现。
监控数据是属于无状态的,且要保证低延迟,所以我们最终选用Storm,但Storm更多的只是一个实时的并行计算框架,很多问题需要额外地处理,如数据如何接入Storm的计算流?对不同的数据类型如何处理?计算数据怎么存?系统怎么监控等等。为了解决这一系列的问题,在Storm的基础上规划了Thor这样一个实时的计算平台。
Thor系统的受众
有明显的实时特性,数据计算量超过单台处理能力,追求高稳定性、简易开发的计算需求。
Node Cluster
消息生产集群,接入不同的数据源类型,生产待计算的原始消息。如接收sdn推送的监控采集数据,以每一行为一条计算数据提交。
Message Cluster
使用kafka消息中间件,暂存计算消息。实现数据的流式输入。
Jstorm Cluster
核心计算集群,基于storm的java版本,改进HA问题和计算性能优化。
Monitor Cluster
集群状态监控,负责进行集群内部的组件状态、topology计算状态的监控报警
Thor UI
UI作为实时计算平台的运营界面,主要任务是各个组件的运行状态收集、消息任务配置、监控报警展示、系统配置等。
状态码告警示例:
下一步计划,提升平台的运营能力,分布式特性导致问题排查复杂度较高
- 完善全流程的监控方案,TPS链路监控设计来发现组件、topo的异常
- thor集群双主方案实施
- thor-node 数据分配数据不均匀,某个节点负载较高
- topology 资源调度不均衡,比如某些topo只跑1个机器
- worker 使用cpu 资源不合理 某些worker 使用了多个core