这是我参与「第四届青训营 」笔记创作活动的第3天
流/批/OLAP 一体的Flink引擎介绍
01.Flink概述
Apache Flink诞生背景:对使用场景提出了更高的要求
三驾马车(全面了解大数据“三驾马车”的开源实现 - 知乎 (zhihu.com))
大数据:海量化、多样化、快速化、价值化
大数据计算发展历史:传统数仓->Hadoop->Spark->Flink
大数据实时性带来价值更大:监控场景、金融风险、实时推荐……
批式计算: 离线计算非实时、静态数据集、周期性计算;流式计算: 实时计算快速低延时、无限流动态无边界、持续运行、流批一体。
Apache Flink脱颖而出:精确、低延迟高吞吐、Checkpoint容错机制、支持SQL提高迭代
流式框架对比:
Apache Flink开源生态:
02.Flink整体架构
Flink分层架构:Flink各个模块的用途
SDK层:三类:SQL/Table、DataStream、PythonFlink
执行引擎层( Runtime 层): 执行引擎层提供了统一的 DAG,用来描述数据处理的 Pipeline,不管是流还是批,都会转化为 DAG 图,调度层再把 DAG 转化成分布式环境下的 Task,Task 之间通过 Shuffle 传输数据;
状态存储层:负责存储算子的状态信息
资源调度层:目前Flink可以支持部署在多种环境。
Flink总体架构:
JobManager(JM) 负责整个任务的协调工作,包括:调度 task、触发协调 Task 做 Checkpoint、协调容错恢复等,核心有下面三个组件:
Dispatcher: 接收作业,拉起 JobManager 来执行作业,并在 JobMaster 挂掉之后恢复作业;
JobMaster: 管理一个 job 的整个生命周期,会向 ResourceManager 申请 slot,并将 task 调度到对应 TM 上;
ResourceManager:负责 slot 资源的管理和调度,Task manager 拉起之后会向 RM 注册;
TaskManager(TM) :负责执行一个 DataFlow Graph 的各个 task 以及 data streams 的 buffer 和数据交换。
为什么需要流批一体:人力成本比较高相同逻辑需要开发两遍、数据链路冗余造成资源浪费、数据口径不一致可能导致误差。
Flink如何做到流批一体:
SQL 层;
DataStream API 层统一,批和流都可以使用 DataStream API 来开发;
Scheduler 层架构统一,支持流批场景;
Failover Recovery 层 架构统一,支持流批场景;
Shuffle Service 层架构统一,流批场景选择不同的 Shuffle Service;