`
weitao1026
  • 浏览: 1053554 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Apache Flink现在在大数据处理方面

 
阅读更多
我们是否还需要另外一个新的数据处理引擎?当我第一次听到flink的时候这是我是非常怀疑的。在大数据领域,现在已经不缺少数据处理框架了,但是没有一个框架能够完全满足不同的处理需求。自从Apache spark出现后,貌似已经成为当今把大部分的问题解决得最好的框架了,所以我对另外一款解决类似问题的框架持有很强烈的怀疑态度。
不过因为好奇,我花费了数个星期在尝试了解flink。一开始仔细看了flink的几个例子,感觉和spark非常类似,心理就倾向于认为flink又是一个模仿spark的框架。但是随着了解的深入,这些API体现了一些flink的新奇的思路,这些思路还是和spark有着比较明显的区别的。我对这些思路有些着迷了,所以花费了更多的时间在这上面。
        flink中的很多思路,例如内存管理,dataset API都已经出现在spark中并且已经证明    这些思路是非常靠谱的。所以,深入了解flink也许可以帮助我们分布式数据处理的未来之路是怎样的
  在后面的文章里,我会把自己作为一个spark开发者对flink的第一感受写出来。因为我已经在spark上干了2年多了,但是只在flink上接触了2到3周,所以必然存在一些bias,所以大家也带着怀疑和批判的角度来看这篇文章吧。
Apache Flink是什么
flink是一款新的大数据处理引擎,目标是统一不同来源的数据处理。这个目标看起来和spark和类似。没错,flink也在尝试解决spark在解决的问题。这两套系统都在尝试建立一个统一的平台可以运行批量,流式,交互式,图处理,机器学习等应用。所以,flink和spark的目标差别并不大,他们最主要的区别在于实现的细节。
后面我会重点从不同的角度对比这两者。
Apache Spark vs Apache Flink
1.抽象  Abstraction
spark中,对于批处理我们有RDD,对于流式,我们有DStream,不过内部实际还是RDD.所以所有的数据表示本质上还是RDD抽象。
后面我会重点从不同的角度对比这两者。在flink中,对于批处理有DataSet,对于流式我们有DataStreams。看起来和spark类似,他们的不同点在于:
一)DataSet在运行时是表现为运行计划(runtime plans)的
在spark中,RDD在运行时是表现为java objects的。通过引入Tungsten,这块有了些许的改变。但是在flink中是被表现为logical plan(逻辑计划)的,听起来很熟悉?没错,就是类似于spark中的dataframes。所以在flink中你使用的类Dataframe api是被作为第一优先级来优化的。但是相对来说在spark RDD中就没有了这块的优化了。
   flink中的Dataset,对标spark中的Dataframe,在运行前会经过优化。
在spark 1.6,dataset API已经被引入spark了,也许最终会取代RDD 抽象。
二)Dataset和DataStream是独立的API
在spark中,所有不同的API,例如DStream,Dataframe都是基于RDD抽象的。但是在flink中,Dataset和DataStream是同一个公用的引擎之上两个独立的抽象。所以你不能把这两者的行为合并在一起操作,当然,flink社区目前在朝这个方向努力(https://issues.apache.org/jira/browse/FLINK-2320),但是目前还不能轻易断言最后的结果。
2.内存管理
   一直到1.5版本,spark都是试用java的内存管理来做数据缓存,明显很容易导致OOM或者gc。所以从1.5开始,spark开始转向精确的控制内存的使用,这就是tungsten项目了
   flink从第一天开始就坚持自己控制内存试用。这个也是启发了spark走这条路的原因之一。flink除了把数据存在自己管理的内存以外,还直接操作二进制数据。在spark中,从1.5开始,所有的dataframe操作都是直接作用在tungsten的二进制数据上。

3.语言实现
spark是用scala来实现的,它提供了Java,Python和R的编程接口。
flink是java实现的,当然同样提供了Scala API
所以从语言的角度来看,spark要更丰富一些。因为我已经转移到scala很久了,所以不太清楚这两者的java api实现情况。
4.API
spark和flink都在模仿scala的collection API.所以从表面看起来,两者都很类似。下面是分别用RDD和DataSet API实现的word count

// 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都长得很像,这样很方便开发者从一个引擎切换到另外一个引擎。我感觉以后这种Collection API会成为写data pipeline的标配。
Steaming
spark把streaming看成是更快的批处理,而flink把批处理看成streaming的special case。这里面的思路决定了各自的方向,其中两者的差异点有如下这些:

实时 vs 近实时的角度
flink提供了基于每个事件的流式处理机制,所以可以被认为是一个真正的流式计算。它非常像storm的model。
而spark,不是基于事件的粒度,而是用小批量来模拟流式,也就是多个事件的集合。所以spark被认为是近实时的处理系统。

  Spark streaming 是更快的批处理,而Flink Batch是有限数据的流式计算。
虽然大部分应用对准实时是可以接受的,但是也还是有很多应用需要event level的流式计算。这些应用更愿意选择storm而非spark streaming,现在,flink也许是一个更好的选择。

    流式计算和批处理计算的表示
       spark对于批处理和流式计算,都是用的相同的抽象:RDD,这样很方便这两种计算合并起来表示。而flink这两者分为了DataSet和DataStream,相比spark,这个设计算是一个糟糕的设计。

对 windowing 的支持
         因为spark的小批量机制,spark对于windowing的支持非常有限。只能基于process time,且只能对batches来做window。
           而Flink对window的支持非常到位,且Flink对windowing API的支持是相当给力的,允许基于process time,data time,record 来做windowing。
          我不太确定spark是否能引入这些API,不过到目前为止,Flink的windowing支持是要比spark好的。
          Steaming这部分flink胜

SQL interface
目前spark-sql是spark里面最活跃的组件之一,Spark提供了类似Hive的sql和Dataframe这种DSL来查询结构化数据,API很成熟,在流式计算中使用很广,预计在流式计算中也会发展得很快。
至于flink,到目前为止,Flink Table API只支持类似DataFrame这种DSL,并且还是处于beta状态,社区有计划增加SQL 的interface,但是目前还不确定什么时候才能在框架中用上。
所以这个部分,spark胜出。

Data source Integration

Spark的数据源 API是整个框架中最好的,支持的数据源包括NoSql db,parquet,ORC等,并且支持一些高级的操作,例如predicate push down
Flink目前还依赖map/reduce InputFormat来做数据源聚合。
这一场spark胜

Iterative processing
spark对机器学习的支持较好,因为可以在spark中利用内存cache来加速机器学习算法。
但是大部分机器学习算法其实是一个有环的数据流,但是在spark中,实际是用无环图来表示的,一般的分布式处理引擎都是不鼓励试用有环图的。
但是flink这里又有点不一样,flink支持在runtime中的有环数据流,这样表示机器学习算法更有效而且更有效率。
这一点flink胜出。

Stream as platform vs Batch as Platform
Spark诞生在Map/Reduce的时代,数据都是以文件的形式保存在磁盘中,这样非常方便做容错处理。
Flink把纯流式数据计算引入大数据时代,无疑给业界带来了一股清新的空气。这个idea非常类似akka-streams这种。
成熟度
目前的确有一部分吃螃蟹的用户已经在生产环境中使用flink了,不过从我的眼光来看,Flink还在发展中,还需要时间来成熟。
结论
目前Spark相比Flink是一个更为成熟的计算框架,但是Flink的很多思路很不错,Spark社区也意识到了这一点,并且逐渐在采用Flink中的好的设计思路,所以学习一下Flink能让你了解一下Streaming这方面的更迷人的思路。
分享到:
评论

相关推荐

    基于Apache Flink框架的实时数据处理系统.zip

    基于Apache Flink框架的实时数据处理系统 项目简介 本项目是一个基于Apache Flink框架的实时数据处理系统,旨在处理来自不同数据源(如Kafka、Socket等)的流数据,并进行高效的数据转换、聚合和存储。系统支持...

    基于 Apache Pulsar 和 Apache Flink 进行批流一体的弹性数据处理.pdf

    Apache Pulsar 和 Apache Flink 是两个在大数据处理领域中广泛应用的开源项目。Apache Pulsar 是一个先进的、分布式的消息传递系统,而 Apache Flink 是一个强大的流处理和批处理引擎。这篇文档讨论了如何结合这两个...

    流处理框架Stream Processing with Apache Flink.zip

    现在大数据处理里面比较公认的流处理框架,Stream Processing with Apache Flink;

    Declarative Data Processing With Java in Apache Flink

    在大数据处理领域,Flink处于核心位置,与MapReduce、Hive、Spark、Storm等工具并存,共同构建了强大的数据处理平台。这些工具通常与YARN或Mesos等资源管理器一起使用,用于处理存储在HDFS或其他系统中的数据,如...

    Apache Flink:从基础数据处理到机器学习模型训练

    主要内容:本文介绍了Apache Flink的基本概念和安装配置流程,涵盖实时和批处理的数据处理技术,并深入探讨了Flink Machine Learning(Flink ML)库的应用,从数据预处理开始一直到复杂的机器学习模型的训练、评估及...

    不仅仅是流计算:Apache Flink实践

    Apache Flink是一个强大的开源大数据处理框架,其设计目标是提供低延迟、高吞吐量的实时数据处理能力。本文将深入探讨Apache Flink的核心概念、关键特性以及在实际应用中的实践策略。 一、Apache Flink概述 Apache ...

    Java高性能数据分析框架Apache Flink教程详解

    适合Java开发者快速入手Flink,构建复杂数据处理流水线及解决大规模数据挑战。 适合人群:Java开发者希望了解和使用Apache Flink构建高效的数据处理系统。 适用场景及目的:用于实现大规模实时流数据及批数据处理,...

    Learning Apache Flink

    综上所述,Apache Flink 是一个强大的实时数据处理引擎,它的灵活性和高性能使其在大数据领域有着广泛的应用。通过理解和掌握 Flink 的基本概念、架构、API 和实战技巧,开发者可以构建高效、可靠的实时数据处理系统...

    Apache Kafka × Apache Flink Meetup-北京站20190512.zip

    通过这次Meetup,参会者不仅能够深入了解Kafka和Flink的技术细节,还能了解到这两个项目在实际业务中的应用情况,从而提升自身在实时大数据处理领域的专业技能。这样的技术交流活动对于推动中国大数据技术的发展,...

    Stream Processing with Apache Flink(Early Release)

    Apache Flink是一个开源流处理框架,它在大数据领域扮演着重要的角色,特别是在实时数据处理和分析方面。"Stream Processing with Apache Flink (Early Release)"很可能是一本深入介绍Flink技术的书籍,它可能包含了...

    Learning Apache Flink.pdf

    总而言之,这本文档旨在为scala开发者提供一个关于Apache Flink的全面指南,帮助他们理解并掌握使用Flink进行大规模数据处理的原理和实践,包括Flink如何在分布式系统中有效地执行数据处理任务,以及如何利用其API...

    Apache Flink:详细入门.docx

    Apache Flink 是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个 Flink 运行时(Flink Runtime),提供支持流处理和批处理两种类型应用的功能。 Flink 的特点 1. 流处理特性:支持高吞吐...

    Apache Flink v1.9 官方中文文档.zip

    在v1.9版本中,它提供了一系列的功能和优化,使其在大数据处理领域更加成熟和可靠。 **1. 流处理与批处理统一** Flink的核心特性之一是其对流处理和批处理的统一视图。这意味着开发者可以使用相同的API来处理实时流...

    Mastering Apache Flink, Learning Apache Flink

    Apache Flink是一种开源的流处理框架,它支持高吞吐量、低延迟的数据处理,并拥有容错机制,保证了数据处理的精确性。Flink设计用于处理分布式数据流,在其架构中,Job Manager负责调度和协调任务,而Task Manager则...

    Apache_Flink在万达金融的实践-李呈祥

    在当今大数据技术日新月异的时代,万达金融集团网络数据...从流计算平台的选型、项目介绍到经验教训的总结,这都代表了企业级大数据处理技术发展的一个重要方向,并预示了流式数据处理在金融行业中日益增长的应用前景。

    Learning_Apache_Flink_ColorImages.pdf

    《Learning_Apache_Flink_ColorImages.pdf》这本书深入介绍了Apache Flink这一强大的流处理和批处理框架。...通过学习这些内容,读者可以全面了解如何利用Apache Flink构建高效、可扩展的大数据处理系统。

Global site tag (gtag.js) - Google Analytics