流/批/OLAP/Flink | 青训营笔记

86 阅读5分钟

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

今日内容:#流/批/OLAP一体 Flink引擎

一、课前预习

1.谷歌“三驾马车”

分别为分布式文件系统 GFS、MapReduce 和 BigTable.

image.png

image.png

image.png

2.Apache Flink

·       Flink核心是一个流式的数据流执行引擎,并且能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用。其针对数据流的分布式计算提供了数据分布,数据通信及容错机制等功能。基于流执行引擎,Flink提供了跟多高抽象层的API便于用户编写分布式任务.

Flink 架构的概念

image.png

·  JobClient:负责接收程序,解析和优化程序的执行计划,然后提交执行计划到JobManager。这里执行的程序优化是将相邻的Operator融合,形成Operator Chain,Operator的融合可以减少task的数量,提高TaskManager的资源利用率。为了了解Flink的解析过程,需要简单介绍一下Flink的Operator,在Flink主要有三类Operator

  1. Source Operator数据来源操作,比如文件、socket、kafka等,一般存在于程序的最开始
  2. Transformation Operator数据转换,map,flatMap,reduce等算子都属于Transformation Operator,
  3. Sink Operator:数据落地,数据存储的过程,放在Job最后,比如数据落地到Hdfs、Mysql、Kafka等等。

·  JobManagers负责申请资源,协调以及控制整个job的执行过程,具体包括,调度任务、处理checkpoint、容错等等。

·  TaskManager:TaskManager运行在不同节点上的JVM进程,负责接收并执行JobManager发送的task,并且与JobManager通信,反馈任务状态信息,如果说JobManager是master的话,那么TaskManager就是worker用于执行任务。每个TaskManager像是一个容器,包含一个或者多个Slot。

·  Slot:Slot是TaskManager资源粒度的划分,每个Slot都有自己独立的内存。所有Slot平均分配TaskManager的内存,值得注意的是,Slot仅划分内存,不涉及CPU的划分,即CPU是共享使用。每个Slot可以运行多个task。Slot的个数就代表了一个程序的最高并行度。

·  Task:Task是在operators的subtask进行链化之后形成的,具体Flink job中有多少task和operator的并行度和链化的策略有关。

·  SubTask:因为Flink是分布式部署的,程序中的每个算子,在实际执行中被分隔为一个或者多个subtask,运算符子任务(subtask)的数量是该特定运算符的并行度。数据流在算子之间流动,就对应到SubTask之间的数据传输。Flink允许同一个job中来自不同task的subtask可以共享同一个slot。每个slot可以执行一个并行的pipeline。可以将pipeline看作是多个subtask的组成的。

3.流式计算与批式计算

image.png

二、课中笔记

1.Flink概述

1.1诞生背景

为何流行?大数据(整体价值、海量、快速、多样)

计算架构发展史

image.png Flink实时性更好,实时性就是价值:带来批式计算到流式计算的变化。

1.2Flink为何脱颖而出

三者对比

image.png Mini-batch微批

Flink特性 image.png

1.3阿帕奇flink开源生态

image.png

2.Flink整体架构

2.1分层架构

1)     SDK 三类(sql/table,datasteam,py)

2)     执行引擎(提供统一DAG,转化为task,用shuffle传输)

3)     状态存储层

4)     资源调度层

image.png

2.2Flink整体架构

Flink包含JM(Jobmanager)&TM(Taskmanager)十分重要。

JM:任务协调,调度、协调task做checkpoint、协调容错恢复。

TM:task、数据交换

在Flink中三个组件:

1)     Dispatcher

2)     JobMaster

3)     ResourceManager

image.png

2.3Flink作业示例

流式WordCount(统计单词出现次数)

image.png Client将用户代码抽象为逻辑执行图----GM

GM转换为物理执行图,并且调度Task到worker节点执行

Flink尽量将不同operator ,chain在一起。

OperatorChain,使得每个Task在一个线程中执行。

Task被调度到具体taskmanager中的slot(在tm中代表一个单独线程)执行,每个slot运行同一个task的subtask.

2.4如何流批一体

Why need? 人们需要实时统计播放量、观看数,也需要按天统计。

image.png

问题:

1)     人力成本高,两套系统走两遍

2)     数据链路冗余,计算内容一致运行两次

3)     数据口径不一致

流/批分别特点:

image.png

image.png

How如何做到的?

1)     两套化为一套(everything is stream/批是特殊的流)

2)     以下模块:

Sql层

DataSteam

Scheduler layer

将作业DAG转化为Task(适用分布式环境)

Task采用pipeline通信

调度模式:(EAGER-Steam/LAZY-Batch)

Lazy最小调度一个task即可

“介于二者之间的piplinne region”

image.png

Blocking模式(需要落盘)分成多个Pipeline region(不落)

PIPELINE模式(不需)1个Pipeline region

 

Shuffle Service layer

Shuffle:连接上下游数据交互

Shuffile两种实现:基于文件-容错稳定/Pipeline-低延迟高性能

针对流/批不同Shuffle:

生命周期(数据绑定/解耦)

存储介质(内存/磁盘)

部署方式(和计算节点部署在一起/不在一起)

Flink支持的Shuffle:Netty/Remote

3.Flink架构优化

三种业务场景

Olap:红包雨 ,经验做决策

image.png Flink做OLAP优势:

image.png 挑战:

image.png

image.png

4.实践

4.1电商

离线/实时数仓,两套路径,运维压力。目标:统一,提高效率。

image.png

image.png

4.2Flink OLAP

HTAP场景

Flink:AP query

使用HTAP的前后对比图

image.png