往期推荐
一文入门大数据准流式计算引擎Spark【万字详解,全网最新】-CSDN博客
浅谈维度建模、数据分析模型,何为数据仓库,与数据库的区别_统一数仓 数据库用户名-CSDN博客数仓架构:离线数仓、实时数仓Lambda和Kappa、湖仓一体数据湖-CSDN博客
数仓分层ODS、DWD、DWM、DWS、DIM、DM、ADS_ods dwd dws ads dm-CSDN博客浅谈维度建模、数据分析模型,何为数据仓库,与数据库的区别_统一数仓 数据库用户名-CSDN博客
目录
3.1.2 DataStream & DataSet API层
3.1.3 Stateful Stream Processing层
0. Flink知识图谱
1. Flink发展
Apache Flink 诞生于柏林工业大学的一个研究性项目,原名 StratoSphere 。2014 年,由 StratoSphere 项目孵化出 Flink,并于同年捐赠 Apache,之后成为 Apache 的顶级项目。2019 年 1 年,阿里巴巴收购了 Flink 的母公司 Data Artisans,并宣布开源内部的 Blink,Blink 是阿里巴巴基于 Flink 优化后的版本,增加了大量的新功能,并在性能和稳定性上进行了各种优化,经历过阿里内部多种复杂业务的挑战和检验。同时阿里巴巴也表示会逐步将这些新功能和特性 Merge 回社区版本的 Flink 中,因此 Flink 成为目前最为火热的大数据处理框架。
1.1 四代计算引擎
在国外一些社区,有很多人将大数据的计算引擎分成了 4 代,当然,也有很多人不会认同。我们先姑且这么认为和讨论。
- 首先第一代的计算引擎,无疑就是 Hadoop 承载的 MapReduce。这里大家应该都 不会对 MapReduce 陌生,它将计算分为两个阶段,分别为 Map 和 Reduce。对于上层应用来说,就不得不想方设法去拆分算法,甚至于不得不在上层应用实现 多个 Job 的串联,以完成一个完整的算法,例如迭代计算。 由于这样的弊端,催生了支持 DAG 框架的产生。
- 因此,支持 DAG 的框架被划分为第二代计算引擎。如 Tez 以及更上层的 Oozie。这里我们不去细究各种 DAG 实现之间的区别,不过对于当时的 Tez 和 Oozie 来说,大多还是批处理的任务。
- 接下来就是以 Spark 为代表的第三代的计算引擎。第三代计算引擎的特点主要 是 Job 内部的 DAG 支持(不跨越 Job),以及强调的准实时计算。在这里,很多人也会认为第三代计算引擎也能够很好的运行批处理的 Job。 随着第三代计算引擎的出现,促进了上层应用快速发展,例如各种迭代计算的性能以及对流计算和 SQL 等的支持。
- Flink 的诞生就被归在了第四代。这应该主 要表现在 Flink 对流计算的支持,以及更一步的实时性上面。当然 Flink 也可 以支持 Batch 的任务,以及 DAG 的运算。
2. Flink简介
- Flink 是一个分布式、高性能、有状态的流处理框架,它能够对有界和无界的数据流进行高效的处理。Flink 的 核心是流处理(DataStream),当然也支持批处理(DataSet),Flink 将批处理看成是流处理的一种特殊情况,即数据流是有 明确界限的。这和 Spark Streaming 的思想是完全相反的,Spark Streaming 的核心是批处理,它将流处理看成是批处理的一种特殊情况, 即把数据流进行极小粒度的拆分,拆分为多个微批处理。
2.1 Flink特点
- 支持高吞吐、低延迟、高性能的流处理
- 结果准确,Flink提供了事件时间和处理时间,对乱序数据仍能提供一直准确的结果
- 支持高度灵活的窗口(Window)操作,支持基于 time、count、session, 以及 data-driven 的窗口操作
- 支持基于轻量级分布式快照(Snapshot)实现的容错
- 一个运行时同时支持 Batch on Streaming 处理和 Streaming 处理
- Flink 在 JVM 内部实现了自己的内存管理
- 支持迭代计算,Spark也支持
- 支持程序自动优化:避免特定情况下 Shuffle、排序等昂贵操作,中间结果有必要进行缓存
2.2 批处理和流处理
- 批处理
有界、持久、大量,一般用于离线计算- 流处理
无界、实时,流处理方式无需对整个数据集执行操作,而是对通过系统传输的每个数据项执行操作,一般用于实时统计在 Spark 生态体系中,对于批处理和流处理采用了不同的技术框架,批处理由 SparkSQL 实现,流处理由 Spark Streaming 实现,这也是大部分框架采用的策略,使用独立的处理器实现批处理和流处理,而 Flink 可以同时实现批处理和流处理,Flink 将批处理(即处理 有限的静态数据)视作一种特殊的流处理,即把数据看作是有界的 !
2.3 有界流和无界流
无界数据流:
- 有定义流的开始,但没有定义流的结束;
- 它们会无休止的产生数据
- 无界流的数据必须持续处理,即数据被摄取后需要立刻处理
- 我们不能等到所有数据都到达再处理,因为输入是无限的。
有界数据流:
- 有定义流的开始,也有定义流的结束
- 有界流可以在摄取所有数据后再进行计算
- 有界流所有数据可以被排序,所以并不需要有序摄取
- 有界流处理通常被称为批处理。
2.4 Flink和Spark Streaming
Spark本质是批处理
- Spark数据模型:Spak采用RDD模型,Spark Streaming的DStream实际上也就是一组组小批据RDD的集合
- Spark运行时架构:Spark是批计算,将DAG划分为不同的stage,一个完成后才可以计算下一个
Flink以流处理为根本
- Flink数据模型:Flink基本据模型是数据流,以及事件(Event)序列
- Flink运行时架构:Flink是标准的流执行模式,一个事件在一个节点处理完后可以直接发往下一个节点进行处理
3. Flink三层核心架构
下图为 Flink 技术栈的核心组成部分,由上而下分别是 API & Libraries 层、Runtime 核心层以及物理部署层。