欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Flink 与 Spark对比

程序员文章站 2022-06-17 12:02:55
...

背景 

    Flink 是一款新的大数据处理引擎,目标是统一不同来源的数据处理。这个目标看起来和 Spark 和类似。这两套系统都在尝试建立一个统一的平台可以运行批量,流式,交互式,图处理,机器学习等应用。所以,Flink 和 Spark 的目标差异并不大,他们最主要的区别在于实现的细节。

区别

    架构区别

Flink 与 Spark对比

Flink 与 Spark对比

Abstraction

  接触过 Spark 的同学,应该比较熟悉,在处理批处理任务,可以使用 RDD,而对于流处理,可以使用 Streaming,然其世纪还是 RDD,所以本质上还是 RDD 抽象而来。但是,在 Flink 中,批处理用 DataSet,对于流处理,有 DataStreams。思想类似,但却有所不同:其一,DataSet 在运行时表现为 Runtime Plans,而在 Spark 中,RDD 在运行时表现为 Java Objects。在 Flink 中有 Logical Plan ,这和 Spark 中的 DataFrames 类似。因而,在 Flink 中,若是使用这类 API ,会被优先来优化(即:自动优化迭代)。如下图所示:

Flink 与 Spark对比

  然而,在 Spark 中,RDD 就没有这块的相关优化,如下图所示::

Flink 与 Spark对比

  另外,DataSet 和 DataStream 是相对独立的 API,在 Spark 中,所有不同的 API,比如 Streaming,DataFrame 都是基于 RDD 抽象的。然而在 Flink 中,DataSet 和 DataStream 是同一个公用引擎之上的两个独立的抽象。所以,不能把这两者的行为合并在一起操作,目前官方正在处理这种问题,详见[FLINK-2320

Memory

  在之前的版本(1.5以前),Spark 延用 Java 的内存管理来做数据缓存,这样很容易导致 OOM 或者 GC。之后,Spark 开始转向另外更加友好和精准的控制内存,即:Tungsten 项目。然而,对于 Flink 来说,从一开始就坚持使用自己控制内存。Flink 除把数据存在自己管理的内存之外,还直接操作二进制数据。在 Spark 1.5之后的版本开始,所有的 DataFrame 操作都是直接作用于 Tungsten 的二进制数据上。

  PS:Tungsten 项目将是 Spark 自诞生以来内核级别的最大改动,以大幅度提升 Spark 应用程序的内存和 CPU 利用率为目标,旨在最大程度上利用硬件性能。该项目包括了三个方面的改进:

  1. 内存管理和二进制处理:更加明确的管理内存,消除 JVM 对象模型和垃圾回收开销。
  2. 缓存友好计算:使用算法和数据结构来实现内存分级结构。
  3. 代码生成:使用代码生成来利用新型编译器和 CPU。

Program

  Spark 使用 Scala 来实现的,它提供了 Java,Python 以及 R 语言的编程接口。而对于 Flink 来说,它是使用 Java 实现的,提供 Scala 编程 API。从编程语言的角度来看,Spark 略显丰富一些。

API

  Spark 和 Flink 两者都倾向于使用 Scala 来实现对应的业务。对比两者的 WordCount 示例,很类似。如下所示,分别为 RDD 和 DataSet API 的示例代码:

  • RDD
  • // Spark WordCount
    
    object WordCount {
    
      def main(args: Array[String]) {
    
        val env = new SparkContext("local","WordCount")
    
        val data = List("hi","spark cluster","hi","spark")
    
        val dataSet = env.parallelize(data)
    
        val words = dataSet.flatMap(value => value.split("\\s+"))
    
        val mappedWords = words.map(value => (value,1))
    
        val sum = mappedWords.reduceByKey(_+_)
    
        println(sum.collect())
    
      }
    
    }

     

  • DataSet
  • // Flink WordCount
    
    object WordCount {
    
        def main(args: Array[String]) {
    
            val env = ExecutionEnvironment.getExecutionEnvironment
    
            val data = List("hello","flink cluster","hello")
    
            val dataSet = env.fromCollection(data)
    
            val words = dataSet.flatMap(value => value.split("\\s+"))
    
            val mappedWords = words.map(value => (value,1))
    
            val grouped = mappedWords.groupBy(0)
    
            val sum = grouped.sum(1)
    
            println(sum.collect())
    
        }
    
    }

     

  对于 Streaming,Spark 把它看成更快的批处理,而 Flink 把批处理看成 Streaming 的特殊例子,差异如下:其一,在实时计算问题上,Flink 提供了基于每个事件的流式处理机制,所以它可以被认为是一个真正意义上的流式计算,类似于 Storm 的计算模型。而对于 Spark 来说,不是基于事件粒度的,而是用小批量来模拟流式,也就是多个事件的集合。所以,Spark 被认为是一个接近实时的处理系统。虽然,大部分应用实时是可以接受的,但对于很多应用需要基于事件级别的流式计算。因而,会选择 Storm 而不是 Spark Streaming,现在,Flink 也许是一个不错的选择。

SQL

  目前,Spark SQL 是其组件中较为活跃的一部分,它提供了类似于 Hive SQL 来查询结构化数据,API 依然很成熟。对于 Flink 来说,截至到目前 1.0 版本,只支持 Flink Table API,官方在 Flink 1.1 版本中会添加 SQL 的接口支持。[Flink 1.1 SQL 详情计划

参考

https://www.cnblogs.com/smartloli/p/5580757.html

https://flink.apache.org/

转载于:https://my.oschina.net/cloudcoder/blog/3009122