14

Apache Flink 学习0-1知识点全景图.xmind

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzI0NTIxNzE1Ng%3D%3D&%3Bmid=2651220814&%3Bidx=1&%3Bsn=9988befe2644a6d20244638aaff834b7
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

am6BJnr.gif!mobile

vIRjYnE.jpg!mobile

Flink全景图

aMfUJzE.png!mobile

实时处理框架

Strom

  • Strom是第一代实时处理框架,基于流处理,数据吞吐量和延迟上效果不理想,只支持at least once和at most once,不能保证精确一次性,在数据准确性上存在不足

SparkStreaming

  • 第二代实时处理框架,基于mini-batch思想,每次处理一小批数据,一小批数据包含多个事件,以接近事实处理效果,概况性来说是微批次、准实时

Flink

  • 第三代实时处理框架,支持有界和无界数据流上做有状态计算,以时间为单位,支持exactly once,数据的准确性得到提高,相比Strom,吞吐量更高,延迟更低,相比SparkStreaming,Flink是真正意义上的实时计算,所需计算资源更少

Flink简介

Flink是什么

  • Flink官网

  • Apache Flink是一个框架和分布式处理引擎,用于在无边界和有边界

    数据流上进行有状态的计算

    • 无界流 有定义流的开始,没有定义流的结束,会无休止的产生数据,数据摄取后需要被立刻处理,因为输入时无限的,不能等待所有数据都到达再进行处理,所以通常要求特定顺序摄取事件,如事件发生顺序

    • 有界流 有定义流的开始,也有定义流的结束,有界流可以在摄取所有数据后再进行计算,所有数据可以被排序,所以并不需要有序摄取,有界流处理通常被称为批处理

Flink的主要特点

  • 事件驱动

    • 时间语义

  • 基于流

  • 更好的状态控制

  • 分层API

    • Flink API分层

Flink的其他特点

  • 基于自身的状态一致性保障

  • 低延迟,每秒可以处理数百万个事件,毫秒级延迟

  • 提供常见存储系统的连接器:Kafka、Hdfs、Redis、ES、JDBC

  • 高可用,可动态扩展,高扩展,状态保存达到TB级别仍可以保持高吞吐、低延迟

  • 支持事件时间

  • 批流一体化,批是流的特例

Flink VS StreamString

  • Flink是真正的流处理,延迟在毫秒级,Spark Streaming是微批次,延迟在秒级

  • Flink可以处理事件时间,Spark Streaming只能处理机器时间,无法保证时间语义的准确性

  • Flink的检查点比Spark Streaming更加灵活,性能更高,SparkStreaming的检查点算法是在每个stage结束后才会保存检查点

  • Flink 易于实现端到端的一致性

  • 批处理上Spark更具有优势且社区完善,技术成熟

  • 性能对比

  • SQL支持

  • Flink未来

    • Flink1.11改进

    • 支持Hql将实时数据写入Hive

Flink运行环境

YARN

Mesos

k8s

裸机集群独立部署

Flink运行架构

运行组件

  • 分发器 Dispatcher

    • 接收用户提供的作业并新提交的作业启动一个新的JobManager

  • 资源管理器 ResourceManager

    • 负责资源的管理,整个Flink集群中只有一个RescouceManager

  • 作业管理器 JobManager

    • 负责管理作业的执行,协调所以任务的操作,一个Flink集群中有多个作业同时执行,每个作业都有自己的JobManager

  • 任务管理器 TaskManager

    • 负责执行具体的task任务,从JobManager处接收需要部署的task,接收任务数据并处理

任务提交流程

执行图

  • StreamGraph 逻辑流图

    • 根据提交的Stream API编写的代码生成最初的图,表示程序的拓扑结构

  • JobGraph 作业图

    • StreamGraph经过优化后生成了JobGraph,提交给JobManager,优化点为将多个符合条件的节点当做一个节点处理

  • ExceptionGraph 执行图

    • ExceptionGraph是JobGraph的并行化版本,是调度层最核心的数据结构

  • 物理执行图

    • JobManager根据ExceptionGraph对Job进行调度后,在各个TaskManager上部署task后形成的图

  • 执行图流程

并行度

  • 定义

    • 理论上一个算子的子任务个数称为并行度,生产过程中,一个流的并行度是所有算子中最大的并行度

  • 设定

flink任务提交

Flink API

Batch API

  • Environment

    • ExecutionEnvironment batchEnv = ExecutionEnvironment.getExecutionEnvironment();

  • Source

  • Transform

  • Sink

Stream API

  • Environment

    • StreamExecutionEnvironment streamEnv = StreamExecutionEnvironment.getExecutionEnvironment();

  • Source

    • streamEnv.readTextFile()

    • streamEnv.fromCollection()

    • 集合

    • 文件

    • Kafka

    • 自定义

  • Transform

    • map

    • flatMap

    • filter

    • keyBy

    • shuffle

    • split

    • select

    • connect

    • union

  • Sink

    • Kafka Sink

    • Redis Sink

    • Es Sink

    • 自定义Sink

Window API

  • ReduceFunction()

  • AggregateFunction()

  • windowFunction

  • ProcessWindowFunction()

  • trigger()

  • evitor()

  • allowedLateness()

  • sideOutputLateData()

  • getSideOutput()

Watermark API

ProcessFunction API

State APi

Table APi

Flink时间语义

Flink时间语义图形化展示

分类

  • Event Time 事件时间

    • 为什么要有Watermark

    • 图形解释

    • Watermark的本质

    • Watermark的传递

    • 流处理过程中由于网络、背压等原因可能导致产生乱序数据,避免乱序数据没有被计算,需要等待计算,为了处理这些乱序数据,在数据流中增加了标记,称为Watermark

    • 是一种衡量EventTime进展的机制,是一条特殊的数据记录,可以设定延迟触发

    • 保存上游分区Watermark,取最小广播到下游

    • Watermark

  • Process Time 执行操作算子的本地系统时间,和机器相关,模式是Process Time

  • Ingestion Time 数据进入Flink的时间

Flink状态管理

状态类型

  • 算子状态

    • 列表状态 Liststate

    • 联合列表状态 Union list state

    • 广播状态 Broadcast state

    • 针对特定算子的状态,作用范围为算子任务,对同一子任务是共享的

    • 定义

    • 分类

  • 键控状态

    • 声明一个键控状态

    • 读取状态

    • 对状态赋值

    • 清空状态

    • 值状态 Value state

    • 列表状态 List state

    • 映射状态 Map state

    • 聚合状态 Aggregate State

    • 根据输入数据流中定义的键key来维护和访问

    • 定义

    • 分类

    • 使用

状态后端

  • 定义

    • 状态的存储、访问、维护由一个可插入的组件决定,这个组件叫做状态后端

  • 作用

    • 本地状态的管理

    • 将检查点checkpoint写入到远程存储

  • 分类

    • 将所有状态序列化后,存入RocksDB中

    • 将checkpoint存储到持久化的文件系统中,对于本地状态和MemoryStateBackend一样存在TaskManager的JVM堆上

    • 特点:拥有内存级别的访问速度和更好的容错性

    • 内存级别的状态后端,将键控状态作为内存中的对象进行管理,将它们存储在TaskManager的JVM堆上,将checkpoint存储在JobManager的内存中

    • 特点:低延迟、快速,但不够稳定

    • MemoryStateBackend

    • FsStateBacked

    • RocksDBStateBackend

Flink状态一致性

基本含义

  • 有状态的流处理,算子或者键值保存自己的状态,所谓的状态一致性就是计算结果要准确,数据不会丢失也不重复计算,在遇到故障时可以恢复状态并保证恢复后的结果是完全正确的

主要组成

  • Flink内部容错机制

    • 定义

    • 作用

    • 提供自定义保存镜像的功能,创建保存点使用的算法和检查点完全相同,不能自动创建,需要手动创建

    • 有计划的创建保存点不仅可用于故障恢复,还可用于手动备份、版本迁移,暂定和重启应用

    • 定义

    • 作用

    • 特点

    • 执行原理

    • 执行步骤

    • 实现算法

    • 对所有任务的状态做保存,在这个时间点上是所有任务都恰好处理完一个相同的输入数据的时候

    • 在出现故障的情况下,保证Flink内部的状态一致性,是Flink故障恢复机制的核心

    • 可以保证Flink的exact-once,并且不需要牺牲性能

    • 异步分界线快照 ,所有任务的状态都会做一份快照,保存状态和数据计算异步执行,边保存状态边对数据进行计算,所有状态都完成JobManager会完成checkpoint的保存

    • 在执行Job时会定期保存状态的一致性检查点,如果故障产生,从最近的检查点恢复Job的状态并重新启动处理流程

    • 检查点保存

    • 出现故障

    • 重启应用

    • 从checkpoint中读取状态并将状态重置

    • 处理检查点到发生故障之间的所有数据

    • 并行的两个Source任务读取两个输入流

    • JobManager向每个source发送一个带有新检查点Id的信息,通过这种方式启动检查点

    • Source将状态写入检查点,状态后端在状态存入检查点后返回通知source任务,source任务向JobManager确认检查点wanc

    • barrier向下游传递,sum任务会等待所有输入分区的barrier到达,对于已经到达的分区,继续到达的数据会被缓存,未到达的分区,数据正常处理

    • sum任务收到所有输入分区的barrier后会将任务状态保存到状态后端的检查点中,barrier继续向下游分发

    • 向下游分发检查点barrier后,sum任务继续正常处理数据

    • sink任务向JobManager确认状态保存到checkpoint,所有的任务都确认已成功将状态保存到检查点,一个新的检查点才算真正的完成了

    • Chandy-Lamport算法的分布式快照

    • 检查点分界线 Checkpoint Barrier

    • 将检查点保存和数据处理分离开,不暂停整个应用

    • 利用分界线把一条流上数据按照不同的检查点分开,分界线之前数据引起的状态更改属于当前分界线所属的检查点,分界线之后数据引起的更改,包含在之后的检查点中

    • 依赖

    • 执行步骤

    • 一致性检查点 checkpoint

    • 保存点 savepoint

  • 端到端状态一致性

    • 内部保证-checkpiont

    • source端-可记录的偏移量位置

    • sink端-故障恢复时,不会有数据重复写入

    • 幂等写入

    • 事务写入

    • 除了Flink内部流处理的一致性外还需要保证整个流处理过程中source和sink的一致性

    • 基本含义

    • 实现方法

分类

  • AT-MOST-ONCE

  • AT-LEAST-ONCE

  • EXACTLY-ONCE

Flink 窗口

作用

  • 真实流都是无界的,把无界流进行切分得到有限的数据集处理,将流数据分发到有限大小的桶中进行分析

分类

  • 时间窗口 Time Window

    • 滚动时间窗口 API:timeWindow(Time.second(3))

    • 滑动时间窗口 API:timeWindow(Time.seconds(3),TIme.seconds(1))

    • 会话窗口 window(ProcessingTimeSessionWindow.withGap(Time.second(3)))

  • 计数窗口 Count Window

    • 滚动计数窗口 countWindow(3)

    • 滑动计数窗口 countWindow(3,1)

窗口其他相关API

  • 聚合函数

    • AggregateFunction()

    • ReduceFunction()

    • windowFunction

    • ProcessWindowFunction

    • 全量聚合函数

    • 增量聚合函数

  • .trigger()

  • .evitor()

  • .allowedLateness()

  • .sideOutputLateData()

  • .getSideOutput()

Flink CEP

Flink 项目代码

Flink SQL实时数仓开源UI平台

End

AbuMfeA.jpg!mobile

RnMbmia.jpg!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK