流/批/OLAP 一体的 Flink 引擎介绍 | 青训营笔记

203 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第 1 天

1. Flink 概述

1.1. Apache Flink 的诞生背景

大数据:之无法在一定时间内用常规软件工具对其进行获取、存储、管理和处理的数据集合。

特点(4V):Value(价值化)、Volumes(海量化)、Variety(多样化)、Velocity(快速化)

数据实时性的需要,流式计算被提出

1.2. 为什么 Apache Flink 会脱颖而出

流式计算框架对比:

StormSpark StreamingFlink
Streaming ModelNativemini-batchNative
一致性保证At Least/Most OnceExactly-OnceExactly-Once
延迟低延迟(毫秒级)延迟较低(秒级)低延迟(毫秒级)
吞吐LowHighHigh
容错ACKRDD Based CheckpointCheckpoint(Chandy-Lamport)
StateFulNoYes(DStream)Yes(Operator)
SQL支持NoYesYes

分布式处理引擎,基于有边界和无边界之上数据集有状态计算

2. Flink 整体架构

2.1. Flink 分层架构

  1. SDK 层:Flink 的 SDK 目前主要有三类,SQL/Table、DataStream、Python;
  2. 执行引擎层(Runtime 层):执行引擎提供了统一的 DAG,用来描述数据处理的 Pipeline,不管是流还是批,都会转化为 DAG 图,调度曾再把 DAG 转化成分布式环境下的 Task,Task 之间通过 Shuffle 传输数据;
  3. 状态存储层:负责存储算子的状态信息;
  4. 资源调度层:目前 Flink 可以支持部署在多种环境

2.2. Flink 总体架构

一个 Flink 集群,主要包含以下两个核心组件:

  1. JobManager(JM):负责整个任务的协调工作,包括:调度 task、触发协调 Task 做 Checkpoint、协调容错恢复等;
  2. TaskManager(TM):负责执行一个 DataFlow Graph 的各个 task 以及 data streams 的 buffer 和数据交换

JobManager

  • Dispatcher:接收作业,拉起 JobManager 来执行作业,并在 JobManager 挂掉之前恢复作业;
  • JobMaster:管理一个 job 的震哥哥生命周期,会向 ResourceManager 申请 slot,并将 task 调度到对应 TM 上;
  • ResourceManager:负责 slot 资源的管理和调度,Task manager 拉起之后会向 MR 注册;

2.3. Flink 作业示例

2.4. Flink 如何做到流批一体

维度流式计算批式计算
数据流无线数据集有限数据集
时延低延迟,业务会感知运行中的情况实时性要求不高,只关注最终结果产出时间
  1. 批式计算是流式计算的特例,Everything is Streams,有界数据集(批式数据)也是一种数据流、一种特殊的数据流。

Apache Flink 主要从一些几个模块来做流批一体:

  1. SQL 层;
  2. DataStream API 层同意,批和流都可以使用 DataSteam API 来开发;
  3. Scheduler 层架构统一,支持流批场景;
  4. Failover Recovery 层架构统一,支持流批场景;
  5. Shuffle Service 层架构同意,流批场景选择不同的 Shuffle Service;

Scheduler 层

Flink 的两种调度模式:

模式特点场景
EAGER申请一个作业需要的全部资源,然后同时调度这个作业的全部 Task,所有的 Task 之间采取 Pipeline 的方式进行通信Stream 作业场景
LAZY先调度上游,等待上游产生数据会结束后再调度下游,类似 Spark 的 Stage 执行模式Batch 作业场景

Shuffle 层

Shuffle 的几种不同实现:

  1. 基于文件的 Pull Based Shuffle,比如 Spark 或 MR,它的特点是具有较高的容错性,适合大规模的批处理作业,由于是基于文件的,它的容错性和稳定性会更好一些;
  2. 基于 Pipeline 的 Push Based Shuffle,比如 Flink、Storm、Presto 等,特的特点是低延迟和高性能,但是因为 shuffle 数据没有存储下来,如果是 batch 任务的话,就需要进行重跑恢复。

流和批 Shuffle 之间的差异:

  1. Shuffle 数据的生命周期:流作业的 Shuffle 数据与 Task 是绑定的,而批作业的 Shuffle 数据与 Task 是解耦的;
  2. Shuffle 数据存储介质:流作业的生命周期比较短、而且流作业为了实时性,Shuffle 通常存储在内存中,批作业因为数据量比较大以及容错的需求一般会存储在磁盘里;
  3. Shuffle 的部署方式:流作业 Shuffle 服务和计算节点部署在一起,可以减少网络开销,从而减少 latency,而批作业则不同;