Flink 引擎介绍 || 青训营

93 阅读9分钟

Flink 引擎介绍 || 青训营

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

一、Flink概述

1.1Apache Flink的诞生背景

(1)什么是大数据

1.价值化(value)
2.海量化(volumes)
3.快速化(velocit)
4.多样化(variety)

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

image.png

1.1.3为什么需要流式运算

1.可以用户的爱好可以推荐用户的爱好,也因为如此带来了大数据架构,模式的变化 也因此从离线变成流失运算。

1.2为什么Apache Flink会脱颖而出

1.2.2流式计算引擎对比

image.png Streaming Model : 一致性保证:能不能做出一次性判断的能力。 延迟:计算框架的延长性是什么样的 容错:能不能恢复到之前的样子。 sql支持,能不能支持简单的SQL语句,提高业务迭代的水平

1.2.3 什么是Flink

Apache Flink是一个框架和分布式处理引擎,用于在无界和有界数据流上进行有状态计算。Flink被设计为在所有常见的集群环境中运行,执行内存速度和任何规模的计算。

对业内流式框架提供了友好的发展
`1.Exactly-Once(精确一次的计算语义)
 2.状态容错(Checkpoint)
 3.Dataflow编程模型Window等高阶需求支持友好
 4.流批一体`

1.3 Apache Flink开源生态

FLink是计算框架,没有存储能力但是对存储引擎有很好导入,

image.png Resource Manager 部署在框架或实体机或虚拟机。 GElly(Graph)关于图计算的框架 Flink ML对ML调度的框架 Statteful Function对于function存储框架的解决方案

二、FInk整体架构

2.1 Flink分层架构

image.png

SDK层:FlinkSDK目前主要有三类:SQL/TableDataStreamPyFlinkSQL/Table:用户对SQL的表达
DataStream:基于对sql表达能力不强运用java补充;
PyFlink:提供支持pyhton的支持

image.png

执行引擎层:执行引擎层提供了同一栋DAG用来描述数据处理的Pipeline,不管是流还是批,都会转化哪位DAG图,调度层再把DAG转化为分布式环境下的TaskTask之间通过Shuffle传输数据;

image.png

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

image.png

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

2.2Flink整体架构

image.png

两个核心组件
`1.JobManager(JM):负责整个任务的协调工作,包括:调度task、触发协调Task做checkpoint、协调容错恢复等;`
`2.TaskManager(TM):负责执行一个DataFlowGraph的各个task以及data streams的buffer和数据交换;`
FinkProgarm
`所有的代码都会存储在这里然后转化为逻辑执行图然后发送给jobManager`
JobManager
`将转化到的执行图然后分达到各个部门执行`

image.png

1.Dispatcher:接收作业,拉起JobManager来执行作业,并在JobMaster挂掉之后恢复作业;
2.JobMaster:管理一个job的整个生命周期,会向ResouceManager申请slot,并将task调度到对于TM上;
3.ResouceManager:负责slot资源的管理和调度,Taskmanager拉起之后会向RM注册;
Client存入Dispatcher然后JobMaster会向ResouceManager申请资源然后拉起的两个tm资源给JobMaster在分配到相应的节点上

2.3 Flink作业示例

image.png

image.png

Source:节点
map():解析
keyBY()、window()APPly():窗口的概念,对这些数据做出来
Sink:写出去

image.png

Source分为两个为子Source,map1可到12最后Sink keyby最后都会合并到SInk

image.png

把source和map结合一起Flink做了一个优化OPerator链接(chain)在一起形成一个Task,这样可以不用单点运行这样省略一个哈希表;

image.png

每一个solt都是一个线程。

2.4 Flink如何做到流批一体

实时统计主播的观看人数等。 可以看到播放量评论多少。

2.4.1为什么需要流批一体

image.png

流批一体的痛点:
1.人力成本搞:流批两套系统,相同逻辑需要开发两遍;
2.数据链余:本身计算内容是一致的,由于是两套链路,相同逻辑需要运行两遍,产生一定的资源浪费;
3.数据口径不一致:两套系统、两套算子、两套UDF,通常会产生不同程度的误差,这些误差会给业务方带来非常大的困扰。

2.4.2流批源头的挑战

流式计算  批式计算
实时计算  离线计算
延迟在秒级以内 处理时间为分钟到小时级别,甚至天级别
0~1s      10s-1h+
广告推进、金融风控  搜索引擎构建索引。批式数据分析
`计算核心的区别`
维度  流式计算                   批式计算
数据流 无限数据集                有限数据集
时延   低延迟、业务会感知运行中的情况 实用性要去不高,只关注最终结果产出时间

2.4.3 Flink如何做到流批一体

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

2.4.4 流批一体的Scheduler层

image.png Scheduler主要负责将作业的DAG转化为在分布式环境中可以执行的Task 在1.2之前的Flink版本中,Flink支持以下两张调度模式:

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

image.png

image.png

ALL_EDGES_BLOCKING;
所有task之间的数据交换都是BLOCKING模式;
分为12pipeline region;
ALL_EDGES_PIPELINED;
所有task之间的数据交换都是PIPELINE模式;
分为1个pipeline region;

2.4.5 流批一体的Shuffle Service层

image.png Shuffle:在分布式计算中,用来连接上下游数据交换的过程叫做Shuffle。 实际上,分布式计算中所有涉及到上下游衔接的过程都可以理解为SHuffle。 针对不同的分布式计算框架,Shuffle通常有几种不同的实现:

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

流和批shuffle的差异:

1.shuffle数据的生命周期:流作业的shuffle数据与task是绑定的,而批作业的shuffle数据与Task是解耦的;
2.shuffle数据存储介质:流作业的生命周期比较短、而且流作业为了实时性,Shuffle通常存储在内存中,批因为数据量比较打以及容错的需求,一般会存储在磁盘里;
3.shuffle的部署方式:流作业shuffle服务和计算节点部署在一起,可以减少网络开销,从而减少latency,而批作业则不同。
对于shuffle service,福利你看开源社区已经支持
1.Netty shuffle service:即支持pipeline又支持blocking,Flink默认的shuffle service策略;
2.Remote shuffle service:即支持pipeline又支持blocking,NG对于pipeline模式,走remote反而会性能下降,主要是有用在batch的blocking场景,字节内部是基于css来实现的Rss

三、FInk架构优化

3.1 流/批/OLAP业务场景概述

1.有些场景下,只需离线处理数据,对实时性要求不高,但要求系统吞吐率高,典型的应用是搜索引擎构建索引;

2.有些场景下,需对数据进行实时分析,要求每条数据处理延迟尽可能低,典型的应用是广告推进、金融风控场景。

image.png

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

1.批式技术是流式计算的特例,Everything IS streams,有界数据集(批式数据)也是一种数据流、一种特殊的数据流;
2.OLAP技算是一种特殊的批式技术,它对并发和实时性要求很高,其他情况与普通批式作业没有特别大区别;

OLAP Engine 特殊的批式计数,要求速度快,可以用不同的方式优化。

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

3.3 Flink如何支持OLAP场景

3.3.1Flink做OLAP的优势

image.png 3.1.2Flink OLAP场景的挑战

image.png 3.1.3Flink OLAP架构现状

image.png

Gateway:接受Client提交的SQL QUERY,对SQL进行语法解析和查询优化,生成Flink作业只想计划,提交给Session集群
Session Cluster:执行作业调度及计算,并返回结果;
提前把集群创建出来,不需要重新去申请资源,可以减少申请资源的过程
非常适合解决olap的问题

3.1.4Flink在OLAP架构的问题与设想

`架构和功能模块:`
1.JObManagerResourceManager在一个进程内启动,无法对JobManager进行水平扩展;
2.GatewayFlink Session Cludster相互独立,无法进行统一管理
`作业管理及部署模块:`
1.jobmanager处理和调度作业时,负责的功能比较多,导致单作业处理时间长、并占用了过多的内存
2.TaskManager部署计算任务时,任务初始化部分耗时严重,消耗大量CPU
`资源管理及计算任务调度`
1.资源申请及资源释放流程链路过长
2.Slot作为资源管理单元,JM管理slot资源,导致JM无法感知到TM维度的资源分布,使得资源管理完全依赖于ResourceManager
`其他`
1.作业心跳与Failover机制,并不合适AP这种秒级或毫秒级计算场景;
2.AP目前使用Batch算子进行计算,这些算子初始化比较耗时;

总结

image.png

四、精选案例讲解

1.电商流批一体实践

image.png

`流批一体`

image.png

2.字节FLink OlAP实践

image.png

前面是在线后面是离线可以做到实现越低;