Flink 引擎介绍|青训营笔记

135 阅读5分钟

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

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

1. Flink概述(背景、现状)

1. Apache Flink的诞生背景

大数据特点:价值化、海量化、快速化、多样化

87a4ae699b4cbc30a811987b880aefd.png

流式计算:监控场景、金融风控、实时推荐(抖音推荐更感兴趣内容)等

  • 批式计算(以前):
  1. 离线计算,非实时
  2. 静态数据集
  3. 小时/天等周期性计算 简单来说就是等待一批数据到齐
  • 流式计算(现在):
  1. 实时计算,快速、低延迟
  2. 无限流、动态、无边界
  3. 7*24h持续运行
  4. 流批一体 简单理解为水龙头,源头数据流入水管中,有一些基本数据处理,再传递到下游,直到整个处理完成(实时)

2. why Apache Flink脱颖而出

流式计算引擎对比: Storm、Spark Streaming、Flink

  1. 状态容错Checkpoint
  2. 精确一次的计算语义Exactly-Once
  3. Window等高阶需求支持友好Dataflow编程模型
  4. 流批一体

3. Apache Flink开源生态

1.jpg

  • 左边列前三:消息队列
  • 中间:内部架构设计
  • 底下:Flink部署模式
  • 顶部:其他框架

2. Flink整体架构

1. Flink分层架构

  1. SDK层:SQL/Table、DataStream、pyFlink
  2. 执行引擎层(Runtime层):执行引擎层提供了统一的DAG,不管是流还是批,都会转化为DAG图,调度阶段再把DAG转换成分布式环境下的Task,Task之间做一些数据交换是通过Shuffe传输数据
  3. 状态存储层:状态数据
  4. 资源调度层:目前Flink可以支持部署在多种环境

2. Flink总体架构

JobManager(JM)

负责整个任务的协调工作

包括:调度task、触发协调Task做Checkpoint、协调容错恢复等;

  • Dispatcher:接收作业
  • JobMaster:申请资源,分配Task
  • ResourceManager:资源管控

TaskManager(TM)

负责执行一个DataFlowGraph的各个task以及data streams的buffer和数据交换

1.jpg

Program code:不管SQL,python、JAVA都写在这里 Program code经过处理,转换为DAG的一张图,Client端会将逻辑图提交给JM,JM会将其转化为一个具体的物理执行图,并且JM根据任务调度,将Task调度到TM执行。

3. Flink作业示例

  • 业务逻辑转换为一个Streaming DataFlow Graph
  • 假设作业的Sink算子的并发配置为1,其余算子并发为2,紧接着会将上面的Streaming DataFlow Graph转化Parallel Dataflow(内部叫Execution Graph)
  • 为了更高效地分布式执行,Flink会尽可能地将不同的operator链接(chain)在一起形成Task
  • 这样每个Task可以在一个线程中执行,内部叫做OperatorChain
  • 最后将上面的Task调度到具体地TaskManager中的slot中执行,一个slot只能运行同一个task的subTask

4. Flink如何做到流批一体

为什么需要流批一体: 播放量、创作者数据信息

296688c99da37714e255260df2036a6.png

痛点:

  • 人力成本比较高
  • 数据链路冗余
  • 数据口径不一致

流式计算、批式计算对比: 流和批业务场景的特点、 批式计算相比于流式计算核心的区别

Flink如何做到流批一体:

(1)为什么能做到流批一体

b329cdcbba8284591c913a87ab46c38.png

  • Flink是流式引擎
  • 批式计算是流式计算的特例
  • 有界数据集(批式数据)也是一种数据流

(2)如何做到流批一体

Apache Flink 主要从以下模块来做流批一体:

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

流批一体的Scheduler层:

Scheduler主要负责将作业的DAG转化为在分布式环境中可执行的Task

Flink支持两种调度模式:EAGER(Stream作业场景)、LAZY(Batch作业场景)

不管是流作业还是批作业,都是按照Pipeline Region粒度来申请资源和调度任务

  • ALL_EDGES_BLOCKING

    A产生的数据不会立马发给B,需要写到磁盘,B也可以从A写出的文件读取数据

  • ALL_ENDGES_PIPELINED

    A产生的数据直接发给B,中间不落盘,之间走到内存,内存发给B,然后直接释放

流批一体的Shuffle Service层:

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

Shuffle不同实现:基于文件的Pull Based Shuffle、基于Pipeline的Push Based Shuffle

流和批Shuffle之间的差异:

  • Shuffle数据的生命周期
  • Shuffle数据存储介质
  • Shuffle的部署方式

Flink流批一体总结: 经过相应的改造和优化之后,Flink在架构设计上,针对DataStream层、调度层、Shuffle Service层,均完成了对流和批的支持

3. Flink架构优化

流/批/OLAP业务场景概述

三种业务场景的特点 1.jpg

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

  • 批式计算是流式计算的特例
  • OLAP计算是一种特殊的批式计算

Flink OLAP 架构现状

1.jpg

  1. Client:提交 SQL Query
  2. Gateway:接收 Client 提交的 SQL Query,对 SQL 进行语法解析和查询优化,生成 Flink 作业执行计划,提交给 Session 集群
  3. Session Cluster:执行作业调度及计算,并返回结果
  • 架构和功能模块:
  1. JobManager与Resource在一个进程内启动,无法对JobManager进行水平扩展
  2. Gateway与Flink Session Cluster互相独立,无法进行统一管理
  • 作业管理及部署模块:
  1. JobManager处理和调度作业时,负责的功能比较多,导致单作业处理时间长、并占用了过多的内存
  2. TaskManager部署计算任务时,任务初始化部分耗时严重,消耗大量CPU

4. Flink精选案例讲解

电商流批一体实践

字节Flink OLAP实践