这是我参与「第四届青训营 -大数据场」笔记创作活动的第3篇笔记
本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
Apache Flink
流式计算引擎对比
Exactly-once:精确一次的计算语义
Flink是基于有界数据集和无界数据集之上有状态计算的分布式处理框架,既可以处理流数据也可以处理批数据(流批一体)
DataFlow编程模型
Flink分层
- SDK层:有三类,SQL/Table、DataStream、Python
- Runtime层:执行引擎层,提供统一的DAG,用来描述数据处理的Pipeline,不管是流还是批,都会转化为DAG图,调度层再把DAG转化成分布式环境下的Task,Task之间通过Shuffle传输数据
- 状态存储层:负责存储算子的状态信息
- 资源调度层:目前Flink可以支持部署在多种环境
Flink整体结构
两个核心组件
- JobManager(JM):负责整个任务的协调工作,包括:调度task、触发协调task做Checkpoint、协调容错恢复等
- TaskManager(TM):负责执行一个DataFlow Graph的各个task以及data streams的buffer和数据交换
Flink Program 中 Client(客户端),业务逻辑首先在Client处理,Client处理后的信息提交给JM,JM把DAG转化为一个真正的物理的执行图,分发到worker节点执行
JobManager
- Dispatcher:接收作业,拉起JobManager来执行作业,并在JobMaster挂掉之后恢复作业
- JobMaster:管理一个job的整个生命周期,会向ResourceManager申请slot,并将task调度到对应TM上
- ResourceManager:负责slot资源的管理和调度,Task manager拉起之后会向RM注册
TaskManager
执行作业流的task,并且缓存和交换数据流。在TaskManager中资源调度的最小单位是task slot。TaskManager中task slot的数量表示并发处理task的数量。
启动之后,TaskManager会向资源管理器注册它的slots,收到资源管理器的指令后,TaskManager就会将一个或者多个槽位提供给JobMaster就可以分配任务来执行。
在执行过程中,TaskManager可以缓冲数据,还可以跟其他运行同一应用的TaskManager交换数据。
实现流批一体
批式计算和流式计算的区别
站在Flink的角度,Everything is Streams,无边界数据集是一种数据流,一个无边界的数据流可以按时间切段成一个个有边界的数据集,所以有界数据集(批式数据)也是一种数据流
Flink利用一下内容实现流批一体
- SQL层
- DataStream API层统一,批和流都可以使用DataStream API 来开发
- Scheduler 层架构统一,支持流批场景
- Failover Recovery 层架构统一,支持流批场景
- Shuffle Service 层架构统一,流批场景选择不同的Shuffle Service
Scheduler层
Scheduler主要负责将作业的DAG转化为在分布式环境中可以执行的Task
最新FLink调度机制
由Pipeline的数据交换连接的Task构成为一个Pipeline Region
本质上,不管是流作业还是批作业,都是按照Pipeline Region粒度来申请资源和调度任务
Shuffle Service层
Shuffle:在分布式计算中,用来连接上下游数据交互的过程叫做Shuffle
实际上,分布式计算中所涉及到上下游衔接的过程,都可以理解为Shuffle
- 基于文件的Pull Based Shuffle:比如Spark和MR,它的特点式具有较高的容错性,适合较大规模的批处理作业,由于是基于文件的,它的容错性和稳定性会更好一些
- 基于Pipeline的Push Based Shuffle:比如Flink,Storm,Presto等,它的特点是低延迟和高性能,但是因为shuffle数据没有存储下来,如果是batch任务的话,就需要进行重跑恢复
流和批 Shuffle之间的差异
- Shuffle数据的生命周期:流作业的Shuffle数据与Task是绑定的,而批作业的Shuffle数据与task是解耦的
- Shuffle数据存储介质:流作业的生命周期比较短而且流作业为了实时性,Shuffle通常存储在内存中,批作业因为数据量比较大以及容错的需求,一般存储在磁盘里
- Shuffle的部署方式:流作业Shuffle服务和计算节点部署在一起,可以减少网络开销,从而减少latency,而批作业则不同