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

130 阅读4分钟

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

流/批/OLAP一体的Flink引擎介绍

 

Flink特点

1.支持SQL

2.流批一体

3.毫秒级,低延迟

4.状态容错             

5.自己支持状态管理(operator),不依赖外部系统

6.Dataflow编程模型     window等高阶需求支持友好

6.exactly-once

Flink架构

分层架构

SDK层:Flink的SDK(软件开发包)主要三类,SQL/Table、DataStream、Python

执行引擎(runtime)层:提供了统一的DAG,用来描述数据处理的pipeline(业务逻辑)。将数据转化为DAG图,再把DAG调度、转化成分布式环境下的Task,各节点的Task之间通过Shuffle传输数据。

状态存储层:负责存储算子的状态信息。

资源管理层:Flink可以支持部署在多个环境。Yarn/K8s等。

分层架构.png

总体架构

用户代码抽象成逻辑图(DAG图)———————————————如何转成DAG图

将此逻辑图交给JM,形成物理执行图。

将物理执行图的逻辑和Task调度到不同TM节点—————————如何调度

总体架构.png  

Flink的两个核心组件

1. JobManager(JM):负责整个任务的协调工作【调度task,协调容错恢复】。

2. TaskManager(TM):负责执行一个Dataflow Graph的各个Task以及data streams的buffer和数据交换。

JobManager(JM)可细分三个部分:

1.Dispatcher:接收作业,唤醒或者恢复JM的作业

2.JobMaster:管理job生命周期,向ResourceManager申请slot(资源),并将task调度给TM

3.ResourceManager:负责slot资源的管理调度,接受管理TM的注册

jobmanager.png

 

Flink会尽可能将不同的operator链接(chain)成一个Task,放入一个slot中,会更高效。

task和slot.png

Flink的流批一体

目前的业务数据处理形式,分成实时数仓和离线数仓,存在以下缺陷:

1.批、流两套系统,逻辑需要开发两遍,人力成本高。

2.数据链路冗余,计算内容一致但要两个链路运行,产生浪费

3.数据口径不同,两套系统、算子、UDF,会产生误差,难以解释、利用。

 

而批式数据(有限数据集)可以视为一种特殊的数据流(流式数据、无线数据集)。因此理论上可实现流批一体。

Apache Flink从以下几个模块实现流批一体:

1. SQL层

2. Datastream API层统一(功能)

3. Scheduler层(调度)

4. Failover Recovery层(容错)

5. Shuffle Service层

 

Scheduler层

负责将作业的DAG转化为Task。两种调度模式:EAGER/LAZY

Flink的schedule层两种调度模式.png LAZY需要的空间资源少一些,但是耗时更长。

 

Pipeline的数据交换方式连接的task构成Pipeline Region。

本质上,流作业和批作业都是按照pipeline region粒度来申请资源和调度任务。

(批作业中的task数据交换靠blocking,因此分成了若干task个数的pipeline region)

(流作业中的task数据交换如果全靠pipeline,因此分成了1个数的pipeline region)

 

 

Shuffle service层

基本概念:分布式计算中,所有涉及到上下游衔接的过程都可理解为shuffle。

Shuffle的实现通常分两种:

1.基于文件的Pull Based Shuffle.(比如spark、MR,高容错批处理)

2.基于Pipeline的Push Based Shuffle(比如Flink、Storm,低延迟 高性能,流处理)

 

流/批的shuffle差异

Shuffle数据的生命周期:流作业的Shuffle和task是绑定的,批作业的Shuffle和task解耦。

Shuffle数据存储介质:流作业生命周期短、实时性,通常存储在内存中,批处理的shuffle 存储在磁盘内。

Shuffle的部署方式:流作业Shuffle服务和计算节点部署在一起,网络开销少。

 

流/批一体的Shuffle Service层

在streaming、OLAP场景用基于pipeline的Shuffle;

在batch场景用Blocking的shuffle。

开源社区支持的Shuffle Service

1. Netty Shuffle Service:基础支持pipeline又支持blocking,Flink默认的Shuffle Service策略

2. Remote Shuffle Service:基础支持pipeline又支持blocking,对于pipeline模式,走remote(多一层网络传输)反而会性能下降,主要是有用在batch的blocking场景。

 

流/批/OLAP

批式计算是流式计算的特例。

而OLAP计算是一种特殊的批式计算。但对并发和实时性要求高。

因此理论上可以用一套引擎架构解决流/批/OLAP三种场景。

 

OLAP存在的需求和问题:

OLAP对latency和QPS要求较高,需要有高并发

作业频繁启停,资源碎片多。

 

Flink OLAP架构现状

Flink OLAP架构现状.png 问题:

1.OLAP希望作业能有高并发,但是jobmanager和resourcemanager是在一个进程内启动的,无法对jm水平拓展

2.Gateway与Flink Session Cluster互相独立,无法进行统一管理

3.jm处理和调度作业负责的功能比较多,导致耗时长、内存占用多

4.tm部署计算任务时,初始化的耗时严重

5.资源申请和资源释放流程链路过长

6.jm管理slot资源导致无法感知到TM维度的资源分布,资源管理完全依靠rm