概要
参考:https://blog.csdn.net/dingxiangtech/article/details/83022673
参考:https://blog.csdn.net/xiao_jun_0820/article/details/79825077
功能指标 | Storm | Spark | Flink |
---|---|---|---|
处理模式 | native | micro-batching | native |
消息保障 | 至少一次 | 有且一次 | 有且一次 |
实时性 | 低延迟,亚秒级 | 高延迟,秒级 | 低延迟,亚秒级 |
吞吐量 | 低 | 高 | 高(Storm3-5倍) |
流量控制 | 不支持 | 支持 | 支持 |
容错方式 | record ack | rdd based check point | check point |
native Vs micro-batching
参考:https://www.cnblogs.com/tgzhu/p/7119477.html
-
原生流处理:指所有输入的记录一旦到达即会一个接着一个进行处理。示例如下:
微批处理:把输入的数据按照某种预先定义的时间间隔(典型的是几秒钟)分成短小的批量数据,流经流处理系统。示例如下:
两种方法都有其先天的优势和不足
原生流处理的优势在于它的表达方式。数据一旦到达立即处理,这些系统的延迟性远比其它微批处理要好。除了延迟性外,原生流处理的状态操作也容易实现。一般原生流处理系统为了达到低延迟和容错性会花费比较大的成本,因为它需要考虑每条记录。原生流处理的负载均衡也是个问题。比如,我们处理的数据按key分区,如果分区的某个key是资源密集型,那这个分区很容易成为作业的瓶颈。
微批处理。将流式计算分解成一系列短小的批处理作业,也不可避免的减弱系统的表达力。像状态管理或者join等操作的实现会变的困难,因为微批处理系统必须操作整个批量数据。并且,batch interval会连接两个不易连接的事情:基础属性和业务逻辑。相反地,微批处理系统的容错性和负载均衡实现起来非常简单,因为微批处理系统仅发送每批数据到一个worker节点上,如果一些数据出错那就使用其它副本。微批处理系统很容易建立在原生流处理系统之上。
主要原理
1 Apache Storm
在Storm中,需要先设计一个实时计算结构,我们称之为拓扑(topology)。之后,这个拓扑结构会被提交给集群,其中主节点(master node)负责给工作节点(worker node)分配代码,工作节点负责执行代码。在一个拓扑结构中,包含spout和bolt两种角色。数据在spouts之间传递,这些spouts将数据流以tuple元组的形式发送;而bolt则负责转换数据流。
2 Apache Spark
Spark Streaming,即核心Spark API的扩展,不像Storm那样一次处理一个数据流。相反,它在处理数据流之前,会按照时间间隔对数据流进行分段切分。Spark针对连续数据流的抽象,我们称为DStream(Discretized Stream)。 DStream是小批处理的RDD(弹性分布式数据集), RDD则是分布式数据集,可以通过任意函数和滑动数据窗口(窗口计算)进行转换,实现并行操作。
3 Apache Flink
针对流数据+批数据的计算框架。把批数据看作流数据的一种特例,延迟性较低(毫秒级),且能够保证消息传输不丢失不重复。
小结
Flink综合评分高,适合以下场景:
- 消息投递语义为 Exactly Once
- 高吞吐低延迟
- 需要进行状态管理或窗口统计
ps:flink国内用户:阿里巴巴/美团/华为/滴滴/快手等,社区更新具有一定保障。