流/批/OLAP一体的Flink

129 阅读4分钟

Flink概述

为什么需要流式计算

批式计算:等待直到一批数据到齐才开始计算,以小时/天等周期对静态数据集进行离线计算,不具有实时性。

流式计算:对不断有新数据产生的动态数据集进行实时计算,并且7*24h持续运行。

由于有对数据的实时性要求更高的业务场景,如:实时推荐、监控等,原来的批式计算不足以满足这样的要求,所以我们需要流式计算。

Why Flink

Exactly-Once, Checkpoint, Dataflow, 流批一体

Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale.

Flink整体架构

Flink分层架构

1.SDK层:Flink的SDK目前主要有三类:SQL/Table, Datastream, Python

2.执行引擎层(Runtime层):执行引擎层提供了统一的DAG,用来描述数据处理的Pipeline,不管是流还是批,都会转化为DAG图,调度层再把DAG转化成分布式环境下的Task,Task之间通过suffle传输数据。

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

4.资源调度层:目前Flink可以支持部署在多种环境。

屏幕截图 2022-07-27 234943.png (Flink分层架构图)

Flink整体架构

两个核心组件

1.JobManager(JM):负责整个任务的调度工作。包括:调度Task、触发协调Task做CheckPoint、协调容错恢复等。

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

屏幕截图 2022-07-27 234841.png (Flink集群的简单概念图)

JM又细分为三点:
1.Dispathcher:接受作业,拉起JM执行作业,并在JM挂掉后恢复作业。
2.JobMaster:管理一个job的整个生命周期,会向ResourceManager申请slot,并将Task调度到对应的TM上。每个TM上有一个或多个slot,每个slot都是一个单独的线程。
3.ResourceManager:负责slot资源的管理和调度,TM拉起后会向ResourceManager注册。

屏幕截图 2022-07-27 234858.png (JobManager的职责)

Flink如何做到流批一体

为什么需要流批一体

在业务中,常常有同时需要流式计算和批式计算的场景,如:抖音既需要实时推荐系统(流式计算),又需要每天统计播放量、评论量(批式计算)。而将流批分为两套系统的架构具有人力成本较高、数据链路冗余、数据口径不一致等缺点,所以需要流批一体。

屏幕截图 2022-07-27 235323.png (流批分离的架构)

Flink如何做到流批一体

在Flink中,Everything is stream,批式数据也可以看作一种特殊的在一段时间内的特殊数据流。所以不管是有边界的批式数据还是无边界的流式数据,Flink都可以天然的支持。并且Flink在流批一体上,从上面的API到底层的处理机制都是统一的,是真正意义上的流批一体

屏幕截图 2022-07-27 234623.png (如上图:批处理是特殊的流处理,而OLAP处理又是特殊的批处理)

Flink主要从下面几个模块来做流批一体:
1.SQL层
2.DataStream API层统一,批和流都可以使用DataStream API来处理。
3.Schedual层架构统一,支持流批场景。
4.Failover Recovery层架构统一,支持流批场景。
5.Shuffle Service层架构统一,流批场景选择不同的Shuffle Service。

流批一体的Schedule层

在1.12之前的版本中,Flink支持以下两种调度模式

屏幕截图 2022-07-27 235609.png

EAGER模式下,因为是Stream作业场景,所以需要系统7*24小时不间断工作,所以所有的Task必须全部工作。所有的Task通过内存进行数据交换,这样的数据交换模式称为PIPELINE模式

屏幕截图 2022-07-28 000043.png (EAGER模式示意图)

LAZY模式下,因为是Batch作业场景,可以从上游到下游依次执行,所以可以让每个Task单独执行,而无需让所有Task同时运行。Task之间通过落盘+读盘的方式进行数据交换,这样的数据交换模式称为BLOCKING模式

屏幕截图 2022-07-28 000159.png (LAZY模式示意图)

为了实现流批一体,Flink提出了Pipeline Region的抽象概念:由Pipeline连接的Task构成一个Pipeline Region。如此一来,从本质上来说,不管是流作业还是批作业,都是按照Pipleline Region的粒度来进行资源分配的。

屏幕截图 2022-07-28 001657.png (Pipeline Region模式的性能和占用资源都介于EAGER模式和LAZY模式之间)