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

85 阅读4分钟

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

课程内容

01.Flink概述

02.Flink整体架构

03.Flink架构优化

04.精选案例讲解

01.Flink概述

  • Apache Flink的诞生背景

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

大数据的特点:海量化,价值化(价值密度低,但整体价值高),快速化(数据产生的速度),多样化。

image.png

大数据的特点

大数据计算架构的发展历史

image.png 需要流式计算的原因:大数据的实时性带来的价值更大

image.png

  • 为什么Apache Flink会脱颖而出

image.png Native:数据一条一条地处理

mini-batch:微小的批处理,把批处理切割成很小的一批模仿流处理

At least/Most once:只能保证数据至少被处理一次

StateFul:状态处理,No表示需要借助外部存储,Yes表示不需要借助外部系统,有自己状态的支持系统

Flink的容错特性将会在后续课程展开

image.png

  • Apache Flink开源生态

image.png

DAG:Directed acyclic graph,无回路有向图,用DAG来描述数据处理的Pipeline,是大数据中抽象的逻辑表达

02.Flink整体架构

  1. Flink 分层架构
graph TD
SDK层//Flink有三类SDK --> 执行引擎层//统一的DAG用来描述数据处理的pipeline//流和批转化成DAG图//DAG转化成分布式环境下的Task-->状态存储层//存储算子的状态信息-->资源调度层//支持部署在多种环境

image.png

  1. Flink 整体架构

一个Flink集群,主要包含两个核心组件:JobManager、TaskManager

JM:负责整个任务的协调工作,调度task,触发协调task做checkpoint,协调容错恢复等

image.png

TM:负责执行一个Dataflow Graph的各个task以及data streams的buffer和数据交换

image.png 如上图所示:Flink Program模块,根据编程代码,由优化器或图像构造器生成DAG,逻辑图,再由client发送给JM,JM把逻辑图转化成物理图,再进行task调度

  1. Flink 作业示例

一个Flink作业在Flink中的处理流程,DataFlow Model的设计思想

image.png 分布式处理的并发处理: image.png 优化,operator chain:减少线程的切换,将source和map操作合为一个线程 image.png 可以组成operator chain的算子需要满足一定的条件(去文档找Apache Flink Documentation | Apache Flink

image.png 6. Flink 如何做到流批一体

6.1 为什么业内有流批一体的业务需求: ①流式处理:视频实时播放量,点赞数;②批式处理:按天统计创造者的数据信息(昨天的播放量,评论量,广告收入)。

实时数仓(流)和离线数仓(批)的架构: image.png 倘若采用流式和批式分离的处理方式,①人力成本高,相同的逻辑需要开发两套系统;②数据链路冗余,本身计算内容一致时,两套链路导致相同逻辑需要运行两倍,造成资源浪费;③数据口径不一致,两套系统,两套算子,两套UDF,通常会产生不同程度的误差,这些误差会给业务方带来非常大的困扰。

6.2 流批一体面临的挑战:

image.png

image.png 6.3 Flink怎么做到的:

Flink对处理方式进行了抽象,“Everything is Streams”,将批式计算视作流式计算的特例,有界的数据集看做是一种特殊的数据流。

image.png 6.3.1 流批一体调度层 版本1.12以前,Flink有两种处理模式,如下图所示,直线的两端,即pipeline region的两端的两个调度,在版本1.12以后的Flink利用pipeline抽象出了一个概念,能够兼容两种操作模式,在调度层统一了流式和批式的调度: image.png 流批一体中的两种数据交换模式,倘若数据交换模式都是pipeline模式,就是pipeline region scheduler。blocking的意思是写入磁盘(落盘),pipeline模式,每一算子产生的结果在内存中存储,计算结果传递给下一个算子后不再保留: image.png

6.3.2 流批一体Shuffle Service层

Shuffle:在分布式计算中,用来连接上下游数据交互的过程叫做Shuffle。实际上,分布式计算中所有涉及到上下游衔接的过程,都可以理解为Shuffle。

image.png Shuffle的主要两个实现形式: image.png 流和批Shuffle之间的差异: image.png Streaming Shuffle 和 Batch Shuffle在具体策略上存在差异,但本质都是为了对数据进行Re-partition,因此不同的Shuffle存在共性。Flink的目标就是提供一套统一的Shuffle架构,该架构可以满足不同Shuffle在策略上的定制,同时还能避免在共性需求的重复开发。

image.png

03.Flink架构优化

  1. 流/批/OLAP业务场景概述

image.png

image.png

  1. 为什么三种场景可以用一套引擎来解决

image.png 批式计算是流式计算的特例,而OLAP计算是一种特殊的批式计算,它除了对并发和实时性要求更高,其他情况与普通批式作业没有特别大的区别。因此,理论上,我们是可以用一套引擎架构来解决上述三种场景,只不过需要对不同的场景支持相应的扩展性,并允许做不同的优化策略。 image.png 4. Flink如何支持OLAP场景

OLAP场景需求:①短查询作业场景;②高并发支持;③极致处理性能

Flink做OLAP场景的优势: image.png Flink的进化之路: image.png

04.精选案例讲解

image.png