流批一体的Flink | 青训营笔记

60 阅读3分钟

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

本节课程主要介绍Flink,内容主要包括Flink概述、Flink整体架构及其架构优化。在此基础上,主讲人还介绍了字节跳动内部使用Flink的两个真实案例。

一、Flink概述

1.Apache Flink诞生背景

大数据具有以下5V特征:

1.Volume,大体量;

2.Variety,多样性;

3.Velocity,时效性;

4.Veracity,准确性;

5.Value,大价值。

大数据发展历史:

"史前阶段"->Hadoop->Spark->Flink(实时)

批式计算和流式计算的对比:

image.png

2.Apache Flink优势

Apache Flink以其一次性处理,低延迟,高吞吐,支持SQL从流式计算框架中脱颖而出。

(1)Apache Flink开源生态

Flink本身没有数据存储功能,但是和业内比较流行的存储进行了集成。

二、Flink整体架构

1.分层架构

①SDK层:SQL/Table、DataStream、Python

②执行引擎层(Runtime层):转化为DAG图,调度层把DAG转化为分布式环境下的Task,Task之间通过Shuffle传输数据

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

④资源调度层:支持部署在多种环境

2.整体架构

一个Flink集群,主要包含JobManager(JM)和TaskManager(TM)。JM负责协调工作,TM负责执行DAG的task和data streams的buffer和数据交换。

JM包括:

Dispatcher:接收作业,拉JobManager执行作业,并恢复作业

JobMaster:管理一个job的整个生命周期

ResourceManager:负责slot资源的管理和调度

ResourceManager相当于经理,得到资源分给JobMaster,JobMaster相当于组长进行管理,Dispatcher相当于小组长,安排TM工作。

TM包含多个slot,一个slot只能运行同一个task的subTask。

3.Flink如何做到流批一体

如果流批分开,相同逻辑要开发两遍,运行两遍,通常会产生不同程度的误差。

批式计算是流式的特例,所以可以进行流批一体。

Flink从SQL层、DataStream API、Scheduler层、Failover Recovery层、Shuffle Service层实现流批一体。

之前版本Flink支持EAGER和LAZY两种调度模式,分别用来实现流批场景。

现在的Flink流批作业都按照Pipeline Region调度,对流批在调度层实现统一,分为ALL_EDGES_BLOCKING和ALL_EDGES_PIPELING。

三、Flink架构优化

OLAP最大的特点是高并发。

OLAP是一种特殊的批式计算,对并发和实时性要求更高,所以三者可以用一套引擎解决。

Flink OLAP需要Gateway接收Client提交的SQL Query,对其进行语法解析和查询优化,生成作业执行计划,由Session集群执行作业调度和计算。

image.png

四、总结

1.我们生活中使用的数据有的需要批式处理,有的需要流式处理,还有特殊的需要使用OLAP。之前的架构是搭建两套处理方案,将流批分开,这样增加了开发成本,造成浪费。Flink真正做到了流批一体,使两者可以共用一套系统,满足不同的需求。

2.正是因为批式计算可以看作特殊的流式计算,OLAP可以看作特殊的批式计算,流批一体才成为可能。

3.Flink虽然现在的功能很强大,但是还有进步的空间,有需要继续改进的地方。