流式处理,为什么Flink比Spark Streaming好?
1
、反压机制
Flink
在数据传输过程中使用了分布式阻塞队列,一个阻塞队列中,当队列满了以后发送者会被天然阻塞住,这种阻塞功能相当于给这个阻塞队列提供了反压的能力。
Spark Streaming
为了实现反压这个功能,在原来的架构基础上构造了一个
“
速率控制器
”
,这个
“
速率控制器”
会根据几个属性,如任务的结束时间、处理时长、处理消息的条数等计算一个速率。在实现控制数据的接收速率中用到了一个经典的算法,即“PID
算法
”
。
2
、延迟方面
Spark Streaming
是秒级别的
Structured Streaming
是毫秒级别的
Flink
是亚秒级别的
3
、状态存储方面
Spark
的状态管理目前做的比较简单
,
只有两个对应的算子(
UpdateStateByKey
和
mapWithState
)。
Flink
提供文件、内存、
RocksDB
三种状态存储,五种类型的状态,(
ValueState
,
ListState
,
ReducingState
,
AggregatingState
,
FoldingState
,
MapState
)。
4
、灵活的窗口
Spark
只能根据处理时间窗口批量处理。
Flink
可以基于处理时间,数据时间,没有记录等的窗口。
5
、实时方面
Flink
是真正的实时计算,在状态数据和
Checkpoint
容错上做的比较好,能够做到
exactly once
。