1.1 初步认识Apache Flink

流处理技术的演变

在开源世界里,Apache Storm项目是流处理的先锋。Storm最先由Nathan Marz和创业公司BackType的一个团队开发,后来才被Apache基金会接纳。Storm提供了低延迟的流处理,可是它为实时性付出了一些代价:很难实现高吞吐,而且其正确性没能达到一般所需的水平,换句话说,它并不能保证exactly-once,即使是它可以保证的正确性级别,其开销也至关大。数据结构

在低延迟和高吞吐的流处理系统中维持良好的容错性是很是困难的,可是为了获得有保障的准确状态,人们想到了一种替代方法:将连续时间中的流数据分割成一系列微小的批量做业。若是分割得足够小(即所谓的微批处理做业),计算就几乎能够实现真正的流处理。由于存在延迟,因此不可能作到彻底实时,可是每一个简单的应用程序均可以实现仅有几秒甚至几亚秒的延迟。这就是在Spark批处理引擎上运行的Spark Streaming所使用的方法。架构

更重要的是,使用微批处理方法,能够实现exactly-once语义,从而保障状态的一致性。若是一个微批处理失败了,它能够从新运行,这比连续的流处理方法更容易。Storm Trident是对Storm的延伸,它的底层流处理引擎就是基于微批处理方法来进行计算的,从而实现了exactly-once语义,可是在延迟性方面付出了很大的代价。框架

对于Storm Trident以及Spark Streaming等微批处理策略,只能根据批量做业时间的倍数进行分割,没法根据实际状况分割事件数据,而且,对于一些对延迟比较敏感的做业,每每须要开发者在写业务代码时花费大量精力来提高性能。这些灵活性和表现力方面的缺陷,使得这些微批处理策略开发速度变慢,运维成本变高。运维

因而,Flink出现了,这一技术框架能够避免上述弊端,而且拥有所需的诸多功能,还能按照连续事件高效地处理数据,Flink的部分特性以下图所示:机器学习

图 Flink的部分特性

初识Flink

Flink起源于Stratosphere项目,Stratosphere是在2010~2014年由3所地处柏林的大学和欧洲的一些其余的大学共同进行的研究项目,2014年4月Stratosphere的代码被复制并捐赠给了Apache软件基金会,参加这个孵化项目的初始成员是Stratosphere系统的核心开发人员,2014年12月,Flink一跃成为Apache软件基金会的顶级项目。分布式

在德语中,Flink一词表示快速和灵巧,项目采用一只松鼠的彩色图案做为logo,这不只是由于松鼠具备快速和灵巧的特色,还由于柏林的松鼠有一种迷人的红棕色,而Flink的松鼠logo拥有可爱的尾巴,尾巴的颜色与Apache软件基金会的logo颜色相呼应,也就是说,这是一只Apache风格的松鼠。ide

图 Flink Logo

Flink主页在其顶部展现了该项目的理念:“Apache Flink是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架”。性能

Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink被设计在全部常见的集群环境中运行,之内存执行速度和任意规模来执行计算。学习

批处理与流处理

批处理的特色是有界、持久、大量,批处理很是适合须要访问全套记录才能完成的计算工做,通常用于离线统计。流处理的特色是无界、实时,流处理方式无需针对整个数据集执行操做,而是对经过系统传输的每一个数据项执行操做,通常用于实时统计。设计

在Spark生态体系中,对于批处理和流处理采用了不一样的技术框架,批处理由SparkSQL实现,流处理由Spark Streaming实现,这也是大部分框架采用的策略,使用独立的处理器实现批处理和流处理,而Flink能够同时实现批处理和流处理。

Flink是如何同时实现批处理与流处理的呢?答案是,Flink将批处理(即处理有限的静态数据)视做一种特殊的流处理。

Flink的核心计算架构是下图中的Flink Runtime执行引擎,它是一个分布式系统,可以接受数据流程序并在一台或多台机器上以容错方式执行。

Flink Runtime执行引擎能够做为YARN(Yet Another Resource Negotiator)的应用程序在集群上运行,也能够在Mesos集群上运行,还能够在单机上运行(这对于调试Flink应用程序来讲很是有用)。

图 Flink计算架构

上图为Flink技术栈的核心组成部分,值得一提的是,Flink分别提供了面向流式处理的接口(DataStream API)和面向批处理的接口(DataSet API)。所以,Flink既能够完成流处理,也能够完成批处理。Flink支持的拓展库涉及机器学习(FlinkML)、复琐事件处理(CEP)、以及图计算(Gelly),还有分别针对流处理和批处理的Table API。

能被Flink Runtime执行引擎接受的程序很强大,可是这样的程序有着冗长的代码,编写起来也很费力,基于这个缘由,Flink提供了封装在Runtime执行引擎之上的API,以帮助用户方便地生成流式计算程序。Flink 提供了用于流处理的DataStream API和用于批处理的DataSet API。值得注意的是,尽管Flink Runtime执行引擎是基于流处理的,可是DataSet API先于DataStream API被开发出来,这是由于工业界对无限流处理的需求在Flink诞生之初并不大。

DataStream API能够流畅地分析无限数据流,而且能够用Java或者Scala来实现。开发人员须要基于一个叫DataStream的数据结构来开发,这个数据结构用于表示永不中止的分布式数据流。

Flink的分布式特色体如今它可以在成百上千台机器上运行,它将大型的计算任务分红许多小的部分,每一个机器执行一部分。Flink可以自动地确保发生机器故障或者其余错误时计算可以持续进行,或者在修复bug或进行版本升级后有计划地再执行一次。这种能力使得开发人员不须要担忧运行失败。Flink本质上使用容错性数据流,这使得开发人员能够分析持续生成且永远不结束的数据(即流处理)。

相关文章
相关标签/搜索