[Flink课程]---- 1.2 Flink 和 Spark 的对比

感谢原文作者:http://blog.madhukaraphatak.com/introduction-to-flink-for-spark-developers-flink-vs-spark/

面向Spark开发人员的Apache Flink简介:Flink vs Spark

世界还需要另一个大数据处理系统吗?这是我第一次听说Apache Flink时出现的问题。在大数据领域,我们没有缺乏框架。但我们确实存在可以解决我们所有不同数据处理需求的内聚平台的缺点。Apache spark似乎是城里最好的框架,试图解决这个问题。因此,我对另一个具有类似目标的框架的需求持怀疑态度。

在过去几周里,我出于好奇心开始花一些时间在叮当上。最初,当我查看标准示例时,它们看起来与Spark之一非常相似。所以我开始的印象是它只是另一个模仿火花功能的框架。但是当我花费越来越多的时间时,显而易见的是,这些相同外观的API背后几乎没有新颖的想法,这使得flink与火花脱颖而出。我对这些想法着迷,花了越来越多的时间来理解和探索这些想法。

许多狡猾的想法,如自定义内存管理,数据集API已经找到他们在Spark的家,证明这些想法真的很好。因此,理解flink可以帮助我们理解分布式数据处理的未来。

在这篇文章中,我尝试将我对Apache flink的第一印象放在一起作为一个Spark开发者。这个咆哮/评论严重偏颇,因为我在Spark度过了最近两年,并且只用了2-3周玩Apache flink。所以把我在这里说的所有东西都拿出来。

Apache Flink是另一种新一代通用大数据处理引擎,旨在统一不同的数据负载。听起来像Apache Spark吗?究竟。Flink正试图解决Spark试图解决的同样问题。这两个系统都旨在构建单一平台,您可以在其中运行批处理,流媒体,交互式,图形处理,ML等。因此,flink与Spark的意识形态中介没有太大差别。但是它们在实现细节方面确实存在很大差异。

因此,在下一节中,我将比较火花和叮当的不同方面。一些方法在两个框架中都是相同的,有些方法有很大不同。

1.抽象

在Spark中,对于批处理,我们有RDD抽象和DStream用于流式传输,这是内部RDD本身。因此,我们在Spark下面代表的所有数据都使用RDD抽象来表示。

在flink中,我们为流应用程序提供批量数据集DataStream 数据集。它们听起来与RDD和DStream非常相似,但它们不是。不同之处在于

  • 数据集在运行时表示为计划

在spark中,RDD在运行时表示为java对象。随着Tungsten的推出,它有点变化。但在Apache flink中,Dataset被表示为一个逻辑计划。这听起来很熟悉吗?是的,它们就像Spark中的数据帧一样。所以在flink中,你可以像使用优化器优化的一等公民那样获得像api这样的Dataframe。但是在Spark RDD之间不做任何优化。

flink的数据集就像spark的Dataframe API,在执行之前进行了优化。

在spark 1.6中,数据集API被添加到spark中,这可能最终取代RDD抽象。

  • Dataset和DataStream是独立的API

在Spark中,所有不同的抽象,如DStream,Dataframe都建立在RDD抽象之上。但在flink中,Dataset和DataStream是基于顶级通用引擎构建的两个独立抽象。虽然它们模仿了类似的API,但是在DStream和RDD的情况下,你无法将它们组合在一起。尽管在这方面有一些努力,但最终结果还不够明确。

我们不能将DataSet和DataStream组合在一起,如RDD和DStreams。

因此,虽然flink和spark都有类似的抽象,但它们的实现方式不同。

内存管理

直到Spark 1.5,Spark使用Java堆来缓存数据。虽然项目开始时更容易,但它导致了OOM问题和gc暂停。因此从1.5开始,spark进入定制内存管理,称为项目钨。

Flink从第一天起就开始定制内存管理。实际上,这是Spark向这个方向发展的灵感之一。fl不仅可以将数据存储在自定义二进制布局中,而且可以直接对二进制数据进行操作。在spark中,所有数据帧操作都直接在1.5的钨二进制数据上运行。

在JVM上执行自定义内存管理可以提高性能并提高资源利用率。

支持的语言

Spark在Scala中实现。它提供其他语言的API,如Java,Python和R.

Flink是用Java实现的。它确实提供了Scala API。

因此,与flink相比,Spark中的选择语言更好。在flink的一些scala API中,java抽象也是API的。我认为随着scala API的用户越来越多,这种情况会有所改善。我不太了解Spark API和Flink中的Java API,因为我很久以前就转向了Scala。

API

Spark和Flink都模仿scala集合API。所以从表面来看,两者的API看起来非常相似。以下是使用RDD和Dataset API的scala字数。

// Spark wordcount
object WordCount {

  def main(args: Array[String]) {

    val env = new SparkContext("local","wordCount")

    val data = List("hi","how are you","hi")

    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())

  }

}
 
// Flink wordcount
object WordCount {

  def main(args: Array[String]) {

    val env = ExecutionEnvironment.getExecutionEnvironment

    val data = List("hi","how are you","hi")

    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())
  }

}

虽然我不确定,这是巧合还是故意,具有非常相似的API确实有助于在这些框架之间轻松切换。似乎集合API将成为不久的将来进行数据管道的标准API。甚至Scala的创建者Martin Odersky也承认了这一事实。

Streaming

Apache Spark将流式处理视为快速批处理。Apache flink将批处理视为流处理的特殊情况。这两种方法都具有令人着迷的含义。两种不同方法的一些差异或含义是

  • 实时与近实时

Apache flink提供事件级处理,也称为实时流。它与Storm模型非常相似。

对于Spark,您将获得不提供事件级粒度的迷你批处理。这种方法被称为接近实时。

Spark流式处理是更快的批处理,Flink批处理是有限的流处理。

虽然大多数应用程序都可以近乎实时地使用,但很少有应用程序需要事件级实时处理。这些应用程序通常风暴而不是Spark流。对于他们来说,flink将成为非常有趣的选择。

  • 能够将历史数据与流相结合

运行流处理作为更快批处理的优点之一是,我们可以在两种情况下使用相同的抽象。Spark非常支持组合批处理和流数据,因为它们都使用rdd抽象。

在flink的情况下,批处理和流式传输不共享相同的api抽象。因此,虽然有很多方法可以将基于历史文件的数据与流相结合,但它并不像Spark那样简洁。

在许多应用中,这种能力非常重要。在这些应用程序中,Spark代替Flink流式传输。

  • 灵活的窗口

由于迷你批次的性质,到目前为止Spark中对窗口的支持非常有限。只有您可以根据处理时间窗口批量处理。

与其他任何系统相比,Flink提供了非常灵活的窗口系统。Window是flink流API的主要焦点之一。它允许基于处理时间,数据时间,没有记录等的窗口。这种灵活性使flink流API与spark相比非常强大。

我不确定将这些API带到Spark是多么容易,所以直到那时flink与Spark流相比具有更好的窗口API。

SQL界面

截至目前,最活跃的Spark库之一是spark-sql。Spark提供了像Hive一样的查询语言和像DSL这样的Dataframe来查询结构化数据。它是成熟的API,并且在批处理和很快在流媒体世界中得到广泛使用。

截至目前,Flink Table API仅支持像DSL这样的数据帧,并且它仍处于测试阶段。有计划添加sql接口但不确定何时它将落在框架中。

所以到目前为止,Spark与flink相比有着不错的sql故事。我认为,与Spark相比,flink会赶上游戏的后期。

数据源集成

Spark数据源API是框架中最好的API之一。数据源API使所有智能资源如NoSQL数据库,镶木地板,ORC成为火星上的头等公民。此API还提供了在源级别执行谓词下推等高级操作的功能。

Flink仍然在很大程度上依赖于map / reduce InputFormat来进行数据源集成。虽然它足够好的API来提取数据但它不能巧妙地利用源能力。因此,flink目前落后于数据源集成。

迭代处理

Spark最受关注的功能之一就是能够有效地进行机器学习。在内存缓存和其他实现细节中,它是实现ML算法的真正强大的平台。

虽然ML算法是循环数据流,但它表示为火花内部的直接非循环图。通常,没有分布式处理系统鼓励循环数据流,因为它们变得难以理解。

但是flink对其他人采取了一些不同的方法。它们支持运行时的受控循环依赖图。这使得它们与DAG表示相比以非常有效的方式表示ML算法。因此,Flink支持本机平台中的迭代,与DAG方法相比,可实现卓越的可扩展性和性能。

我希望火花也开始支持这个框架,这将极大地有益于ML社区。

流作为平台与批处理作为平台

Apache Spark来自Map / Reduce时代,它将整个计算表示为数据作为文件集合的移动。这些文件可能作为磁盘上的阵列或物理文件驻留在内存中。这具有非常好的属性,如容错等。

但Flink是一种新型系统,它将整个计算表示为流处理,其中数据有争议地移动而没有任何障碍。这个想法非常类似于像akka-streams这样的新的反应流系统。

虽然我的研究很有限,但是哪一个是大数据系统的未来并不是很明显,尽管这些日子似乎正在崛起。因此,在这个意义上,flink为我们考虑大数据系统注入了新鲜空气。

Maturity

在了解所有差异之后,您可能会问的一个问题是Flink生产就像Spark一样?我认为它还没有完全准备好。像批处理这样的部分已经投入生产,但其他部分如流媒体,表格API仍在不断发展。这并不是说人们没有在生产中使用flink流。那里有一些勇敢的人在做那件事。但作为大众市场工具,它需要随着时间的推移而成熟和稳定。

总结

在这个时候,与Flink相比,Spark是一个非常成熟和完整的框架。但flink确实带来了非常有趣的想法,如自定义内存管理,数据集API等。Spark社区正在认识它并将这些想法引入火花。所以从这个意义上来说,flink正在将大数据处理完全提升到下一个层次。因此,了解flink API和内部结构将帮助您在Spark登陆之前了解这种新的流模式。

相关文章

  • 2018年7月12日 » Spark on Kubernetes:Native Kubernetes Integration for Spark
  • 2018年7月12日 » 探索Spark DataSource V2 - 第8部分:事务性写入
  • 2018年7月12日 » 探索Spark DataSource V2 - 第7部分:Meetup Talk
  • 2016年5月5日 » Flink Streaming简介 - 第10部分:Meetup Talk
  • 2016年4月28日 » Flink流媒体简介 - 第9部分:Flink的活动时间
  • 2016年4月27日 » Flink Streaming简介 - 第8部分:了解Flink流中的时间
  • https://blog.codecentric.de/en/2017/04/event-time-processing-apache-spark-apache-flink/
  •  

你可能感兴趣的:(Spark,Flink)