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

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

一、Flink概述

Apache Flink的背景

  • 大数据的实时性带来的价值更大:监控场景、金融风控、实时推荐
  • 实时性需求带来了大数据技术框架的改变:批式处理变为流式处理

Flink为什么能脱颖而出

  • 业内对大数据实时性产生了巨大的需求
  • Dataflow编程模型对流计算起到了重大影响。

RJ_6WY_2J7_CJTGWOU~TN4W.png


二、Flink整体架构

1.Flink的分层架构

  • SDK层:SQL/Table、DataStream、Python;
  • 执行引擎层:提供了统一的DAG,用来描述数据处理的Pipline,不管是流还是批,都会转换为DAG图,调度层再把DAG转换为分布式环境下的Task,Task通过Shuffle传输数据。
  • 状态存储层:负责存储算子的状态信息
  • 资源调度层:Flink可以部署在多种环境

2.Flink整体架构

俩个核心组件:

  • 1.JobManager:负责整个任务的协调工作
  • 2.TaskManager:负责执行DataFlow Graph的各个task以及data streams的buffer和数据交换。

3.Flink作业示例

lines=env.addSource(new FlinkKafkaConsumer<>(...)) #指定数据源
events=lines.map((line)->parse(line)); #拆解数据
stats=events.keyBy.... #处理数据
stats.addSink(new BucketingSink(path));  #输出数据

4.Flink如何做到流批一体

为什么需要流批一体

  • 短视频的实施播放、点赞数;
  • 抖音的播放量、收入、评论量

流批一体的挑战

  • 流式计算:无限数据集、低延迟,业务会感觉到
  • 批式计算:有限数据集、实时性要求不高,只关注产出时间

Flink如何做到流批一体

可以用一套数据框架解决流批数据处理。把批式数据看作一种特殊的steam。 不管是有边界数据流还是有边界数据集,Flink都可以支持。


流批一体的Scheduler层

**负责将DAG转换为Task**

Flink支持两种调度模式:

  • EAGER:申请一个作业所需的全部资源,同时调度全部Task,Task之间采用Pipeline方式通信。
  • LAZY:先调度上有,等上游产生数据或结束后在调度下游,类似Spark的Stage模式。

最新调度机制:

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


流批一体的Shuffle Service层

Shuffle:在分别是计算中,用来连接上下游数据交互的过程。
Flink的目标是提供统一的Shuffle框架。


三、Flink架构优化

1.流/批/OLAP业务场景概述

OLAP:在做推广活动时,运营需要对一些产出的数据实时多维数据分析,为以后活动做策略。要求高并发,延迟在秒级。


2.为什么三种场景可以用一套引擎解决

OLAP可以看作批式计算的特例。
特点:短查询,高并发,极致处理性能


3.Flink的OLAP的优化之路

Flink做OLAP的优势

引擎统一、既有优势、生态支持


Flink OLAP场景的挑战

  • 秒级和毫秒级小作业
  • 作业频繁的启停,资源碎片
  • Latency+QPS的要求

Flink在OLAP架构的问题与设想

架构与功能模块:

  • JobManager与ResourceManager在一个进程内启动,无法对JobManager进行水平扩展
  • Gateway与Flink Session Cluster互相独立,无法进行统一管理。

作业管理及部署模块:

  • JobManager处理和调度作业时,负责的功能比较多,导致单作业处理时间长、并占用了过多的内存
  • TaskManager部署计算任务时,任务初始化部分耗时严重,消耗大量CPU

资源管理及计算任务调度:

  • 资源申请及资源释放流程链路过长
  • Slot作为资源管理单元,JM管理slot资源,导致JM无法感知到TM维度的资源分布,使得资源管理完全依赖于ResourceManager