- Abstract
Spark不管是流数据(DStream) 还是批数据,底层都是相同的数据表示RDD.Flink中,DataSet表示批数据,DataStream表示流数据。
- Dataset代表runtime的执行计划。在Spark中,RDD代表运行时的java 对象。但是Apache flink Dataset表示一个逻辑的执行计划。这与Spark中的dataframes很相似。因此你可以优化DataSet。而RDD不能进行优化。
Flink中的Dataset 更像Spark中的Dataframe API ,并且DataSet是在执行之前经过优化之后的。在Spark1.6中,引入dataset API 。它有可能最后取代RDD的抽象。
在Spark中所有的抽象例如DStream, Dataframe 都是建立在RDD抽象上。但是在flink中,我们不能像合并DStream, Dataframe这样合并DataStream和DataSet这样的抽象。
We cannot combine DataSet and DataStreams like RDD and DStreams.
所以flink和spark虽然有相似的抽象,但是他们的实现是不同的。
内存管理
Spark1.5之前,用java 堆来管理缓存数据(存在OOM问题,和gc暂停的问题)。从1.5开始,spark开始了自己实现的内存管理project tungsten。Flink从一开始就是自己管理内存,Flink不仅有存储二进制的框架,而且还可以直接处理二进制。spark在1.5之后也可以直接处理tungsten binary data 。
自定义的内存管理能够更有效的利用资源和和更好的性能。语言
spark支持java,python,scala.而flink现在也都支持了。他们的api风格很相近Streaming
spark把流当做特殊批处理。flink把批处理看做是特殊的流处理。这两种方式有以下区别
- Realtime vs Near Realtime
Apache flink 提供时间级别的处理,被称作是一种Realtime 的流。
Spark里面你进行一个微 批操作是不会提供一个事件级的粒度。他只是一种近乎real-time。
对于少数实时性要求很高的应用,storm和flink是更好的选择。
把历史数据与流结合的能力
flink相对与spark来说,处理流的能力比处理批的速度更快一点。Spark对批和流的结合做的很好的原因在于它底层统一的RDD抽象。
在flink里面,批处理和流处理没有统一的抽象,虽然也有办法把stream和batch结合起来,但是还是不如spark来的方便。Flexible windowing
由于window级别的微处理在spark。所以你只能根据处理时间来把窗口当做批处理。而Flink提供了非常灵活的窗口相比于其他系统。窗口主要用于流处理上。它允许窗口能够根据处理时间,时间时间等。这样的灵活性使得flink相比于spark来用于流处理会更强大。Iterative processing
Spark 人们讨论最大的还是它对于机器学习的支持。216/5000
虽然ML算法是一个循环数据流,但它表示为spark内部的直接非循环图。 通常没有分布式处理系统鼓励循环数据流,因为它们变得棘手。
但flink采取了与他人稍有不同的方法。 它们在运行时支持受控循环依赖关系图。 与DAG表示相比,这使得它们以非常有效的方式表示ML算法。 因此,Flink支持本地平台的迭代,与DAG方法相比,可实现卓越的可扩展性和性能。