目录
5、你们之前Flink集群规模有多大?部署方式是什么?你了解哪些部署方式?
7、Flink checkpoint 的相关查考?如何做checkpoint,如何监控,存储在哪里?等
10、Flink window、watermark、sideout?或者如何实现计算、乱序、延迟、容错?
14、Flink 是如何保证Exactly-once语义的?或者说保证的先决条件都有哪些?
17、Flink中的Window出现了数据倾斜,你有什么解决办法?
19、 Flink 资源管理中 Task Slot 的概念?
21、Flink的并行度了解吗?Flink的并行度设置是怎样的?
22、Flink的状态存储后端都有哪些?差异是什么?你选用的是哪个?为什么?
23、Flink Operator Chains(算子链)是什么?为什么?
26、讲一下Flink的运行架构,Flink集群有哪些角色?各自有什么作用?
29、Flink 中对窗口的支持包括哪几种?说说他们的使用场景
34、Flink中的Window出现了数据倾斜,你有什么解决办法?
35、Flink中的Window出现了数据倾斜,你有什么解决办法?
1、背压问题
-
背压产生的原因
-
流量徒增,
-
流量内容异常,
-
-
如何发现背压
-
Flink web ui
-
采集到prometheus,报警发现
-
-
背问题的定位与处理
-
配置问题,GC的配置、内存&CPU的配置
-
代码问题,算子使用不合理
-
数据问题,数据倾斜,keyby热点key解决,随机后缀->打散处理->还原二次处理
-
2、Flink是如何支持批流一体的
-
在流处理引擎之上,Flink 有以下机制:
-
window+trigger,用于限制计算范围
-
watermark,解决乱序
-
Side Output和Allowed Lateness,解决late events
-
checkpoint+state,用于实现容错、有状态的处理;
-
-
在同一个流处理引擎之上,Flink 还存在另一套机制,用于实现高效的批处理
-
用于调度和恢复的回溯法:由 Microsoft Dryad 引入,现在几乎用于所有批处理器;
-
用于散列和排序的特殊内存数据结构:可以在需要时,将一部分数据从内存溢出到硬盘上;
-
优化器:尽可能地缩短生成结果的时间。
-
3、Flink任务延迟高,想解决这个问题,你会如何入手
-
原因:定位tm、task、算子
-
解决办法:资源调优和算子调优
-
资源调优即是对作业中的Operator的并发数(parallelism)、CPU(core)、堆内存(heap_memory)等参数进行调优
-
作业参数调优包括:并行度的设置,State的设置,checkpoint的设置
-
4、Flink的监控页面,有了解吗,主要关注那些指标?
-
监控页面指标分类
-
系统指标
-
作业的可用性,如 uptime (作业持续运行的时间)、fullRestarts (作业重启的次数)
-
作业的流量,如numRecordsIn、numBytesInLocal等相关指标来关注作业处理情况
-
作业的资源,如CPU、mem、GC、network等,这些指标一般是用来排查作业性能瓶颈
-
作业的状态,checkpoint 相关信息,checkpoint 的时长、checkpoint 的大小、作业失败后恢复的能力、成功和失败的 checkpoint 数目以及在 Exactly once 模式下 barrier 对齐时间
-
-
自定义指标
-
处理逻辑耗时埋点
-
外部服务调用的性能埋点
-
-
-
需要关注指标
-
作业状态,运行情况、重启情况、checkpoint情况、barrier对齐情况
-
作业性能,处理延迟、数据倾斜、性能瓶颈
-
业务逻辑,流量情况、上游数据质量、新上的逻辑是否存在问题、数据是否存在丢失
-
5、你们之前Flink集群规模有多大?部署方式是什么?你了解哪些部署方式?
-
1、有多大?3000-5000cu 等等,按需回答即可
-
2、部署方式,session、perjob、application
-
3、部署方式差异,从任务和JM、TM、Client三者交互来回答
-
session 共用JM
-
per-job和session 需要客户端做三件事
-
获取作业所需的依赖项;
-
通过执行环境分析并取得逻辑计划,即StreamGraph→JobGraph;
-
将依赖项和JobGraph上传到集群中
-
-
application模式下,不共用JM,且客户端的三件事是JM来处理
-
6、Flink如何做压测和监控
-
压力测试主要体现在source 、代码、 sink 三个点
-
source的压测主要通过mock kafka数据,分为数据量、数据内容,特别在数据内容会可以制造数据倾斜来测试代码情况
-
代码层面,watermark大小和窗口大小来压测内存、state大小等
-
sink的压测主要是针对写入媒介的压力测试,比如ch的batch调整、kafka的batch 和 ack配置等
-
-
监控分为以下几类
-
基础监控,如JM、TM的cpu、mem负载之类的
-
软件监控,如checkpoint耗时、大小;数据流入流出量;背压等情况等
-
业务监控,即自定义埋点,如处理耗时,外部使用好事
-
7、Flink checkpoint 的相关查考?如何做checkpoint,如何监控,存储在哪里?等
-
7.1、底层核心算法:
-
Flink的Checkpoint机制原理来自“Chandy-Lamport algorithm”算法
-
-
7.2、checkpoint的组件:
-
Flink的JobManager为其创建一个 CheckpointCoordinator(检查点协调器),CheckpointCoordinator全权负责本应用的快照制作
-
-
7.3、checkpoint核心原理:
-
基于Chandy-Lamport 算法,实现了一个分布式一致性的存储快照算法
-
-
7.4、Flink中checkpoint执行流程
-
-
1、CheckpointCoordinator周期性的向该流应用的所有source算子发送barrier
-
2、当某个source算子收到一个barrier时,便暂停数据处理过程,然后将自己的当前状态制作成快照,并保存到指定的持久化存储中,最后向CheckpointCoordinator报告自己快照制作情况,同时向自身所有下游算子广播该barrier,恢复数据处理
-
3、下游算子收到barrier之后,会暂停自己的数据处理过程,然后将自身的相关状态制作成快照,并保存到指定的持久化存储中,最后向CheckpointCoordinator报告自身 快照情况,同时向自身所有下游算子广播该barrier,恢复数据处理
-
4、每个算子按照步骤3不断制作快照并向下游广播,直到最后barrier传递到sink算子,快照制作完成
-
5、当CheckpointCoordinator收到所有算子的报告之后,认为该周期的快照制作成功; 否则,如果在规定的时间内没有收到所有算子的报告,则认为本周期快照制作失败
-
-
7.5、Flink中checkpoint执行流程-简单版本(4个步骤,1566)
-
1、一个动作,向source发送barrier
-
2、五个动作,source接收barrier制作checkpoint,保存到持久化存储,向Coordinator汇报状态,向下游算子广播该barrier,自己恢复数据处理
-
3、六个动作,下游算子接收barrier,暂停数据处理过程,保存到持久化存储,向Coordinator汇报状态,向下游算子广播该barrier,自己恢复数据处理
-
4、动作重复,重复2中的6个动作,直到最后barrier传递到sink算子
-
5、判断状态,CheckpointCoordinator根据汇报信息决定是否checkpoint成功
-
-
7.6、当作业失败后,checkpoint如何恢复作业?
-
Flink提供了 应用自动恢复机制 和 手动作业恢复机制
-
应用自动恢复机制,定期恢复策略:fixed-delay、失败比率策略:failure-rate、直接失败策略:None 失败不重启
-
手动作业恢复机制,每通过Flink run 方式/页面提交方式恢复都会重新生成 jobId,Flink 提供了在启动之时通过设置 -s .参数指定检查点目录的功能,让新的 jobld 读取该检查点元文件信息和状态信息,从而达到指定时间节点启动作业的目的
-
-
7.7、如何判断checkpoint是否可以恢复失败的程序?
-
通常当作业执行失败、资源异常重启等非人为触发的异常场景时,支持
-
但是如果修改了作业的运算逻辑,作业的计算逻辑已发生更改,可能不支持
-
-
7.8、checkpoint恢复流程
-
首先客户端提供 Checkpoint 或 Savepoint 的目录
-
1、重启应用,JM 从给定的目录中找到 _metadata 文件(Checkpoint 的元数据文件)
-
2、JM 拿到所有算子对应的 State,给各个 subtask 分配 StateHandle(状态文件句柄)
-
3、TM 启动时,也就是 StreamTask 的初始化阶段会创建 KeyedStateBackend 和 OperatorStateBackend,TM从 checkpoint 中读取状态,将状态重置
-
4、开始消费并处理检查点到发生故障之间的所有数据
-
-
7.9、checkpoint如何监控(5类)(量、成、败、s、h)
-
Checkpoint counts:包含了触发、进行中、完成、失败、重置等状态数量统计。
-
lastest completed Checkpoint:记录了最近一次完成的Checkpoint信息,包括结束时间,端到端市场,状态大小等。
-
lastest faild Checkpoint:记录了最近一次失败的Checkpoint信息。
-
lastest savepoint:记录了最近一次savepoint触发的信息。
-
lastest restore:记录了最近一次重置操作的信息,包括从Checkpoint到savepoint两种数据中重置恢复任务。
-
-
7.10、checkpoint配置相关(5类)()
-
Checkpoint mode:标记Checkpoint是exactly once 还是 at least once的模式。
-
interval:Checkpoint触发的时间间隔,时间间隔越小意味着越频繁的Checkpoint。
-
timeout:Checkpoint触发超时时间,超过指定时间JobManager会取消当次Checkpoint,并重新启动新的Checkpoint。
-
minimum pause between Checkpoint:配置两个Checkpoint之间最短时间间隔,当上一次Checkpoint结束后,需要等待该时间间隔才能触发下一次Checkpoint,避免触发过多的Checkpoint导致系统资源被消耗。
-
persist Checkpoint externally:如果开启Checkpoint,数据将同时写到外部持久化存储中
-
-
7.11、checkpoint的状态后端及差异?
-
memory、fs、rocksdb
-
memory jvm堆上;fs 文件系统;rocksdb 本地rocksdb,支持增量
-
-
7.12、Flink 的 checkpoint 机制对比 spark 有什么不同和优势?
-
Spark Streaming 的 Checkpoint 仅仅是针对 Driver 的故障恢复做了数据和元数据的 Checkpoint
-
Flink 的 Checkpoint 机制要复杂了很多,它采用的是轻量级的分布式快照,实现了每个算子的快照,及流动中的数据的快照
-
8、Flink Savepoint 的相关查考?
-
savepoint恢复作业的限制都有那些?
-
有状态的算子增加,无影响,当你在作业中添加了一个算子后,该算子会被初始化为没有保存任何状态,新加入的算子则类似于无状态的算子
-
有状态的算子删除,有影响,allowNonReStoredSlale(short: -n)跳过无法恢复的算子
-
有状态算子顺序改变,可能有影响。如果你给这些算子赋予了独立的 ID,那么就不影响作业的恢复;如果你没有给算子赋予独立的 ID,通常算子进行重排序之后,系统分发的 ID 将会改变,这将会导致从保存点(savepoint)文件恢复失败
-
添加、删除、重排序无状态的算子,可能有影响。如果你给有状态的算子赋予了 ID,那么这些无状态的算子不会影响保存点(savepoint)的恢复;如果你没有给有状态的算子赋予 ID,对算子进行重排序之后有状态的算子的自动生成的 ID 会发生变化,这会导致从保存点(savepoint)恢复失败
-
-
总结一下Checkpoint和Savepoint的区别和联系?
-
checkpoint的侧重点是“容错”,而savepoint的侧重点是“维护”
-
savepoint是“通过checkpoint机制”创建的,所以savepoint本质上是特殊的checkpoint。
-
checkpoint面向Flink Runtime本身;savepoint面向用户
-
checkpoint的频率往往比较高。checkpoint的存储格式非常轻量级;savepoint则以二进制形式存储所有状态数据和元数据,执行起来比较慢而且“贵”。
-
checkpoint是支持增量的(通过RocksDB),savepoint不支持增量。
-
9、Flink exactly-once 的保证?
-
Flink实现端到端的exactly-once先决条件
-
source端支持数据重放。
-
Flink内部通过checkpoint保证。
-
sink端从故障恢复时,数据不会重复写入外部系统(幂等写入、事务写入)。
-
-
Checkpoint的核心?barrier+异步+增量
-
sink事务写入?
-
构建的事务对应着 checkpoint,等到 checkpoint 真正完成的时候,才把所有对应的结果写入 sink 系统中
-
实现方式,WAL可能会重复 vs 2PC 不丢不重,需要外部 sink 系统支持事务
-
10、Flink window、watermark、sideout?或者如何实现计算、乱序、延迟、容错?
-
1、window 解决计算的问题,将无限流转为有界流进行计算
-
2、watermark 解决 out of order的问题
-
3、sideoutput+allowed lateness 解决 late event的问题
-
4、checkpoint/savepoint+state来解决容错问题,分布式快照对的State存储状态进行备份
11、Flink的时间语意支持?三种时间语义
-
1. Event Time:这是实际应用最常见的时间语义,具体见文档第七章。
-
2. Processing Time:没有事件时间的情况下,或者对实时性要求超高的情况下。
-
3. Ingestion Time:存在多个 Source Operator 的情况下,每个 Source Operator
12、Flink 重启策略?
-
固定延迟重启策略(Fixed Delay Restart Strategy)
-
故障率重启策略(Failure Rate Restart Strategy)
-
没有重启策略(No Restart Strategy)
-
Fallback重启策略(Fallback Restart Strategy)
13、Flink状态存储都有哪些?差异是什么?
14、Flink 是如何保证Exactly-once语义的?或者说保证的先决条件都有哪些?
15、Flink的内存管理?内存划分等等考察
-
Flink 内存主要指 TaskManager 运行时提供的内存资源
-
TaskManager 主要由几个内部组件构成
-
Actor 系统,负责和 JobManager 等进程通信
-
IOManager,负责在内存不足时将数据溢写到磁盘和读回的
-
MemoryManager,负责内存管理的
-
-
TaskManager 的运行时 JVM heap划分
-
Network Buffers 区: 网络模块用于网络传输的一组缓存块对象,单个缓存块对象默认是32KB大小。Flink 会根据 TaskManager 的最大内存来计算该区大小,默认范围是64MB至1GB
-
Memory Manager 区: 用于为算子缓存运行时消息记录的大缓存池(比如 Sort、Join 这类耗费大量内存的操作),消息记录会被序列化之后存进这些缓存块对象。这部分区域默认占最大 heap 内存减去 Network Buffers 后的70%,单个缓存块同样默认是32KB
-
Free 区: 除去上述两个区域的内存剩余部分便是 Free heap,这个区域用于存放用户代码所产生的数据结构,比如用户定义的 State
-
-
Flink的序列化方式?重新造了一套轮子以定制数据的二进制格式
-
1、掌握了对序列化后的数据结构信息
-
2、提前优化序列化结构,极大地提高了性能
-
3、Flink 可以在作业执行之前确定对象的类型,并在序列化时利用这个信息进行优化
-
16、Flink集群角色考察?
-
都有哪些角色?
-
-
JM,JM类似Master的角色,JM是Flink系统的协调者,它负责接收Flink Job,调度组成Job的多个Task的执行
-
TM,五个核心职责作业流的task执行、数据流处理(缓存+交换)、作业的状态管理、资源管理、故障管理;在TM中资源调度的最小单位是 task slot,task slot 的数量表示并发处理 task的数量,一个 task slot 中可以执行多个算子
-
Clint,该Client首先会对用户提交的Flink程序进行预处理,并提交到Flink集群中处理,所以Client需要从用户提交的Flink程序配置中获取JobManager的地址,并建立到JobManager的连接,将Flink Job提交给JobManager
-
-
Flink 任务提交流程?on yarn 模式为例
-
1、任务提交后,client向hdfs上传flink的jar包以及配置
-
2、解析命令参数项并初始化,-D&-t,向Yarn ResourceManager提交任务并申请资源
-
3、Yarn ResourceManager分配Container资源并启动ApplicationMaster
-
4、ApplicationMaster加载Flink的Jar包和配置构建环境,启动JM
-
5、ApplicationMaster根据JM配置向ResourceManager申请资源启动TM
-
6、NodeManager加载flink的jar包和配置环境启动TM
-
7、TM向JM发送心跳包、资源配置信息,等待JM向其分配任务
-
8、Client生成StreamGraph,再优化生成JobGraph发送给JM<非application mode>
-
9、JM接收JobGraph生成ExecutionGraph,JM会将ExecutionGraph分发给TM
-
10、TM根据ExecutionGraph部署任务,TM会根据ExecutionGraph生成Physical Graph
-
11、执行过程中TM上报信息,JM负责责监控作业状态、协调checkpoint
-
-
Flink client的作用?
-
获取作业所需的依赖项;
-
通过执行环境分析并取得逻辑计划,即StreamGraph→JobGraph;
-
将依赖项和JobGraph上传到集群中
-
-
Flink application mode 与非 application mode的差异?
-
JM是否共享 与 client的核心作用?
-
-
Flink中Graph的转变及哪些组件执行?
-
StreamGraph->JobGraph->ExecutionGraph->PhysicalGraph
-
StreamGraph->JobGraph在客户端(application mode 在JM端)
-
JobGraph->ExecutionGraph在JM端
-
ExecutionGraph->PhysicalGraph在TM端
-
-
Flink 资源划分情况了解?
-
每个TaskManager是一个JVM的进程, 可以在不同的线程中执行一个或多个子任务。
-
为了控制一个worker能接收多少个task。worker通过task slot来进行控制(一个worker至少有一个task slot)
-
17、Flink中的Window出现了数据倾斜,你有什么解决办法?
-
原因:window产生数据倾斜指的是数据在不同的窗口内堆积的数据量相差过多
-
方案:在业务上规避这类问题&在数据进入窗口前做预聚合 & 重新设计窗口聚合的key
18、Flink任务延迟高,想解决这个问题,你会如何入手?
-
任务延迟的可能问题及解决
-
1、确定问题,如:Flink的哪个算子和task出现了反压
-
2、解决问题,如:业务+技术,技术层面:资源调优和算子调优
-
-
技术层面的调优都有哪些?
-
资源方面,如CPU、堆内存等参数进行调优。
-
作业参数调优包括:并行度的设置,State的设置,checkpoint的设置
-
19、 Flink 资源管理中 Task Slot 的概念?
-
TaskManager是实际负责执行计算的Worker,TaskManager 是一个 JVM 进程,并会以独立的线程来执行一个task或多个subtask。为了控制一个 TaskManager 能接受多少个 task,Flink 提出了 Task Slot 的概念
-
TaskManager会将自己节点上管理的资源分为不同的Slot:固定大小的资源子集。这样就避免了不同Job的Task互相竞争内存资源,但是需要主要的是,Slot只会做内存的隔离。没有做CPU的隔离
20、Flink 的常用算子?Flink的开发模型?
-
开发模型
-
1、构建ExecutionEnvironment
-
2、构建Source
-
3、Transformation转换操作
-
4、Sink输出结果
-
5、执行作业
-
-
常用算子
-
//Keyed Window
stream
.keyBy(...) <- 返回:KeyedStream
.window(...) <- 必选:窗口分配,根据实际业务指定具体窗口
[.trigger(...)] <- 选填:触发器,告诉窗口什么时候可以执行窗口函数(默认为默认实现)
[.evictor(...)] <- 可选:驱逐器,触发器触发后,在窗口函数执行前/后对数据操作(默认无)
[.allowedLateness(...)] <- 可选:指定允许延迟事件(默认为 0)
[.sideOutputLateData(...)] <- 可选:指定延迟事件的侧输出(默认无)
.reduce/aggregate/fold/apply() <- 必填:窗口函数,定义窗口的数据如何计算
[.getSideOutput(...)] <- 可选:DataStream.getSideOutput() 获取侧输出
//Non-Keyed Windows
stream
.windowAll(...) <- 必选:窗口分配,根据实际业务指定具体窗口
[.trigger(...)] <- 选填:触发器,告诉窗口什么时候可以执行窗口函数(默认为默认实现)
[.evictor(...)] <- 可选:驱逐器,触发器触发后,在窗口函数执行前/后对数据操作(默认无)
[.allowedLateness(...)] <- 可选:指定允许延迟事件(默认为 0)
[.sideOutputLateData(...)] <- 可选:指定延迟事件的侧输出(默认无)
.reduce/aggregate/fold/apply() <- 必填:窗口函数,定义窗口的数据如何计算
[.getSideOutput(...)] <- 可选:DataStream.getSideOutput() 获取侧输出
-
Flink分区策略?
-
GlobalPartitioner、ShufflePartitioner、RebalancePartitioner等等
21、Flink的并行度了解吗?Flink的并行度设置是怎样的?
-
Task*parallelism=subTask,subTask=slots
-
配置方式
-
1、配置文件默认,cat flink-conf.yaml |grep "parallelism.default"
-
2、env级别,env.setParallelism(5)
-
3、客户端级别,flink run -p 5
-
4、算子级别,env.addSource(kafkaConsumer).setParallelism(2);
-
配置优先级
-
-
从优先级上来看: 算子级别 > env级别 > Client级别 > 系统默认级别
-
-
Flink的Slot和parallelism有什么区别?
-
1.slot是静态的概念,是指taskmanager具有的并发执行能力
-
2.parallelism是动态的概念,是指程序运行时实际使用的并发能力
-
3.设置合适的parallelism能提高运算效率,太多了和太少了都不行
-
4.设置parallelism有多中方式,优先级为api>env>p>file
-
22、Flink的状态存储后端都有哪些?差异是什么?你选用的是哪个?为什么?
23、Flink Operator Chains(算子链)是什么?为什么?
-
是什么?Flink会尽可能地将operator的subtask链接(chain)在一起形成task
-
为什么?是非常有效的优化:它能减少线程之间的切换,减少消息的序列化/反序列化,减少数据在缓冲区的交换,减少了延迟的同时提高整体的吞吐量
-
形成条件是什么?并行度、slot group、用户没有禁用 chain等等
24、Flink 提供哪几类API?
-
DataSet API, 对静态数据进行批处理操作
-
DataStream API,对数据流进行流处理操作
-
Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表
25、Flink编程模型是什么?
26、讲一下Flink的运行架构,Flink集群有哪些角色?各自有什么作用?
27、Flink的集群部署模式有哪些?
28、Flink集群优化?
-
业务优化
-
配置优化,内存管理、任务调度、网络配置、状态管理
-
代码优化,算子,operator chain等
29、Flink 中对窗口的支持包括哪几种?说说他们的使用场景
-
代码开发,5类,{tumbling、slide}*{time,count} + session
-
sql开发,
-
滚动窗口,TUMBLE(TABLE data, DESCRIPTOR(timecol), size)
-
滑动窗口,CUMULATE(TABLE data, DESCRIPTOR(timecol), step, size)
-
累积窗口,HOP(TABLE data, DESCRIPTOR(timecol), slide, size [, offset ])
30、Flink 的容错机制,Flink是如何做到容错的?
-
保证flink在节点故障时,数据不丢不重且可恢复
-
核心能力,checkpoint+state
-
Checkpoint:是一种快照机制,它用于定期备份 Flink 程序中的状态,并将其存储在外部存储系统中
-
State:是 Flink 中的另一种重要机制,它用于存储计算过程中的中间状态。State 可以分为两种类型:Operator State 和 Keyed State
31、Flink分布式快照的原理是什么?
-
外部3个要求,内部barrier机制,结合一个核心算法实现
32、Flink中的Watermark机制
-
作用?解决out of order 问题,触发window计算。
-
原理?Watermark 的主要作用是确定事件时间窗口的边界,以便触发窗口计算。通过引入 Watermark,Flink 可以处理无序事件流(out-of-order events),Watermark越过窗口对应的window_end时,触发窗口关闭和计算
33、Flink是通过什么机制实现的背压机制?
34、Flink中的Window出现了数据倾斜,你有什么解决办法?
-
业务+技术配置+代码
35、Flink中的Window出现了数据倾斜,你有什么解决办法?
-
业务+技术配置+代码
36、FlinkSlots和并行度有什么关系?
-
一个是组件的虚拟概念,一个是代码开发执行概念
37、Flink分层模型
-
Runtime层: Flink程序的最底层入口
-
DataStream/Dataset API层:这一层主要面向开发者
-
Table API:统一DataStream/DataSet API,抽象成带有Schema信息的表结构API
-
SQL:面向数据分析和开发人员,抽象为SQL操作,降低开发门槛和平台化
38、Flink的执行图有哪几种?分别有什么作用
-
按照生成顺序分别为:StreamGraph-> JobGraph-> ExecutionGraph->物理执行图
-
StreamGraph,通过Stream API生成,这是执行图的最原始拓扑数据结构
-
JobGraph,StreamGraph在Client中经过算子chain链合并等优化,转换为JobGraph拓扑图,随后被提交到JobManager中
-
ExecutionGraph,JobManager中将JobGraph进一步转换为ExecutionGraph,此时ExecutuonGraph根据算子配置的并行度转变为并行化的Graph拓扑结构
-
物理执行图,比较偏物理执行概念,即JobManager进行Job调度,TaskManager最终部署Task的图结构
-
补充说明
-
StreamGraph到JobGraph的核心优化是:operator -> operator chain 减少数据在节点之间流动所需要的序列化/反序列化/传输消耗
-
ExecutionGraph是JobGraph的并行化版本,是调度层最核心的数据结
-
Client的三大核心作用
-
获取作业所需的依赖项;
-
通过执行环境分析并取得逻辑计划,即StreamGraph→JobGraph;
-
将依赖项和JobGraph上传到集群中
-
-
相对per-job模式和session模式,Application模式将三件事被转移到JobManager负责,Client只需要负责发起部署请求
-
39、Flink的window作用?编程模型?
-
核心作用:窗口是处理无限流的核心组件,窗口将无限的流分割为有限大小的“桶”,进而,可以对流进行计算
-
编程模型,Windows Assigner->Trigger->Evictor->Lateness->OutputTag->window process
-
Window Assigner,Tumbling Time Windows、Sliding Time Windows等
-
Trigger 即窗口触发器
-
trigger触发器接口有五个方法允许trigger对不同的事件做出反应
-
onElement()进入窗口的每个元素都会调用该方法。
-
onEventTime()事件时间timer触发的时候被调用。
-
onProcessingTime()处理时间timer触发的时候会被调用。
-
onMerge()有状态的触发器相关,并在它们相应的窗口合并时合并两个触发器的状态,例如使用会话窗口。
-
clear()该方法主要是执行窗口的删除操作
-
-
前三方法决定着如何通过返回一个TriggerResult来操作输入事件
-
CONTINUE:什么都不做。
-
FIRE:触发计算。
-
PURE:清除窗口的元素。
-
FIRE_AND_PURE:触发计算和清除窗口元素
-
-
Flink内置触发器
-
EventTimeTrigger基于事件时间和watermark机制来对窗口进行触发计算。
-
ProcessingTimeTrigger基于处理时间触发。
-
CountTrigger窗口元素数超过预先给定的限制值的话会触发计算
-
-
-
Evictor 即窗口剔除器,trigger 触发后、调用窗口函数之前或之后从窗口中删除元素
-
Allowed Lateness 即窗口容忍延迟时间
-
sideOutputLateData 即指定延迟事件的侧输出
-
window process - reduce/aggregate/process
40、Flink的watermark作用?生成方式?
-
作用?解决out of order 问题,触发window计算。
-
原理?Watermark 的主要作用是确定事件时间窗口的边界,以便触发窗口计算。通过引入 Watermark,Flink 可以处理无序事件流(out-of-order events),Watermark越过窗口对应的window_end时,触发窗口关闭和计算
41、Flink 分布式快照的原理是什么
-
核心算法:Chandy-Lamport算法
-
核心定义:持续创建分布式数据流及其状态的一致快照。
-
核心思想:在 input source 端插入 barrier,控制 barrier 的同步来实现 snapshot 的备份和 exactly-once 语义,1566