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

106 阅读4分钟

这是我参与「第四届青训营 -大数据场」笔记创作活动的第3篇笔记

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

Apache Flink

流式计算引擎对比

image.png

Exactly-once:精确一次的计算语义

Flink是基于有界数据集和无界数据集之上有状态计算的分布式处理框架,既可以处理流数据也可以处理批数据(流批一体)

DataFlow编程模型

Flink分层

image.png

  1. SDK层:有三类,SQL/Table、DataStream、Python
  2. Runtime层:执行引擎层,提供统一的DAG,用来描述数据处理的Pipeline,不管是流还是批,都会转化为DAG图,调度层再把DAG转化成分布式环境下的Task,Task之间通过Shuffle传输数据
  3. 状态存储层:负责存储算子的状态信息
  4. 资源调度层:目前Flink可以支持部署在多种环境

Flink整体结构

两个核心组件

  1. JobManager(JM):负责整个任务的协调工作,包括:调度task、触发协调task做Checkpoint、协调容错恢复等
  2. TaskManager(TM):负责执行一个DataFlow Graph的各个task以及data streams的buffer和数据交换

Flink Program 中 Client(客户端),业务逻辑首先在Client处理,Client处理后的信息提交给JM,JM把DAG转化为一个真正的物理的执行图,分发到worker节点执行

JobManager

image.png

  1. Dispatcher:接收作业,拉起JobManager来执行作业,并在JobMaster挂掉之后恢复作业
  2. JobMaster:管理一个job的整个生命周期,会向ResourceManager申请slot,并将task调度到对应TM上
  3. ResourceManager:负责slot资源的管理和调度,Task manager拉起之后会向RM注册

TaskManager

执行作业流的task,并且缓存和交换数据流。在TaskManager中资源调度的最小单位是task slot。TaskManager中task slot的数量表示并发处理task的数量。

启动之后,TaskManager会向资源管理器注册它的slots,收到资源管理器的指令后,TaskManager就会将一个或者多个槽位提供给JobMaster就可以分配任务来执行。

在执行过程中,TaskManager可以缓冲数据,还可以跟其他运行同一应用的TaskManager交换数据。

实现流批一体

批式计算和流式计算的区别

image.png

站在Flink的角度,Everything is Streams,无边界数据集是一种数据流,一个无边界的数据流可以按时间切段成一个个有边界的数据集,所以有界数据集(批式数据)也是一种数据流

Flink利用一下内容实现流批一体

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

Scheduler层

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

最新FLink调度机制

image.png

由Pipeline的数据交换连接的Task构成为一个Pipeline Region

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

Shuffle Service层

Shuffle:在分布式计算中,用来连接上下游数据交互的过程叫做Shuffle

实际上,分布式计算中所涉及到上下游衔接的过程,都可以理解为Shuffle

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

流和批 Shuffle之间的差异

  1. Shuffle数据的生命周期:流作业的Shuffle数据与Task是绑定的,而批作业的Shuffle数据与task是解耦的
  2. Shuffle数据存储介质:流作业的生命周期比较短而且流作业为了实时性,Shuffle通常存储在内存中,批作业因为数据量比较大以及容错的需求,一般存储在磁盘里
  3. Shuffle的部署方式:流作业Shuffle服务和计算节点部署在一起,可以减少网络开销,从而减少latency,而批作业则不同