Flink学习 | 青训营笔记

207 阅读9分钟

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

本节课程主要分为 4 个方面:

  1. Flink的诞生背景和概述:为什么会有流式计算的需求,为什么flink会脱颖而出

  2. Flink整体架构:flink作业如何调度和运行起来,如何做到流批一体

  3. Flink架构优化:流/批/OLAP三种业务场景概述,Flink如何支持OLAP场景需求,做哪些架构上的优化

  4. 精选案例讲解

1.Flink概述

大数据:无法在一定时间内用常规工具对其进行获取,存储,管理和处理的数据集合。

Apache Flink诞生背景

大数据计算架构发展历史

image.png

史前阶段:在业内面临随着数据规模的扩大,传统的解决方案无法解决问题时,google发表了三篇论文:分布式文件系统gfs;分布式计算框架map-reduce;big-table。

为什么需要流式计算?

大数据的实时性带来的价值更大。

批式计算vs流式计算:

image.png

批式计算将数据划分为一批一批,每次使用一批数据计算;

流式计算将数据看成一个数据流,类似数据从管道中源源不断的传递计算。

image.png

why Flink?

Flink可以处理有边界的课无边界的数据流,

Flink是有状态的计算,它可以恢复之前Flink的状态

支持Dataflow编程模型

Flink开源生态

计算框架 Flink对业内主要的数据存储引擎做了很好的集成,

image.png

Flink可以很好的部署在物理机,虚拟机和大数据框架上

2.Flink整体架构

内容概述

2.1 Flink分层架构
    Flink各个模块的用途
2.2 Flink总体架构
    Master/Slave架构,JobManager/TaskManager
2.3 Flink作业示例
    作业在Flink中处理流程,DataFlow Model设计思想
2.4 Flink如何做到流批一体
 
 

2.1 Flink分层架构

image.png

SDK层:为了支持几种使用场景

执行引擎层:执行引擎层提供了统一的DAG,用来描述数据处理的Pipeline,不管是流还是批,都会转化为DAG,调度成再把DAG转化为分布式环境下的Task,Task之间通过shffle传数据,进行交互。

状态存储层:负责存储算子的状态信息。

image.png

image.png

  • SQL & Table API:Flink 支持两种关系型的 API,Table API 和 SQL。这两个 API 都是批处理和流处理统一的 API,这意味着在无边界的实时数据流和有边界的历史记录数据流上,关系型 API 会以相同的语义执行查询,并产生相同的结果。Table API 和 SQL借助了 Apache Calcite 来进行查询的解析,校验以及优化。它们可以与 DataStream 和DataSet API 无缝集成,并支持用户自定义的标量函数,聚合函数以及表值函数。

  • DataStream API:DataStream API为许多通用的流处理操作提供了处理原语。这些操作包括窗口、逐条记录的转换操作,在处理事件时进行外部数据库查询等。DataStream API 支持 Java 和Scala 语言,预先定义了例如 map()、reduce()、aggregate() 等函数。你可以通过扩展实现预定义接口或使用 Java、Scala 的 lambda 表达式实现自定义的函数。

  • DataSet API:DataSet API 是 Flink 用于批处理应用程序的核心 API。DataSet API 所提供的基础算子包括 map、reduce、(outer) join、co-group、iterate 等。所有算子都有相应的算法和数据结构支持,对内存中的序列化数据进行操作。如果数据大小超过预留内存,则过量数据将存储到磁盘。Flink 的 DataSet API 的数据处理算法借鉴了传统数据库算法的实现,例如混合散列连接(hybrid hash-join)和外部归并排序(external merge-sort)。

  • StateFul Stream Processing:最低级抽象只提供有状态流,通过Process Function嵌入到DataStream API中,它允许用户自由处理来自一个或者多个流的时间,并使用一致的容错状态,此外用户可以注册event time和processing time回调,允许程序实现复杂的计算。

2.2 Flink整体架构

  • JobClient:负责接收程序,解析和优化程序的执行计划,然后提交执行计划到JobManager。这里执行的程序优化是将相邻的Operator融合,形成Operator Chain,Operator的融合可以减少task的数量,提高TaskManager的资源利用率。正如第一天学习的sql优化。

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

  • TaskManager:负责执行一个DataFlow Graph的各个task以及data streams的buffer和数据交换。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的组成的。

image.png

首先在,在client端进行业务信息提交,提交给JM,JM将DAG信息转化为一个物理执行图分发到对应的节点执行。

image.png

2.3 Flink作业示例

为了更加高效的分布式执行,Flink会尽可能地将不同的operator链接在一起形成Task。

2.3 Flink如何做到流批一体

image.png

为什么需要流批一体?

  • 一些业务场景,除了实时的数据统计需求,为了确认运营或产品的效果,用户同时还需要和历史数据做比较,比如,抖音一些直播数据的统计;

image.png

这种架构有一些痛点:

  • 人力成本比较高:批、流两套系统,相同逻辑需要开发两遍;
  • 数据链路冗余:本身计算内容是一致的,由于是两套链路,相同逻辑需要运行两遍,产生一定的资源浪费;
  • 数据口径不一致:两套系统、两套算子、两套 UDF,通常会产生不同程度的误差,这些误差会给业务方带来非常大的困扰。

为什么可以做流批一体?

  • 批式数据是一种有节数据集,记作A;流式数据是一种无界限数据集,记作B;根据假设,A属于B,是否可以用B表示A? A=BAA = B - A^{-}

image.png

流批一体的挑战

Flink如何做流批一体

image.png

流批一体的Scheduler层

1.12版本前,Flink支持两种调度:

eager:要调度一个作业,必须要作业的所需要的全部资源就绪
lazy:先调度DAG上游,释放掉上游使用的资源用来调度下游

流批一体的Shuffle Service层

pipeline region:根据做task之间的数据交换是否是blocking模式来划分 其中blockong:人物之间数据不是立即传递,中间会进行存储磁盘。

shuffle:在分布式计算中,用来连接上下哟数据交互的过程

针对不同的分布式计算框架,Shuffle通常由几种不同的实现

流和批的Shuffle之间也有差异

Flink架构优化

要支持OLAP场景,需要哪些优化

内容概述:

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

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

3.Flink 如何支持 OLAP 场景

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

OLAP 交互式分析

image.png

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

OLAP计算是一种特殊的批式计算

3.Flink 如何支持 OLAP 场景

OLAP场景需求:高并发的支持,极致处理性能。
  • Flink做OLAP有优势

image.png

  • Flink OLAP 架构现状

    • Client:提交 SQL Query;

    • Gateway:接收 Client 提交的 SQL Query,对 SQL 进行语法解析和查询优化,生成 Flink 作业执行计划,提交给 Session 集群;

    • Session Cluster:执行作业调度及计算,并返回结果。

      • JobManager 管理作业的执行,在接收到 Gateway 提交过来的作业逻辑执行计划后,将逻辑执行计划转换为物理执行计划,为每个物理计算任务分配资源,将每个计算任务分发给不同的 TaskManager 执行,同时管理作业以及每个计算任务执行状态;
      • TaskManager执行具体的计算任务,采用线程模型,为每个计算任务创建计算线程,根据计算任务的上下游数据依赖关系跟上游计算任务建立/复用网络连接,向上游计算任务发送数据请求,并处理上游分发给它的数据。

  • Flink做OLAP的挑战

image.png

  • 字节Flink OLAP 实践

场景应用主要在HTAP场景

总结

1.学习了Flink的概念,Flink的整体架构:包括分层架构和总体架构,以及基本流程,从client接受任务信息,通过JM将DAG转化为物理执行图传递给TM具体执行任务。

2.了解了批式计算和流式计算相关概念,了解了流批一体的重要性。

3.学习了Flink的架构优化,包括流批一体,支持OALP

标题:Flink学习| 青训营笔记

网址:juejin.cn/