目录
-
对于流的处理
Flink和Spark的最大区别依然是对于流的处理上, Spark使用小批量来处理流, 而Flink使用流来处理批
Spark Streaming 是微批处理,运行的时候需要指定批处理的时间,每次运行 job 时处理一个批次的数据;
Flink 是基于事件驱动的,事件可以理解为消息。事件驱动的应用程序是一种状态应用程序,它会从一个或者多个流中注入事件,通过触发计算更新状态,或外部动作对注入的事件作出反应。
-
数据模型:
Spark的数据模型是弹性分布式数据集RDD
RDD, SQL, DataSet, DataFrame, DStream
Flink的基本数据模型是数据流, 以及事件的序列
SQL, Table, DataStream, DataSet, Stateful Stream Processing
-
架构模型:
Spark Streaming的task运行依赖driver和executor和worker,当然driver和excutor还依赖于集群管理器Standalone或者yarn等。
而Flink运行时主要是JobManager、TaskManage和TaskSlot。
-
任务调度:
Spark Streaming的调度分为构建 DGA 图,划分 stage,生成 taskset,调度 task等步骤
而Flink首先会生成 StreamGraph/Sream DataFlow,接着生成 JobGraph,然后将 jobGraph 提交给 Jobmanager 由它完成 jobGraph 到 ExecutionGraph 的转变,最后由 jobManager 调度执行。
-
时间机制:
flink 支持三种时间机制事件时间,注入时间,处理时间,同时支持 watermark 机制处理滞后数据。
Spark Streaming 只支持处理时间,Structured streaming则支持了事件时间和watermark机制。
-
容错机制:
二者保证exactly-once的方式不同。
spark streaming 通过保存offset和事务的方式;
Flink 则使用两阶段提交协议来解决这个问题。
-
其他
Flink在计算引擎中引入了托管状态的概念, 对于事件可以进行有状态的处理
Flink 可以支持本地的快速迭代,以及一些环形的迭代任务。
Flink 可以定制化内存管理。
Flink 并没有将内存完全交给应用层。这也是为什么 Spark 相对于 Flink,更容易出现 OOM 的原因(out of memory)。
性能测试
我们可以通过下面的性能测试初步了解两个框架的性能区别,它们都可以基于内存计算框架进行实时计算,所以都拥有非常好的计算性能。
经过测试,Flink计算性能上略好。
测试环境:
1.CPU:7000个;
2.内存:单机128GB;
3.版本:Hadoop 2.3.0,Spark 1.4,Flink 0.9
4.数据:800MB,8GB,8TB;
5.算法:K-means:以空间中K个点为中心进行聚类,对最靠近它们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
6.迭代:K=10,3组数据
Storm 单线程吞吐约为 8.7 万条/秒,Flink 单线程吞吐可达 35 万条/秒。Flink 吞吐约为 Storm 的 3-5 倍。
阿里Flink集群双十一峰值每秒能处理17亿数据量,一天可处理上万亿条数据(某广告平台一天8亿条数据--->400-500G左右数据)
在单机上, Flink消息处理的延迟大概在200毫秒左右, Flink 在满吞吐时的延迟约为 Storm 的一半,且随着 QPS 逐渐增大,Flink 在延迟上的优势开始体现出来。
综上可得,Flink 框架很多地方优于其他相关技术
Spark和Flink全部都运行在Hadoop YARN上,
性能为Flink > Spark > Hadoop(MR),迭代次数越多越明显,
性能上,Flink优于Spark和Hadoop最主要的原因是Flink支持增量迭代,具有对迭代自动优化的功能
总结
-
角色类比
SparkStreaming | Flink |
DStream | DataStream |
Trasnformation | Trasnformation |
Action | Sink |
Task | subTask |
TaskSet | Task |
Stage/Pipeline | Oprator chains |
DAG | Streaming DataFlow Graph |
Master + Driver | JobManager |
Worker + Executor | TaskManager |
-
图表
Spark | Flink | |
定义 | 弹性的分布式数据集,并非真正的实时计算 | 真正的流计算,就像storm一样; 但flink同时支持有限的数据流计算(批处理) |
高容错 | 沉重 | 非常轻量级 |
内存管理 | 使用的JVM的内存管理 | Flink在JVM中实现的是自己的内存管理 |
程序调优 | SQL有自动优化机制 | 自动地优化一些场景,比如避免一些昂贵的操作 (如shuffle和sorts),还有一些中间缓存 |
-
Flink的优势
和Hadoop相比, Flink使用内存进行计算, 速度明显更优
和同样使用内存的Spark相比, Flink对于流的计算是实时的, 延迟更低
和同样使用实时流的Storm相比, Flink明显具有更优秀的API, 以及更多的支持, 并且支持批量计算
支持高吞吐、低延迟、高性能的流处理
支持带有事件时间的窗口(Window)操作
支持有状态计算的Exactly-once语义
支持高度灵活的窗口(Window)操作,支持基于time、count、session,以及data-driven的窗口操作
支持具有Backpressure功能的持续流模型
支持基于轻量级分布式快照(Snapshot)实现的容错
一个运行时同时支持Batch on Streaming处理和Streaming处理
Flink在JVM内部实现了自己的内存管理
支持迭代计算
支持程序自动优化:避免特定情况下Shuffle、排序等昂贵操作,中间结果有必要进行缓存