目前公司的业务代码大部分使用的还是Structured Streaming,但近期Flink的发展和社区活跃度明显高了很多,因此,借助这个机会对比一下Structured Streaming和Flink,分析两者的优劣势。
Structured Streaming和Flink都是现代流数据处理框架,它们在分布式计算、实时数据处理、容错性以及操作API等方面都有着相似之处。然而,它们也有一些显著的不同点。
一、Structured Streaming
Structured Streaming是Apache Spark的一个组件,它允许开发人员使用Spark SQL进行流数据处理。Structured Streaming基于批处理引擎Spark SQL,用来执行类似批处理的操作。它通过连续查询一个静态表达式,将流数据转换为数据集。Structured Streaming具有良好的可扩展性和容错性,并且支持广泛的数据源和输出格式。
1.1、编程模型
Structured Streaming 将数据流看作是一张无界表,每个流的数据源从逻辑上来说看做一个不断增长的动态表,从数据源不断流入的每个数据项可以看作为新的一行数据追加到动态表中。用户可以通过静态结构化数据的批处理查询方式(SQL 查询),对数据进行实时查询。
1.2、窗口操作
Structured Streaming 提供了滑动窗口接口,滑动窗口的两个重要的参数是窗口大小,滑动步长。它允许在数据的滑动窗口上应用转换。如下图所示,每当窗口在源 Dstream 上滑动时,位于窗口内的源 RDDs 就会被合并操作,来生成窗口化的 Dstream 的 RDDs。
1.3、写入模式
为了满足不同操作的结果需求,还提供了三种写入模式:
Complete:当 trigger 触发时,输出整个更新后的结果表到外部存储,存储连接器决定如何处理整个表的写入
Append:只有最后一次触发的追加到结果表中的数据行会被写入到外部存储,这只适用于已存在的数据项没有被更新的情况
Update:之后结果表中被更新的数据行会被写出到外部存储
二、Flink
由于 Spark Streaming 是基于批处理引擎的,因此它的处理延时较大,基本上为秒级延迟。因此,具有毫秒级的流处理引擎 Flink 诞生了。
Flink 从 2014 年 12 月成为 Apache 的顶级项目,近两年才逐渐走入大众视野。Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。Flink 的特点是低延迟、高吞吐和一致性(结果的准确和良好的容错性)。
2.1、编程模型
在 Flink 中,流也被分成两类:无界流和有界限,分别对应着 Flink 中的流处理场景和批处理场景。
无界流:有开始无结束的数据流;
有界流:有开始也有结束的数据流,批处理被抽象成有界流;
2.2、窗口操作
Flink 中提供了三种窗口计算类型:滚动窗口、滑动窗口和会话窗口。
滚动窗口是将每个元素分配给具有指定窗口大小的窗口。滚动窗口有固定大小,而且不会互相重叠。一个窗口的结束意味着另一个窗口的开始。
滑动窗口将元素分配到固定长度的窗口,类似于滚动窗口的分配。窗口大小由窗口大小参数配置。滑动步长控制滑动窗口启动的频率,如果滑动步长小于窗口大小,则滑动窗口会有重叠。
会话窗口:会话窗口根据会话间隔进行窗口的划分,与滑动和滚动窗口相比,会话窗口没有重叠,也没有固定的开始和结束时间。
2.3、时间语义
Flink 提供了三种时间语义,分别是事件时间、注入时间和处理时间。
事件时间即为事件发生的时间;
注入时间是指数据从数据源进入数据处理引擎的时间;处理时间是真正进行数据处理的任务运行的机器时间
三、API和库
在API和库方面,Structured Streaming具有更丰富的功能。它基于Spark SQL构建,并提供了SQL查询和DataFrame API,这使得开发人员可以使用熟悉的SQL语言来执行流数据处理操作。此外,Structured Streaming还支持许多数据源和输出格式,包括Kafka、HDFS、S3等。
相比之下,Flink的API和库更加灵活,提供了广泛的操作符和函数,可以让开发人员自由地编写他们需要的代码。它也支持许多数据源和输出格式,但是与Structured Streaming不同的是,Flink要求用户手动实现自定义的source和sink以及操作符。
四、状态管理
Structured Streaming的状态管理相对简单,主要依赖于Spark的内存管理;当我们在处理大状态时,可能会面临性能瓶颈。
Apache Flink提供强大的状态管理功能,支持大状态和一致性快照。通过增量快照机制实现高效的状态恢复。
五、生态系统和社区支持
在生态系统和社区支持方面,Structured Streaming在Spark生态系统中占据着重要的位置,并获得了广泛的社区支持。Spark生态系统提供了许多其他组件,例如Spark MLlib、Spark GraphX等,这些组件可以与Structured Streaming集成,并扩展其功能。
相比之下,Flink的生态系统相对较小,但是它也有一定的社区支持。Flink适用于特定的场景,例如低延迟数据处理、机器学习和图形计算等。