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

145 阅读4分钟

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

一、Flink概述

1.1 Apache Flink的诞生背景

  • 什么是大数据 指无法在一定时间内用常规软件工具对其进行获取、储存、管理和处理的数据集合。
  • 大数据计算架构发展历史 image.png
  • 为什么需要流式计算 大数据的实时性带来价值更大,比如:监控场景、金融风控、实时推荐,大数据实时性的需求带来了大数据计算架构模式的变化,从批式计算到流式计算。

1.2为什么Apache Flink会脱颖而出

  • 流式计算框架对比

image.png

  • Why flink

image.png

二、Flink整体架构

2.1 Flink分层架构

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

2.2 Flink总体架构

一个Flink集群,主要包含以下两个核心组件:

  1. JobManager (JM) :负责整个任务的协调工作,包括:调度task、 触发协调Task做Checkpoint、协调容错恢复等;

image.png

  • Dispatcher:接收作业,拉起JobManager来执行作业,并在JobMaster挂掉之后恢复作业;
  • JobMaster:管理个 job的整个生命周期,会向ResourceManager申请slot,并将task调度到对应TM上;
  • ResourceManager:负责slot资源的管理和调度,Task manager拉起之后会向RM注册;
  1. TaskManager (TM) :负责执行一个DataFlowGraph的各个task以及data streams的buffer和数据交换。

2.3 Flink作业示例

流式的WordCount示例,从kafka中读取一个实时数据流, 每10s统计一次单词出现次数, DataStream 实现代码如下:

DataStream<String> lines = env.addSource 
                               new FlinkKa fkaConsumer<>...)) ;
DataStream<Event> events = lines .map((line) -> parse (1ine));
DataStream<Statistics> stats = events
    .keyBy (event->event.id)
    .timeWindow (Time.seconds(10) )
    .apply(new MyWi ndowAggregationFunction()) ;
    
stats.addsink (new BucketingSink(path)) ;

image.png

image.png

image.png

image.png

2.4 Flink如何做到流批一体

  • 为什么需要流批一体 举个例子:

1.在抖音中,实时统计一个短视频的播放量、点赞数,也包括抖音直播间的实时观看人数等;

2.在抖音中,按天统计创造者的一些数据信息,比如昨天的播放量有多少、评论量多少、广告收入多少;

上述架构有一些痛点:

1.人力成本比较高:批、流两套系统,相同逻辑需要开发两遍;

2.数据链路冗余:本身计算内容是致的, 由于是两套链路,相同逻辑需要运行两遍,产生一 定的资源浪费;

3.数据口径不一致:两套系统、两套算子、两套UDF,通常会产生不同程度的误差,这些误差 会给业务方带来非常大的困扰。

  • 流批一体的挑战

image.png

image.png

  • Flink如何做到流批一体
  1. 批式计算是流式计算的特例,Everything is Streams,有界数据集(批式数据)也是种数据流、 一种特殊的数据流。因此,理论上我们是可以用一套引擎架构来解决上述两种场景,只不过需要对不同场景支持相应的扩展性、并允许做不同的优化策略。

  2. 站在Flink的角度,Everything is Streams, 无边界数据集是种数据流,一个无边界的数据流可以按时间切段成一个个有边界的数据集,所以有界数据集(批式数据)也是种数据流。因此,不管是有边界的数据集(批式数据)还是无边界数据集,Flink 都可以天然地支持,这是Flink支持流批一体的基础。并且Flink在流批一体上,从上面的API到底层的处理机制都是统一的,是真正意义上的流批一体。

三、Flink架构优化

3.1流、批、OLAP业务场景概述

在实际生产环境中,针对不同的应用场景,我们对数据处理的要求是不同的:

1.有些场景下,只需离线处理数据,对实时性要求不高,但要求系统吞吐率高,典型的应用是搜索引擎构建索引;

2.有些场景下,需对数据进行实时分析,要求每条数据处理延迟尽可能低,典型的应用是广告推荐、金融风控场景。

举个例子:

1.在抖音中,实时统计一个短视频的播放量、点赞数,也包括抖音直播间的实时观看,人数等;

2.在抖音中,按天统计创造者的些数据信息,比如昨天的播放量有多少、评论量多少、广告收入多少;

3.在抖音的一些推广活动中,运营同学需要对一些实时产出的结果数据做一些实时多维分析, 来帮助后 面活动的决策。

三种业务场景的特点对比如下表:

image.png

三种业务场景的解决方案的要求及带来的挑战是:

image.png

3.2 Flink如何支持OLAP场景

  • Flink做OLAP的优势

image.png

  • Flink OLAP架构现状

image.png

  • Flink 在OLAP架构的问题与设想

image.png

image.png

image.png

image.png

image.png