Flink和Spark对比
Flink和Spark对比
Flink是标准的实时处理引擎,基于事件驱动。而Spark Streaming是微批(Micro-Batch)的模型。Flink的时间延迟是毫秒级别,而Spark则是秒级别的。虽然在Spark2.3版中引入了一个持续流处理模型,将流处理延迟降至毫秒级。但是现在只支持很有限的功能,并不能在大的项目中使用。
Flink天生就是为流计算而诞生的技术解决方案,而Spark还需要做出很大的努力才能适应流处理模型。Spark想要在流处理的实时性上提升,就不能继续用微批处理的模式,而要想办法实现真正的流处理,即每当有一条数据输入就立刻处理,不做任何等待。
Spark特点介绍
无论是 Spark Streaming还是 Structured Streaming,Spark流处理的实时性还不够,所以无法用在一些对实时性要求很高的流处理场景中。这是因为 Spark的流处理是基于所谓微批处理( Micro- batch processing)的思想,即它把流处理看作是批处理的一种特殊形式,每次接收到一个时间间隔的数据才会去处理,所以天生很难在实时性上有所提升。
Flink特点介绍
Flink采用了基于操作符(Operator)的连续流模型,可以做到微秒级别的延迟。Flink最核心的数据结构是Stream,它代表一个运行在多分区上的并行流。在 Stream 上同样可以进行各种转换操作(Transformation)。与Spark的RDD不同的是,Stream 代表一个数据流而不是静态数据的集合。所以,它包含的数据是随着时间增长而变化的。而 Stream 上的转换操作都是逐条进行的,即每当有新的数据进来,整个流程都会被执行并更新结果。这样的基本处理模式决定了Flink会比Spark Streaming有更低的流处理延迟性。当一个Flink程序被执行的时候,它会被映射为Streaming Dataflow,下图就是一个Streaming Dataflow 的示意图。
在图中,你可以看出Streaming Dataflow包括Stream和Operator(操作符)。转换操作符把一个或多个Stream转换成多个Stream。每个Dataflow都有一个输入数据源(Source)和输出数据源(Sink)。与Spark的RDD转换图类似,Streaming Dataflow也会被组合成一个有向无环图去执行。
Flink 和 Spark 对比
Spark和Flink都支持批处理和流处理,所以这两个数据处理框架有很多相同点:
- 都基于内存计算;
- 都有统一的批处理和流处理APl,都支持类似SQL的编程接口;
- 都支持很多相同的转换操作,编程都是用类似于Scala Collection APl的函数式编程模式;
- 都有完善的错误恢复机制;
- 都支持Exactly once的语义一致性。
当然,它们的不同点也是相当明显,我们可以从4个不同的角度来看。
(1)从流处理的角度来讲,Spark基于微批量处理,把流数据看成是一个个小的批处理数据块分别处理,所以延迟性只能做到秒级。而Flink基于每个事件处理,每当有新的数据输入都会立刻处理,是真正的流式计算,支持毫秒级计算。由于相同的原因,Spark只支持基于时间的窗口操作(处理时间或者事件时间),而Flink支持的窗口操作则非常灵活,不仅支持时间窗口,还支持基于数据本身的窗口,开发者可以自由定义想要的窗口操作。
(2)从SQL 功能的角度来讲,Spark和Flink分别提供Spark SQL和Flink SQL。两者相比较,Spark对SQL支持更好,相应的优化、扩展和性能更好,而Flink在SQL支持方面还有很大提升空间。对于 Flink SQL,就是直接可以在代码中写 SQL,来实现一些查询(Query)操作。Flink 的 SQL 支持,基于实现了 SQL 标准的 Apache Calcite(Apache 开源 SQL 解析工具)。
(3)从迭代计算的角度来讲,Spark对机器学习的支持很好,因为可以在内存中缓存中间计算结果来加速机器学习算法的运行。但是大部分机器学习算法其实是一个有环的数据流,在Spark中,却是用无环图来表示。而Flink支持在运行时间中的有环数据流,从而可以更有效的对机器学习算法进行运算。
(4)从相应的生态系统角度来讲,Spark 的社区无疑更加活跃。Spark可以说有着Apache旗下最多的开源贡献者,而且有很多不同的库来用在不同场景。而Flink由于较新,现阶段的开源社区不如Spark活跃,各种库的功能也不如Spark全面。但是Flink还在不断发展,各种功能也在逐渐完善。
如何选择Spark和Flink
对于以下场景,你可以选择 Spark。
(1)数据量非常大而且逻辑复杂的批数据处理,并且对计算效率有较高要求(比如用大数据分析来构建推荐系统进行个性化推荐、广告定点投放等);
(2)基于历史数据的交互式查询,要求响应较快;
(3)基于实时数据流的数据处理,延迟性要求在在数百毫秒到数秒之间。
Spark完美满足这些场景的需求,而且它可以一站式解决这些问题,无需用别的数据处理平台。由于Flink是为了提升流处理而创建的平台,所以它适用于各种需要非常低延迟(微秒到毫秒级)的实时数据处理场景,比如实时日志报表分析。而且Flink 用流处理去模拟批处理的思想,比Spark 用批处理去模拟流处理的思想扩展性更好。
参考
https://blog.csdn.net/weixin_40247263/article/details/97000109