这是我参与「第四届青训营 」笔记创作活动的第2天。
今日内容:#流/批/OLAP一体 Flink引擎
一、课前预习
1.谷歌“三驾马车”
分别为分布式文件系统 GFS、MapReduce 和 BigTable.
2.Apache Flink
· Flink核心是一个流式的数据流执行引擎,并且能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用。其针对数据流的分布式计算提供了数据分布,数据通信及容错机制等功能。基于流执行引擎,Flink提供了跟多高抽象层的API便于用户编写分布式任务.
Flink 架构的概念
· JobClient:负责接收程序,解析和优化程序的执行计划,然后提交执行计划到JobManager。这里执行的程序优化是将相邻的Operator融合,形成Operator Chain,Operator的融合可以减少task的数量,提高TaskManager的资源利用率。为了了解Flink的解析过程,需要简单介绍一下Flink的Operator,在Flink主要有三类Operator:
- Source Operator :数据来源操作,比如文件、socket、kafka等,一般存在于程序的最开始
- Transformation Operator: 数据转换,map,flatMap,reduce等算子都属于Transformation Operator,
- 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.流式计算与批式计算
二、课中笔记
1.Flink概述
1.1诞生背景
为何流行?大数据(整体价值、海量、快速、多样)
计算架构发展史
Flink实时性更好,实时性就是价值:带来批式计算到流式计算的变化。
1.2Flink为何脱颖而出
三者对比
Mini-batch微批
Flink特性
1.3阿帕奇flink开源生态
2.Flink整体架构
2.1分层架构
1) SDK 三类(sql/table,datasteam,py)
2) 执行引擎(提供统一DAG,转化为task,用shuffle传输)
3) 状态存储层
4) 资源调度层
2.2Flink整体架构
Flink包含JM(Jobmanager)&TM(Taskmanager)十分重要。
JM:任务协调,调度、协调task做checkpoint、协调容错恢复。
TM:task、数据交换
在Flink中三个组件:
1) Dispatcher
2) JobMaster
3) ResourceManager
2.3Flink作业示例
流式WordCount(统计单词出现次数)
Client将用户代码抽象为逻辑执行图----GM
GM转换为物理执行图,并且调度Task到worker节点执行
Flink尽量将不同operator ,chain在一起。
OperatorChain,使得每个Task在一个线程中执行。
Task被调度到具体taskmanager中的slot(在tm中代表一个单独线程)执行,每个slot运行同一个task的subtask.
2.4如何流批一体
Why need? 人们需要实时统计播放量、观看数,也需要按天统计。
问题:
1) 人力成本高,两套系统走两遍
2) 数据链路冗余,计算内容一致运行两次
3) 数据口径不一致
流/批分别特点:
How如何做到的?
1) 两套化为一套(everything is stream/批是特殊的流)
2) 以下模块:
Sql层
DataSteam
Scheduler layer
将作业DAG转化为Task(适用分布式环境)
Task采用pipeline通信
调度模式:(EAGER-Steam/LAZY-Batch)
Lazy最小调度一个task即可
“介于二者之间的piplinne region”
Blocking模式(需要落盘)分成多个Pipeline region(不落)
PIPELINE模式(不需)1个Pipeline region
Shuffle Service layer
Shuffle:连接上下游数据交互
Shuffile两种实现:基于文件-容错稳定/Pipeline-低延迟高性能
针对流/批不同Shuffle:
生命周期(数据绑定/解耦)
存储介质(内存/磁盘)
部署方式(和计算节点部署在一起/不在一起)
Flink支持的Shuffle:Netty/Remote
3.Flink架构优化
三种业务场景
Olap:红包雨 ,经验做决策
Flink做OLAP优势:
挑战:
4.实践
4.1电商
离线/实时数仓,两套路径,运维压力。目标:统一,提高效率。
4.2Flink OLAP
HTAP场景
Flink:AP query
使用HTAP的前后对比图