目录
一、初始Flink
1.1 Flink 的源起和设计理念
1.2 Flink的应用
1.3 流式数据处理的发展和演变
1.3.1 流处理和批处理
1.3.2 传统事务处理
1.3.3 有状态的流处理
1.3.4 Lambda架构
1.3.5 新一代流处理器
1.4 Flink的特性总结
1.4.1 Flink 的核心特性
1.4.2 分层API
1.5 Flink vsSpark
1.5.1 数据处理架构
1.5.2 数据模型和运行架构
1.5.3 Spark 还是 Flink
1.6 本章总结
Flink 是 Apache 基金会旗下的一个开源大数据处理框架。目前,Flink 已经成为各大公司 大数据实时处理的发力重点,特别是国内以阿里为代表的一众互联网大厂都在全力投入,为
Flink 社区贡献了大量源码。如今 Flink 已被很多人认为是大数据实时处理的方向和未来,许多 公司也都在招聘和储备掌握 Flink 技术的人才。
那 Flink 到底是什么,又有什么样的优点,能够让大家对它如此青睐呢?
本章我们就来做一个详细的了解。首先讲述 Flink 的源起和设计理念,接着介绍 Flink 如 今的应用领域;进而通过梳理数据处理架构的发展演变,解答为什么要用 Flink 的疑问。进而 梳理 Flink 的特点,并同另一个流行的大数据处理框架 Spark 进行比较,从而更深刻地理解 Flink
的底层架构和优势所在。
Flink 是一个大数据流处理引擎,它可以为不同的行业提供大数据实时处理的解决方案。 随着 Flink 的快速发展完善,如今在世界范围许多公司都可以见到 Flink 的身影。
目前在全球范围内,北美、欧洲和金砖国家均是 Flink 的应用热门区域。当然,这些地区 其实也就是 IT、互联网行业较发达的地区。 Flink 在国内热度尤其高,一方面是因为阿里的贡献和带头效应,另一方面也跟中国的应 用场景密切相关。中国的人口规模与互联网使用普及程度,决定了对大数据处理的速度要求越 来越高,也迫使中国的互联网企业去追逐更高的数据处理效率。试想在中国,一个网站可能要 面对数亿的日活用户、每秒数亿次的计算峰值,这对很多国外的公司来说是无法想象的。而
Flink 恰好给我们高速准确的处理海量流式数据提供了可能。
我们已经了解,Flink 的主要应用场景,就是处理大规模的数据流。那为什么一定要用 Flink
呢?数据处理还有没有其他的方式?要解答这个疑惑,我们就需要先从流处理和批处理的概念 讲起。
IT 互联网公司往往会用不同的应用程序来处理各种业务。比如内部使用的企业资源规划 (ERP)系统、客户关系管理(CRM)系统,还有面向客户的 Web 应用程序。这些系统一般都 会进行分层设计:“计算层”就是应用程序本身,用于数据计算和处理;而“存储层”往往是传统 的关系型数据库,用于数据存储,如图 1-5 所示。
不难想到,如果我们对于事件流的处理非常简单,例如收到一条请求就返回一个“收到”, 那就可以省去数据库的查询和更新了。但是这样的处理是没什么实际意义的。在现实的应用中, 往往需要还其他一些额外数据。我们可以把需要的额外数据保存成一个“状态”,然后针对这 条数据进行处理,并且更新状态。在传统架构中,这个状态就是保存在数据库里的。这就是所 谓的“有状态的流处理”。
为了加快访问速度,我们可以直接将状态保存在本地内存,如图 1-6 所示。当应用收到一 个新事件时,它可以从状态中读取数据,也可以更新状态。而当状态是从内存中读写的时候, 这就和访问本地变量没什么区别了,实时性可以得到极大的提升。
另外,数据规模增大时,我们也不需要做重构,只需要构建分布式集群,各自在本地计算就可以了,可扩展性也变得更好。
因为采用的是一个分布式系统,所以还需要保护本地状态,防止在故障时数据丢失。我们 可以定期地将应用状态的一致性检查点(checkpoint)存盘,写入远程的持久化存储,遇到故 障时再去读取进行恢复,这样就保证了更好的容错性。
Flink 是第三代分布式流处理器,它的功能丰富而强大。
Flink 区别与传统数据处理框架的特性如下。
⚫ 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟。
13
⚫ 结果的准确性。Flink 提供了事件时间(event-time)和处理时间(processing-time) 语义。对于乱序事件流,事件时间语义仍然能提供一致且准确的结果。
⚫ 精确一次(exactly-once)的状态一致性保证。
⚫ 可以连接到最常用的存储系统,如 Apache Kafka、Apache Cassandra、Elasticsearch、
JDBC、Kinesis 和(分布式)文件系统,如 HDFS 和 S3。
⚫ 高可用。本身高可用的设置,加上与 K8s,YARN 和 Mesos 的紧密集成,再加上从故 障中快速恢复和动态扩展任务的能力,Flink 能做到以极少的停机时间 7×24 全天候 运行。
⚫ 能够更新应用程序代码并将作业(jobs)迁移到不同的 Flink 集群,而不会丢失应用 程序的状态。
谈到大数据处理引擎,不能不提 Spark。Apache Spark 是一个通用大规模数据分析引擎。 它提出的内存计算概念让大家耳目一新,得以从 Hadoop 繁重的 MapReduce 程序中解脱出来, 可以说是划时代的大数据处理框架。除了计算速度快、可扩展性强,Spark 还为批处理(Spark SQL)、流处理(Spark Streaming)、机器学习(Spark MLlib)、图计算(Spark GraphX)提供 了统一的分布式数据处理平台,整个生态经过多年的蓬勃发展已经非常完善。
然而正在大家认为 Spark 已经如日中天、即将一统天下之际,Flink 如一颗新星异军突起, 使得大数据处理的江湖再起风云。很多读者在最初接触都会有这样的疑问:想学习一个大数据 处理框架,到底选择 Spark,还是 Flink 呢?
这就需要我们了解两者的主要区别,理解它们在不同领域的优势。
我们已经知道,数据处理的基本方式,可以分为批处理和流处理两种。
批处理针对的是有界数据集,非常适合需要访问海量的全部数据才能完成的计算工作,一 般用于离线统计。
流处理主要针对的是数据流,特点是无界、实时, 对系统传输的每个数据依次执行操作, 一般用于实时统计。
从根本上说,Spark 和 Flink 采用了完全不同的数据处理方式。可以说,两者的世界观是 截然相反的。 Spark 以批处理为根本,并尝试在批处理之上支持流计算;在 Spark 的世界观中,万物皆 批次,离线数据是一个大批次,而实时数据则是由一个一个无限的小批次组成的。所以对于流 处理框架 Spark Streaming 而言,其实并不是真正意义上的“流”处理,而是“微批次” (micro-batching)处理,如图 1-12 所示
正因为这种架构上的不同,Spark 和 Flink 在不同的应用领域上表现会有差别。一般来说, Spark 基于微批处理的方式做同步总有一个“攒批”的过程,所以会有额外开销,因此无法在 流处理的低延迟上做到极致。在低延迟流处理场景,Flink 已经有明显的优势。而在海量数据 的批处理领域,Spark 能够处理的吞吐量更大,加上其完善的生态和成熟易用的 API,目前同 样优势比较明显。
本章作为学习 Flink 的入门和综述,主要介绍了 Flink 的源起和应用,引出了流处理相关 的一些重要概念,并通过介绍数据处理架构发展演变的过程,为读者展示了 Flink 作为新一代 分布式流处理器的架构思想。最后我们还将 Flink 与时下同样火热的处理引擎 Spark 进行了对 比,详细阐述了 Flink 在流处理方面的优势。
通过本章的学习,大家不仅可以初步了解 Flink,而且能够建立起数据处理的宏观思维, 这对以后学习框架中的一些重要特性非常有帮助。