流/批/OLAP 一体的 Flink 引擎介绍 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第3天
Flink概述
对实时性的要求,流式计算的需求,诞生了Flink。 Spark批处理,离线计算,Spark Streaming流处理,类似分治。
native:一条一条处理 mini-batch:少量内容的批处理
流式计算框架: Storm Native:数据至少处理一次/最多处理一次、低延迟(毫秒级)、Low、ACK、不支持状态处理、支持SQL Spark Streaming mini-batch:数据处理一次、延迟较高(秒级)、High、RDD Based Checkpoint、状态处理、支持SQL Flink Native:数据处理一次、低延迟(毫秒级)、High、Checkpoint、状态处理、支持SQL
Flink :精确一次的计算语义、容错状态、checkpoint、Dataflow编程模型、流批一体
Flink整体框架
Flink分层框架
- SDK三类:SQL/Table、DataStream、pyFlink
- 执行引擎层(Runtime 层):提供统一的DAG用来描述数据处理的Pipeline、不管是流还是批都会转化为DAG图,调度层把DAG转化成分布式环境下的Task,Task之间通过Shuffle传输数据。
- 状态存储层:负责存储算子的状态信息
- 资源调度层:支持部署在多中环境中
Flink整体架构
JobManager(Master):任务协调工作。dispatcher接受作业拉起Jobmanager执行作业,并在jobmanager挂掉后恢复作业。Jobmaster管理一个job的生命周期,会向resourcemanager申请slot并将task调度到TM上。resourcemanager负责slot资源管理和调度,TM拉起后会向RM注册。
TaskManager(Worker ):执行Dataflow Graph的task以及数据交换,包含多个slot,每个;slot单独线程执行。
Flink示例
从Kafka中读取一个实时数据流,每10s统计一次单词出现的次数
DataStream<String> lines = env.addSource(new FlinkKafkaConsumer<>(...)); //Flink的环境变量申请(source) DataStream<Event> events = lines.map((line) -> parse(line)); //Transformation DataStream<Statistics> stats = events .keyBy(event -> evnet.id) .timeWindow(Time.seconds(10)) .apply(new MyWindowAggregationFunction()); stats.addSink(new BucketingSink(path)); //Sink
Flink流批一体
实时数仓 流式计算无限数据集,低延迟 批式计算有限数据集,实时性不高
shuffle:上下游传输的数据,形式:基于文件或者基于Pipeline
Flink架构优化
OLAP场景:交互式分析OLAP,高并发查询
Flink OLAP架构: client:提交SQL Query Gateway:接收Client的提交的SQL Query,对SQL进行解析,查询优化,生成Flink作业执行计划,提交给Session集群 Session Cluster:执行作业调度及计算,并返回结果
Flink OLAP架构的问题和设想:
-
JM和ResourceManager在一个进程中启动,无法对JM做水平扩展
-
Gateway与Flink Session Cluster互相独立,无法统一管理
-
JM调度时负责功能多,占用时间长,内存占用过多
-
TM任务初始化部分耗时严重,消耗大量CPU
-
资源申请链路长
-
SLot作为资源管理单元,JM管理Slot资源,导致JM无法感知TM维度的资源分布,使得资源管理完全依赖ResourceManager
-
作业与心跳机制不符合毫秒级、秒级场景
-
AP使用Batch算子,算子初始化耗时
Flink的案例
-
电商业务
-
Flink OLAP