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

119 阅读3分钟

流/批/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