sever 2008 网站建设,企划做网站,steam交易链接在哪里看,少儿编程加盟品牌有哪些目录
✅Flink介绍、特点、应用场景
✅Flink与Spark Streaming的区别
✅Flink有哪些部署模式
✅Flink架构
✅怎么设置并行度#xff1f;
✅什么是算子链#xff1f;
✅什么是任务槽#xff08;Task Slots#xff09;#xff1f;
✅任务槽和并行度的关系
✅Flink作…目录
✅Flink介绍、特点、应用场景
✅Flink与Spark Streaming的区别
✅Flink有哪些部署模式
✅Flink架构
✅怎么设置并行度
✅什么是算子链
✅什么是任务槽Task Slots
✅任务槽和并行度的关系
✅Flink作业提交流程
简单介绍一下Flink
Flink相比传统的Spark Streaming区别?
Flink的组件栈有哪些
Flink的运行必须依赖Hadoop组件吗
Flink的基础编程模型了解吗
Flink集群有哪些角色各自有什么作用
说说Flink资源管理中Task Slot的概念
说说Flink的常用算子
说说你知道的Flink分区策略
Flink的并行度了解吗Flink的并行度设置是怎样的
Flink的Slot和parallelism有什么区别
Flink有没有重启策略说说有哪几种
用过Flink中的分布式缓存吗如何使用
说说Flink中的广播变量使用时需要注意什么
说说Flink中的窗口
说说Flink中的状态存储
Flink中的时间有哪几类
Flink中水印是什么概念起到什么作用
Flink Table SQL熟悉吗TableEnvironment这个类有什么作用
Flink SQL的实现原理是什么是如何实现SQL解析的呢
Flink是如何支持批流一体的
Flink是如何做到高效的数据交换的
Flink是如何做容错的
Flink分布式快照的原理是什么
Flink是如何保证Exactly-once语义的
Flink的kafka连接器有什么特别的地方
说说Flink的内存管理是如何做的?
说说Flink的序列化如何做的?
Flink中的Window出现了数据倾斜你有什么解决办法
Flink中在使用聚合函数GroupBy、Distinct、KeyBy等函数时出现数据热点该如何解决
Flink任务延迟高想解决这个问题你会如何入手
Flink是如何处理反压的
Flink的反压和Strom有哪些不同
Operator Chains算子链这个概念你了解吗
Flink什么情况下才会把Operator chain在一起形成算子链
说说Flink1.9的新特性
消费kafka数据的时候如何处理脏数据
Flink Job的提交流程
Flink所谓三层图结构是哪几个图
JobManger在集群中扮演了什么角色
JobManger在集群启动过程中起到什么作用
TaskManager在集群中扮演了什么角色
TaskManager在集群启动过程中起到什么作用
Flink计算资源的调度是如何实现的
简述Flink的数据抽象及数据交换过程
Flink中的分布式快照机制是如何实现的
简单说说FlinkSQL的是如何实现的
Flink的窗口了解哪些都有什么区别有哪几种?如何定义?
Flink窗口函数时间语义相关的问题
介绍下Flink的watermark(水位线)watermark需要实现哪个实现类在何处定义?有什么作用?
Flink的窗口(实现)机制
讲一下双流JOIN
说下Flink的CEP
说一说Flink的Checkpoint机制
Flink的Checkpoint底层如何实现的?savepoint和checkpoint有什么区别?
Flink的Checkpoint流程
Flink Checkpoint的作用
Flink中Checkpoint超时原因
Flink的ExactlyOnce语义怎么保证?
Flink的端到端ExactlyOnce
Flink的水印(Watermark)有哪几种?
Flink的时间语义
Flink相比于其它流式处理框架的优点?
Flink和Spark的区别?什么情况下使用Flink?有什么优点?
Flink backPressure反压机制指标监控你是怎么做的?
Flink如何保证一致性?
Flink支持JobMaster的HA啊?原理是怎么样的?
如何确定Flink任务的合理并行度?
Flink任务如何实现端到端一致?
Flink如何处理背(反)压?
Flink解决数据延迟的问题
Flink消费kafka分区的数据时flink件务并行度之间的关系
使用flink-client消费kafka数据还是使用flink-connector消费
如何动态修改Flink的配置前提是Flink不能重启
Flink流批一体解释一下
说一下Flink的check和barrier
说一下Flink状态机制
Flink广播流
Flink实时topN
在实习中一般都怎么用Flink
Savepoint知道是什么吗
为什么用Flink不用别的微批考虑过吗
解释一下啥叫背压
Flink分布式快照
Flink SQL解析过程
Flink on YARN模式
Flink如何保证数据不丢失 ✅Flink介绍、特点、应用场景
介绍
Apache Flink是一个框架和分布式处理引擎用于对无界和有界数据流进行有状态计算。
Flink核心目标是“数据流上的有状态计算”Stateful Computations over Data Streams。 Apache Flink® — Stateful Computations over Data Streams | Apache Flink Flink处理数据的目标是低延迟、高吞吐、结果的准确性和良好的容错性。
Flink主要特点如下
高吞吐和低延迟。每秒处理数百万个事件毫秒级延迟。结果的准确性。Flink提供了事件时间event-time和处理时间processing-time语义。对于乱序事件流事件时间语义仍然能提供一致且准确的结果。精确一次exactly-once的状态一致性保证。可以连接到最常用的外部系统如Kafka、Hive、JDBC、HDFS、Redis等。高可用。本身高可用的设置加上与K8sYARN和Mesos的紧密集成再加上从故障中快速恢复和动态扩展任务的能力Flink能做到以极少的停机时间7×24全天候运行。
应用场景
实时监控告警实时推荐广告投放风控
✅Flink与Spark Streaming的区别
Spark以批处理为根本。
Spark数据模型Spark 采用 RDD 模型Spark Streaming 的 DStream 实际上也就是一组组小批数据 RDD 的集合Spark运行时架构Spark 是批计算将 DAG 划分为不同的 stage一个完成后才可以计算下一个 Flink以流处理为根本。
Flink数据模型Flink 基本数据模型是数据流以及事件Event序列Flink运行时架构Flink 是标准的流执行模式一个事件在一个节点处理完后可以直接发往下一个节点进行处理 Flink Streaming 计算模型 流计算 微批处理 时间语义 事件时间、处理时间 处理时间 窗口 多、灵活 少、不灵活窗口必须是批次的整数倍 状态 有 没有 流式SQL 有 没有
✅Flink有哪些部署模式
在一些应用场景中对于集群资源分配和占用的方式可能会有特定的需求。Flink为各种场景提供了不同的部署模式主要有以下三种会话模式Session Mode、单作业模式Per-Job Mode、应用模式Application Mode。
它们的区别主要在于集群的生命周期以及资源的分配方式以及应用的main方法到底在哪里执行——客户端Client还是JobManager。
会话模式
会话模式其实最符合常规思维。我们需要先启动一个集群保持一个会话在这个会话中通过客户端提交作业。集群启动时所有资源就都已经确定所以所有提交的作业会竞争集群中的资源。
会话模式比较适合于单个规模小、执行时间短的大量作业。 单作业模式
会话模式因为资源共享会导致很多问题所以为了更好地隔离资源我们可以考虑为每个提交的作业启动一个集群这就是所谓的单作业Per-Job模式。
作业完成后集群就会关闭所有资源也会释放。
这些特性使得单作业模式在生产环境运行更加稳定所以是实际应用的首选模式。
需要注意的是Flink本身无法直接这样运行所以单作业模式一般需要借助一些资源管理框架来启动集群比如YARN、KubernetesK8S。 应用模式
前面提到的两种模式下应用代码都是在客户端上执行然后由客户端提交给JobManager的。但是这种方式客户端需要占用大量网络带宽去下载依赖和把二进制数据发送给JobManager加上很多情况下我们提交作业用的是同一个客户端就会加重客户端所在节点的资源消耗。
所以解决办法就是我们不要客户端了直接把应用提交到JobManger上运行。而这也就代表着我们需要为每一个提交的应用单独启动一个JobManager也就是创建一个集群。这个JobManager只为执行这一个应用而存在执行结束之后JobManager也就关闭了这就是所谓的应用模式。
应用模式与单作业模式都是提交作业之后才创建集群单作业模式是通过客户端来提交的客户端解析出的每一个作业对应一个集群而应用模式下是直接由JobManager执行应用程序的。 这里我们所讲到的部署模式相对是比较抽象的概念。实际应用时一般需要和资源管理平台结合起来选择特定的模式来分配资源、部署应用。接下来我们就针对不同的资源提供者的场景具体介绍Flink的部署方式。
Standalone运行模式了解
独立模式是独立运行的不依赖任何外部的资源管理平台当然独立也是有代价的如果资源不足或者出现故障没有自动扩展或重分配资源的保证必须手动处理。所以独立模式一般只用在开发测试或作业非常少的场景下。
YARN运行模式重点
YARN上部署的过程是客户端把Flink应用提交给Yarn的ResourceManagerYarn的ResourceManager会向Yarn的NodeManager申请容器。在这些容器上Flink会部署JobManager和TaskManager的实例从而启动集群。Flink会根据运行在JobManger上的作业所需要的Slot数量动态分配TaskManager资源。
- YARN会话模式部署
YARN的会话模式与独立集群略有不同需要首先申请一个YARN会话YARN Session来启动Flink集群。
- YARN单作业模式部署
在YARN环境中由于有了外部平台做资源调度所以我们也可以直接向YARN提交一个单独的作业从而启动一个Flink集群。
- YARN应用模式部署
应用模式同样非常简单与单作业模式类似直接执行flink run-application命令即可。
K8S 运行模式了解
容器化部署是如今业界流行的一项技术基于Docker镜像运行能够让用户更加方便地对应用进行管理和运维。容器管理工具中最为流行的就是Kubernetesk8s而Flink也在最近的版本中支持了k8s部署模式。基本原理与YARN是类似的具体配置可以参见官网说明
✅Flink架构
运行时架构以Standlone会话模式为例 1作业管理器JobManager
JobManager是一个Flink集群中任务管理和调度的核心是控制应用执行的主进程。也就是说每个应用都应该被唯一的JobManager所控制执行。
JobManger又包含3个不同的组件。
1JobMaster
JobMaster是JobManager中最核心的组件负责处理单独的作业Job。所以JobMaster和具体的Job是一一对应的多个Job可以同时运行在一个Flink集群中, 每个Job都有一个自己的JobMaster。需要注意在早期版本的Flink中没有JobMaster的概念而JobManager的概念范围较小实际指的就是现在所说的JobMaster。
在作业提交时JobMaster会先接收到要执行的应用。JobMaster会把JobGraph转换成一个物理层面的数据流图这个图被叫作“执行图”ExecutionGraph它包含了所有可以并发执行的任务。JobMaster会向资源管理器ResourceManager发出请求申请执行任务必要的资源。一旦它获取到了足够的资源就会将执行图分发到真正运行它们的TaskManager上。
而在运行过程中JobMaster会负责所有需要中央协调的操作比如说检查点checkpoints的协调。
2资源管理器ResourceManager
ResourceManager主要负责资源的分配和管理在Flink 集群中只有一个。所谓“资源”主要是指TaskManager的任务槽task slots。任务槽就是Flink集群中的资源调配单元包含了机器用来执行计算的一组CPU和内存资源。每一个任务Task都需要分配到一个slot上执行。
这里注意要把Flink内置的ResourceManager和其他资源管理平台比如YARN的ResourceManager区分开。
3分发器Dispatcher
Dispatcher主要负责提供一个REST接口用来提交应用并且负责为每一个新提交的作业启动一个新的JobMaster 组件。Dispatcher也会启动一个Web UI用来方便地展示和监控作业执行的信息。Dispatcher在架构中并不是必需的在不同的部署模式下可能会被忽略掉。
2任务管理器TaskManager
TaskManager是Flink中的工作进程数据流的具体计算就是它来做的。Flink集群中必须至少有一个TaskManager每一个TaskManager都包含了一定数量的任务槽task slots。Slot是资源调度的最小单位slot的数量限制了TaskManager能够并行处理的任务数量。
启动之后TaskManager会向资源管理器注册它的slots收到资源管理器的指令后TaskManager就会将一个或者多个槽位提供给JobMaster调用JobMaster就可以分配任务来执行了。
在执行过程中TaskManager可以缓冲数据还可以跟其他运行同一应用的TaskManager交换数据。
✅怎么设置并行度
并行子任务和并行度
当要处理的数据量非常大时我们可以把一个算子操作“复制”多份到多个节点数据来了之后就可以到其中任意一个执行。这样一来一个算子任务就被拆分成了多个并行的“子任务”subtasks再将它们分发到不同节点就真正实现了并行计算。
在Flink执行过程中每一个算子operator可以包含一个或多个子任务operator subtask这些子任务在不同的线程、不同的物理机或不同的容器中完全独立地执行。 一个特定算子的子任务subtask的个数被称之为其并行度parallelism。这样包含并行子任务的数据流就是并行数据流它需要多个分区stream partition来分配并行任务。一般情况下一个流程序的并行度可以认为就是其所有算子中最大的并行度。一个程序中不同的算子可能具有不同的并行度。
例如如上图所示当前数据流中有source、map、window、sink四个算子其中sink算子的并行度为1其他算子的并行度都为2。所以这段流处理程序的并行度就是2。 2并行度的设置 在Flink中可以用不同的方法来设置并行度它们的有效范围和优先级别也是不同的。
1代码中设置
我们在代码中可以很简单地在算子后跟着调用setParallelism()方法来设置当前算子的并行度
stream.map(word - Tuple2.of(word, 1L)).setParallelism(2);
这种方式设置的并行度只针对当前算子有效。
另外我们也可以直接调用执行环境的setParallelism()方法全局设定并行度
env.setParallelism(2);
这样代码中所有算子默认的并行度就都为2了。我们一般不会在程序中设置全局并行度因为如果在程序中对全局并行度进行硬编码会导致无法动态扩容。
这里要注意的是由于keyBy不是算子所以无法对keyBy设置并行度。
2提交应用时设置
在使用flink run命令提交应用时可以增加-p参数来指定当前应用程序执行的并行度它的作用类似于执行环境的全局设置
bin/flink run –p 2 –c com.atguigu.wc.SocketStreamWordCount
./FlinkTutorial-1.0-SNAPSHOT.jar
如果我们直接在Web UI上提交作业也可以在对应输入框中直接添加并行度。
3配置文件中设置
我们还可以直接在集群的配置文件flink-conf.yaml中直接更改默认并行度
parallelism.default: 2
这个设置对于整个集群上提交的所有作业有效初始值为1。无论在代码中设置、还是提交时的-p参数都不是必须的所以在没有指定并行度的时候就会采用配置文件中的集群默认并行度。在开发环境中没有配置文件默认并行度就是当前机器的CPU核心数。
✅什么是算子链 一个数据流在算子之间传输数据的形式可以是一对一one-to-one的直通forwarding模式也可以是打乱的重分区redistributing模式具体是哪一种形式取决于算子的种类。
1一对一One-to-oneforwarding
这种模式下数据流维护着分区以及元素的顺序。比如图中的source和map算子source算子读取数据之后可以直接发送给map算子做处理它们之间不需要重新分区也不需要调整数据的顺序。这就意味着map 算子的子任务看到的元素个数和顺序跟source 算子的子任务产生的完全一样保证着“一对一”的关系。map、filter、flatMap等算子都是这种one-to-one的对应关系。这种关系类似于Spark中的窄依赖。
2重分区Redistributing
在这种模式下数据流的分区会发生改变。比如图中的map和后面的keyBy/window算子之间以及keyBy/window算子和Sink算子之间都是这样的关系。
每一个算子的子任务会根据数据传输的策略把数据发送到不同的下游目标任务。这些传输方式都会引起重分区的过程这一过程类似于Spark中的shuffle。
2合并算子链
在Flink中并行度相同的一对一one to one算子操作可以直接链接在一起形成一个“大”的任务task这样原来的算子就成为了真正任务里的一部分如下图所示。每个task会被一个线程执行。这样的技术被称为“算子链”Operator Chain。 上图中Source和map之间满足了算子链的要求所以可以直接合并在一起形成了一个任务因为并行度为2所以合并后的任务也有两个并行子任务。这样这个数据流图所表示的作业最终会有5个任务由5个线程并行执行。
将算子链接成task是非常有效的优化可以减少线程之间的切换和基于缓存区的数据交换在减少时延的同时提升吞吐量。
Flink默认会按照算子链的原则进行链接合并如果我们想要禁止合并或者自行定义也可以在代码中对算子做一些特定的设置
// 禁用算子链.map(word - Tuple2.of(word, 1L)).disableChaining();// 从当前算子开始新链.map(word - Tuple2.of(word, 1L)).startNewChain();
✅什么是任务槽Task Slots
1任务槽Task Slots
Flink中每一个TaskManager都是一个JVM进程它可以启动多个独立的线程来并行执行多个子任务subtask。
很显然TaskManager的计算资源是有限的并行的任务越多每个线程的资源就会越少。那一个TaskManager到底能并行处理多少个任务呢为了控制并发量我们需要在TaskManager上对每个任务运行所占用的资源做出明确的划分这就是所谓的任务槽task slots。
每个任务槽task slot其实表示了TaskManager拥有计算资源的一个固定大小的子集。这些资源就是用来独立执行一个子任务的。
假如一个TaskManager有三个slot那么它会将管理的内存平均分成三份每个slot独自占据一份。这样一来我们在slot上执行一个子任务时相当于划定了一块内存“专款专用”就不需要跟来自其他作业的任务去竞争内存资源了。
所以现在我们只要2个TaskManager就可以并行处理分配好的5个任务了。 2任务槽数量的设置
在Flink的/opt/module/flink-1.17.0/conf/flink-conf.yaml配置文件中可以设置TaskManager的slot数量默认是1个slot。
taskmanager.numberOfTaskSlots: 8
需要注意的是slot目前仅仅用来隔离内存不会涉及CPU的隔离。在具体应用时可以将slot数量配置为机器的CPU核心数尽量避免不同任务之间对CPU的竞争。这也是开发环境默认并行度设为机器CPU数量的原因。
3任务对任务槽的共享 默认情况下Flink是允许子任务共享slot的。如果我们保持sink任务并行度为1不变而作业提交时设置全局并行度为6那么前两个任务节点就会各自有6个并行子任务整个流处理程序则有13个子任务。如上图所示只要属于同一个作业那么对于不同任务节点算子的并行子任务就可以放到同一个slot上执行。所以对于第一个任务节点source→map它的6个并行子任务必须分到不同的slot上而第二个任务节点keyBy/window/apply的并行子任务却可以和第一个任务节点共享slot。
当我们将资源密集型和非密集型的任务同时放到一个slot中它们就可以自行分配对资源占用的比例从而保证最重的活平均分配给所有的TaskManager。
slot共享另一个好处就是允许我们保存完整的作业管道。这样一来即使某个TaskManager出现故障宕机其他节点也可以完全不受影响作业的任务可以继续执行。
当然Flink默认是允许slot共享的如果希望某个算子对应的任务完全独占一个slot或者只有某一部分算子共享slot我们也可以通过设置“slot共享组”手动指定
.map(word - Tuple2.of(word, 1L)).slotSharingGroup(1);
这样只有属于同一个slot共享组的子任务才会开启slot共享不同组之间的任务是完全隔离的必须分配到不同的slot上。在这种场景下总共需要的slot数量就是各个slot共享组最大并行度的总和。
✅任务槽和并行度的关系
任务槽和并行度都跟程序的并行执行有关但两者是完全不同的概念。简单来说任务槽是静态的概念是指TaskManager具有的并发执行能力可以通过参数taskmanager.numberOfTaskSlots进行配置而并行度是动态概念也就是TaskManager运行程序时实际使用的并发能力可以通过参数parallelism.default进行配置。
举例说明假设一共有3个TaskManager每一个TaskManager中的slot数量设置为3个那么一共有9个task slot表示集群最多能并行执行9个同一算子的子任务。
而我们定义word count程序的处理操作是四个转换算子
source→ flatmap→ reduce→ sink
当所有算子并行度相同时容易看出source和flatmap可以合并算子链于是最终有三个任务节点。 ✅Flink作业提交流程
简单介绍一下Flink
Flink是一个框架和分布式处理引擎用于对无界和有界数据流进行有状态计算。并且Flink提供了数据分布、容错机制以及资源管理等核心功能。Flink提供了诸多高抽象层的API以便用户编写分布式任务
DataSet API 对静态数据进行批处理操作将静态数据抽象成分布式的数据集用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理支持Java、Scala和Python。
DataStream API对数据流进行流处理操作将流式的数据抽象成分布式的数据流用户可以方便地对分布式数据流进行各种操作支持Java和Scala。
Table API对结构化数据进行查询操作将结构化数据抽象成关系表并通过类SQL的DSL对关系表进行各种查询操作支持Java和Scala。
此外Flink还针对特定的应用领域提供了领域库例如 Flink MLFlink的机器学习库提供了机器学习Pipelines API并实现了多种机器学习算法。 GellyFlink的图计算库提供了图计算的相关API及多种图计算算法实现。根据官网的介绍Flink的特性包含
Flink相比传统的Spark Streaming区别?
这个问题是一个非常宏观的问题因为两个框架的不同点非常之多。但是在面试时有非常重要的一点一定要回答出来Flink是标准的实时处理引擎基于事件驱动。而Spark Streaming是微批Micro-Batch的模型。
下面我们就分几个方面介绍两个框架的主要区别
1.架构模型Spark Streaming在运行时的主要角色包括Master、Worker、Driver、ExecutorFlink在运行时主要包含Jobmanager、Taskmanager和Slot。
2.任务调度Spark Streaming连续不断的生成微小的数据批次构建有向无环图DAGSpark Streaming会依次创建DStreamGraph、JobGenerator、JobScheduler。Flink根据用户提交的代码生成StreamGraph经过优化生成JobGraph然后提交给JobManager进行处理JobManager会根据JobGraph生成ExecutionGraphExecutionGraph是Flink调度最核心的数据结构JobManager根据ExecutionGraph对Job进行调度。
3.时间机制Spark Streaming支持的时间机制有限只支持处理时间。 Flink支持了流处理程序在时间上的三个定义处理时间、事件时间、注入时间。同时也支持 watermark 机制来处理滞后数据。
4.容错机制对于Spark Streaming任务我们可以设置checkpoint然后假如发生故障并重启我们可以从上次checkpoint之处恢复但是这个行为只能使得数据不丢失可能会重复处理不能做到恰好一次处理语义。Flink则使用两阶段提交协议来解决这个问题。
Flink的组件栈有哪些
根据Flink官网描述Flink是一个分层架构的系统每一层所包含的组件都提供了特定的抽象用来服务于上层组件。 自下而上每一层分别代表Deploy层该层主要涉及了Flink的部署模式在上图中我们可以看出Flink支持包括local、Standalone、Cluster、Cloud等多种部署模式。Runtime层Runtime层提供了支持Flink计算的核心实现比如支持分布式Stream处理、JobGraph到ExecutionGraph的映射、调度等等为上层API层提供基础服务。API层API层主要实现了面向流Stream处理和批Batch处理API其中面向流处理对应DataStream API面向批处理对应DataSet API后续版本Flink有计划将DataStream和DataSet API进行统一。Libraries层该层称为Flink应用框架层根据API层的划分在API层之上构建的满足特定应用的实现计算框架也分别对应于面向流处理和面向批处理两类。面向流处理支持CEP复杂事件处理、基于SQL-like的操作基于Table的关系操作面向批处理支持FlinkML机器学习库、Gelly图处理。
Flink的运行必须依赖Hadoop组件吗
Flink可以完全独立于Hadoop在不依赖Hadoop组件下运行。但是做为大数据的基础设施Hadoop体系是任何大数据框架都绕不过去的。Flink可以集成众多Hadooop组件例如Yarn、Hbase、HDFS等等。例如Flink可以和Yarn集成做资源调度也可以读写HDFS或者利用HDFS做检查点。
Flink的基础编程模型了解吗 上图是来自Flink官网的运行流程图。通过上图我们可以得知Flink程序的基本构建是数据输入来自一个SourceSource代表数据的输入端经过Transformation进行转换然后在一个或者多个Sink接收器中结束。数据流stream就是一组永远不会停止的数据记录流而转换transformation是将一个或多个流作为输入并生成一个或多个输出流的操作。执行时Flink程序映射到streaming dataflows由流streams和转换操作transformation operators组成。
Flink集群有哪些角色各自有什么作用 Flink程序在运行时主要有TaskManagerJobManagerClient三种角色。其中JobManager扮演着集群中的管理者Master的角色它是整个集群的协调者负责接收Flink Job协调检查点Failover故障恢复等同时管理Flink集群中从节点TaskManager。TaskManager是实际负责执行计算的Worker在其上执行Flink Job的一组Task每个TaskManager负责管理其所在节点上的资源信息如内存、磁盘、网络在启动的时候将资源的状态向JobManager汇报。Client是Flink程序提交的客户端当用户提交一个Flink程序时会首先创建一个Client该Client首先会对用户提交的Flink程序进行预处理并提交到Flink集群中处理所以Client需要从用户提交的Flink程序配置中获取JobManager的地址并建立到JobManager的连接将Flink Job提交给JobManager。
说说Flink资源管理中Task Slot的概念 在Flink架构角色中我们提到TaskManager是实际负责执行计算的WorkerTaskManager是一个JVM进程并会以独立的线程来执行一个task或多个subtask。为了控制一个TaskManager能接受多少个taskFlink提出了Task Slot的概念。简单的说TaskManager会将自己节点上管理的资源分为不同的Slot固定大小的资源子集。这样就避免了不同Job的Task互相竞争内存资源但是需要主要的是Slot只会做内存的隔离。没有做CPU的隔离。
说说Flink的常用算子
Flink最常用的常用算子包括MapDataStream → DataStream输入一个参数产生一个参数map的功能是对输入的参数进行转换操作。Filter过滤掉指定条件的数据。KeyBy按照指定的key进行分组。Reduce用来进行结果汇总合并。Window窗口函数根据某些特性将每个key的数据进行分组例如在5s内到达的数据
说说你知道的Flink分区策略
什么要搞懂什么是分区策略。分区策略是用来决定数据如何发送至下游。目前Flink支持了8中分区策略的实现。 上图是整个Flink实现的分区策略继承图GlobalPartitioner 数据会被分发到下游算子的第一个实例中进行处理。ShufflePartitioner 数据会被随机分发到下游算子的每一个实例中进行处理。RebalancePartitioner 数据会被循环发送到下游的每一个实例中进行处理。RescalePartitioner 这种分区器会根据上下游算子的并行度循环的方式输出到下游算子的每个实例。这里有点难以理解假设上游并行度为2编号为A和B。下游并行度为4编号为1234。那么A则把数据循环发送给1和2B则把数据循环发送给3和4。假设上游并行度为4编号为ABCD。下游并行度为2编号为12。那么A和B则把数据发送给1C和D则把数据发送给2。BroadcastPartitioner 广播分区会将上游数据输出到下游算子的每个实例中。适合于大数据集和小数据集做Jion的场景。ForwardPartitioner ForwardPartitioner用于将记录输出到下游本地的算子实例。它要求上下游算子并行度一样。简单的说ForwardPartitioner用来做数据的控制台打印。KeyGroupStreamPartitioner Hash分区器。会将数据按Key的Hash值输出到下游算子实例中。CustomPartitionerWrapper 用户自定义分区器。需要用户自己实现Partitioner接口来定义自己的分区逻辑。例如 static classCustomPartitionerimplementsPartitionerString { Override publicintpartition(String key, int numPartitions) {switch (key){case 1:return 1;case 2:return 2;case 3:return 3;default:return 4;}}} Flink的并行度了解吗Flink的并行度设置是怎样的
Flink中的任务被分为多个并行任务来执行其中每个并行的实例处理一部分数据。这些并行实例的数量被称为并行度。我们在实际生产环境中可以从四个不同层面设置并行度
操作算子层面(Operator Level)
执行环境层面(Execution Environment Level)
客户端层面(Client Level)
系统层面(System Level)
需要注意的优先级算子层面环境层面客户端层面系统层面。
Flink的Slot和parallelism有什么区别
官网上十分经典的图 slot是指taskmanager的并发执行能力假设我们将taskmanager.numberOfTaskSlots配置为3那么每一个taskmanager中分配3个TaskSlot, 3个taskmanager一共有9个TaskSlot。 parallelism是指taskmanager实际使用的并发能力。假设我们把parallelism.default设置为1那么9个TaskSlot只能用1个有8个空闲。
Flink有没有重启策略说说有哪几种
Flink实现了多种重启策略。
固定延迟重启策略Fixed Delay Restart Strategy
故障率重启策略Failure Rate Restart Strategy
没有重启策略No Restart Strategy
Fallback重启策略Fallback Restart Strategy 用过Flink中的分布式缓存吗如何使用
Flink实现的分布式缓存和Hadoop有异曲同工之妙。目的是在本地读取文件并把他放在taskmanager节点中防止task重复拉取。 val env ExecutionEnvironment.getExecutionEnvironment// register a file from HDFS
env.registerCachedFile(hdfs:///path/to/your/file, hdfsFile)// register a local executable file (script, executable, ...)
env.registerCachedFile(file:///path/to/exec/file, localExecFile, true)// define your program and execute...val input: DataSet[String] ...val result: DataSet[Integer] input.map(new MyMapper())...env.execute() 说说Flink中的广播变量使用时需要注意什么
我们知道Flink是并行的计算过程可能不在一个Slot中进行那么有一种情况即当我们需要访问同一份数据。那么Flink中的广播变量就是为了解决这种情况。我们可以把广播变量理解为是一个公共的共享变量我们可以把一个dataset数据集广播出去然后不同的task在节点上都能够获取到这个数据在每个节点上只会存在一份。
说说Flink中的窗口
来一张官网经典的图 Flink支持两种划分窗口的方式按照time和count。如果根据时间划分窗口那么它就是一个time-window如果根据数据划分窗口那么它就是一个count-window。flink支持窗口的两个重要属性size和interval如果sizeinterval,那么就会形成tumbling-window(无重叠数据)如果sizeinterval,那么就会形成sliding-window(有重叠数据)如果size interval,那么这种窗口将会丢失数据。比如每5秒钟统计过去3秒的通过路口汽车的数据将会漏掉2秒钟的数据。通过组合可以得出四种基本窗口
time-tumbling-window无重叠数据的时间窗口设置方式举例timeWindow(Time.seconds(5))
time-sliding-window有重叠数据的时间窗口设置方式举例timeWindow(Time.seconds(5), Time.seconds(3))
count-tumbling-window无重叠数据的数量窗口设置方式举例countWindow(5)
count-sliding-window有重叠数据的数量窗口设置方式举例countWindow(5,3)
说说Flink中的状态存储
Flink在做计算的过程中经常需要存储中间状态来避免数据丢失和状态恢复。选择的状态存储策略不同会影响状态持久化如何和checkpoint交互。Flink提供了三种状态存储方式MemoryStateBackend、FsStateBackend、RocksDBStateBackend。
Flink中的时间有哪几类
Flink中的时间和其他流式计算系统的时间一样分为三类事件时间摄入时间处理时间三种。如果以EventTime为基准来定义时间窗口将形成EventTimeWindow,要求消息本身就应该携带EventTime。如果以IngesingtTime为基准来定义时间窗口将形成IngestingTimeWindow,以source的systemTime为准。如果以ProcessingTime基准来定义时间窗口将形成ProcessingTimeWindow以operator的systemTime为准。
Flink中水印是什么概念起到什么作用
Watermark是Apache Flink为了处理EventTime窗口计算提出的一种机制,本质上是一种时间戳。 一般来讲Watermark经常和Window一起被用来处理乱序事件。
Flink Table SQL熟悉吗TableEnvironment这个类有什么作用
TableEnvironment是Table API和SQL集成的核心概念。这个类主要用来
在内部catalog中注册表
注册外部catalog
执行SQL查询
注册用户定义标量表或聚合函数
将DataStream或DataSet转换为表
持有对ExecutionEnvironment或StreamExecutionEnvironment的引用
Flink SQL的实现原理是什么是如何实现SQL解析的呢
首先大家要知道Flink的SQL解析是基于Apache Calcite这个开源框架。 基于此一次完整的SQL解析过程如下
用户使用对外提供Stream SQL的语法开发业务应用
用calcite对StreamSQL进行语法检验语法检验通过后转换成calcite的逻辑树节点最终形成calcite的逻辑计划
采用Flink自定义的优化规则和calcite火山模型、启发式模型共同对逻辑树进行优化生成最优的Flink物理计划
对物理计划采用janino codegen生成代码生成用低阶API DataStream描述的流应用提交到Flink平台执行
Flink是如何支持批流一体的 本道面试题考察的其实就是一句话Flink的开发者认为批处理是流处理的一种特殊情况。批处理是有限的流处理。Flink使用一个引擎支持了DataSet API和DataStream API。
Flink是如何做到高效的数据交换的
在一个Flink Job中数据需要在不同的task中进行交换整个数据交换是有TaskManager负责的TaskManager的网络组件首先从缓冲buffer中收集records然后再发送。Records并不是一个一个被发送的二是积累一个批次再发送batch技术可以更加高效的利用网络资源。
Flink是如何做容错的
Flink实现容错主要靠强大的CheckPoint机制和State机制。Checkpoint负责定时制作分布式快照、对程序中的状态进行备份State用来存储计算过程中的中间状态。
Flink分布式快照的原理是什么
Flink的分布式快照是根据Chandy-Lamport算法量身定做的。简单来说就是持续创建分布式数据流及其状态的一致快照。 核心思想是在input source端插入barrier控制barrier的同步来实现snapshot的备份和exactly-once语义。
Flink是如何保证Exactly-once语义的
Flink通过实现两阶段提交和状态保存来实现端到端的一致性语义。 分为以下几个步骤
开始事务beginTransaction创建一个临时文件夹来写把数据写入到这个文件夹里面
预提交preCommit将内存中缓存的数据写入文件并关闭
正式提交commit将之前写完的临时文件放入目标目录下。这代表着最终的数据会有一些延迟
丢弃abort丢弃临时文件
若失败发生在预提交成功后正式提交前。可以根据状态来提交预提交的数据也可删除预提交的数据。
Flink的kafka连接器有什么特别的地方
Flink源码中有一个独立的connector模块所有的其他connector都依赖于此模块Flink在1.9版本发布的全新kafka连接器摒弃了之前连接不同版本的kafka集群需要依赖不同版本的connector这种做法只需要依赖一个connector即可。
说说Flink的内存管理是如何做的?
Flink并不是将大量对象存在堆上而是将对象都序列化到一个预分配的内存块上。此外Flink大量的使用了堆外内存。如果需要处理的数据超出了内存限制则会将部分数据存储到硬盘上。Flink为了直接操作二进制数据实现了自己的序列化框架。理论上Flink的内存管理分为三部分
Network Buffers这个是在TaskManager启动的时候分配的这是一组用于缓存网络数据的内存每个块是32K默认分配2048个可以通过“taskmanager.network.numberOfBuffers”修改
Memory Manage pool大量的Memory Segment块用于运行时的算法Sort/Join/Shuffle等这部分启动的时候就会分配。下面这段代码根据配置文件中的各种参数来计算内存的分配方法。heap or off-heap这个放到下节谈内存的分配支持预分配和lazy load默认懒加载的方式。
User Code这部分是除了Memory Manager之外的内存用于User code和TaskManager本身的数据结构。
说说Flink的序列化如何做的?
Java本身自带的序列化和反序列化的功能但是辅助信息占用空间比较大在序列化对象时记录了过多的类信息。Apache Flink摒弃了Java原生的序列化方法以独特的方式处理数据类型和序列化包含自己的类型描述符泛型类型提取和类型序列化框架。TypeInformation是所有类型描述符的基类。它揭示了该类型的一些基本属性并且可以生成序列化器。TypeInformation支持以下几种类型
BasicTypeInfo:任意Java基本类型或String类型
BasicArrayTypeInfo:任意Java基本类型数组或String数组
WritableTypeInfo:任意Hadoop Writable接口的实现类
TupleTypeInfo:任意的Flink Tuple类型(支持Tuple1 to Tuple25)。Flink tuples是固定长度固定类型的Java Tuple实现
CaseClassTypeInfo:任意的Scala CaseClass(包括Scala tuples)
PojoTypeInfo:任意的POJO (Java or Scala)例如Java对象的所有成员变量要么是public修饰符定义要么有getter/setter方法
GenericTypeInfo:任意无法匹配之前几种类型的类
针对前六种类型数据集Flink皆可以自动生成对应的TypeSerializer能非常高效地对数据集进行序列化和反序列化。
Flink中的Window出现了数据倾斜你有什么解决办法
window产生数据倾斜指的是数据在不同的窗口内堆积的数据量相差过多。本质上产生这种情况的原因是数据源头发送的数据量速度不同导致的。出现这种情况一般通过两种方式来解决
在数据进入窗口前做预聚合
重新设计窗口聚合的key
Flink中在使用聚合函数GroupBy、Distinct、KeyBy等函数时出现数据热点该如何解决
数据倾斜和数据热点是所有大数据框架绕不过去的问题。处理这类问题主要从3个方面入手
在业务上规避这类问题
例如一个假设订单场景北京和上海两个城市订单量增长几十倍其余城市的数据量不变。这时候我们在进行聚合的时候北京和上海就会出现数据堆积我们可以单独数据北京和上海的数据。
Key的设计上
把热key进行拆分比如上个例子中的北京和上海可以把北京和上海按照地区进行拆分聚合。
参数设置
Flink 1.9.0 SQL(Blink Planner)性能优化中一项重要的改进就是升级了微批模型即MiniBatch。原理是缓存一定的数据后再触发处理以减少对State的访问从而提升吞吐和减少数据的输出量。
Flink任务延迟高想解决这个问题你会如何入手
在Flink的后台任务管理中我们可以看到Flink的哪个算子和task出现了反压。最主要的手段是资源调优和算子调优。资源调优即是对作业中的Operator的并发数parallelism、CPUcore、堆内存heap_memory等参数进行调优。作业参数调优包括并行度的设置State的设置checkpoint的设置。
Flink是如何处理反压的
Flink内部是基于producer-consumer模型来进行消息传递的Flink的反压设计也是基于这个模型。Flink使用了高效有界的分布式阻塞队列就像Java通用的阻塞队列BlockingQueue一样。下游消费者消费变慢上游就会受到阻塞。
Flink的反压和Strom有哪些不同
Storm是通过监控Bolt中的接收队列负载情况如果超过高水位值就会将反压信息写到ZookeeperZookeeper上的watch会通知该拓扑的所有Worker都进入反压状态最后Spout停止发送tuple。Flink中的反压使用了高效有界的分布式阻塞队列下游消费变慢会导致发送端阻塞。二者最大的区别是Flink是逐级反压而Storm是直接从源头降速。
Operator Chains算子链这个概念你了解吗
为了更高效地分布式执行Flink会尽可能地将operator的subtask链接chain在一起形成task。每个task在一个线程中执行。将operators链接成task是非常有效的优化它能减少线程之间的切换减少消息的序列化/反序列化减少数据在缓冲区的交换减少了延迟的同时提高整体的吞吐量。这就是我们所说的算子链。
Flink什么情况下才会把Operator chain在一起形成算子链
两个operator chain在一起的的条件
上下游的并行度一致
下游节点的入度为1也就是说下游节点没有来自其他节点的输入
上下游节点都在同一个slot group中下面会解释slot group
下游节点的chain策略为ALWAYS可以与上下游链接map、flatmap、filter等默认是ALWAYS
上游节点的chain策略为ALWAYS或HEAD只能与下游链接不能与上游链接Source默认是HEAD
两个节点间数据分区方式是forward参考理解数据流的分区
用户没有禁用chain
说说Flink1.9的新特性
支持hive读写支持UDF
Flink SQL TopN和GroupBy等优化
Checkpoint跟savepoint针对实际业务场景做了优化
Flink state查询
消费kafka数据的时候如何处理脏数据
可以在处理前加一个fliter算子将不符合规则的数据过滤出去。
Flink Job的提交流程
用户提交的Flink Job会被转化成一个DAG任务运行分别是StreamGraph、JobGraph、ExecutionGraphFlink中JobManager与TaskManagerJobManager与Client的交互是基于Akka工具包的是通过消息驱动。整个Flink Job的提交还包含着ActorSystem的创建JobManager的启动TaskManager的启动和注册。
Flink所谓三层图结构是哪几个图
一个Flink任务的DAG生成计算图大致经历以下三个过程
StreamGraph最接近代码所表达的逻辑层面的计算拓扑结构按照用户代码的执行顺序向StreamExecutionEnvironment添加StreamTransformation构成流式图。
JobGraph从StreamGraph生成将可以串联合并的节点进行合并设置节点之间的边安排资源共享slot槽位和放置相关联的节点上传任务所需的文件设置检查点配置等。相当于经过部分初始化和优化处理的任务图。
ExecutionGraph由JobGraph转换而来包含了任务具体执行所需的内容是最贴近底层实现的执行图。
JobManger在集群中扮演了什么角色
JobManager负责整个Flink集群任务的调度以及资源的管理从客户端中获取提交的应用然后根据集群中TaskManager上TaskSlot的使用情况为提交的应用分配相应的TaskSlot资源并命令TaskManager启动从客户端中获取的应用。JobManager相当于整个集群的Master节点且整个集群有且只有一个活跃的JobManager负责整个集群的任务管理和资源管理。JobManager和TaskManager之间通过Actor System进行通信获取任务执行的情况并通过Actor System将应用的任务执行情况发送给客户端。同时在任务执行的过程中Flink JobManager会触发Checkpoint操作每个TaskManager节点 收到Checkpoint触发指令后完成Checkpoint操作所有的Checkpoint协调过程都是在Fink JobManager中完成。当任务完成后Flink会将任务执行的信息反馈给客户端并且释放掉TaskManager中的资源以供下一次提交任务使用。
JobManger在集群启动过程中起到什么作用
JobManager的职责主要是接收Flink作业调度Task收集作业状态和管理TaskManager。它包含一个Actor并且做如下操作
RegisterTaskManager:它由想要注册到JobManager的TaskManager发送。注册成功会通过AcknowledgeRegistration消息进行Ack。
SubmitJob:由提交作业到系统的Client发送。提交的信息是JobGraph形式的作业描述信息。
CancelJob:请求取消指定id的作业。成功会返回CancellationSuccess否则返回CancellationFailure。
UpdateTaskExecutionState:由TaskManager发送用来更新执行节点(ExecutionVertex)的状态。成功则返回true否则返回false。
RequestNextInputSplit: TaskManager上的Task请求下一个输入split成功则返回NextInputSplit否则返回null。
JobStatusChanged 它意味着作业的状态(RUNNING, CANCELING, FINISHED,等)发生变化。这个消息由ExecutionGraph发送。
TaskManager在集群中扮演了什么角色
TaskManager相当于整个集群的Slave节点负责具体的任务执行和对应任务在每个节点上的资源申请和管理。客户端通过将编写好的Flink应用编译打包提交到JobManager然后JobManager会根据已注册在JobManager中TaskManager的资源情况将任务分配给有资源的TaskManager节点然后启动并运行任务。TaskManager从JobManager接收需要部署的任务然后使用Slot资源启动Task建立数据接入的网络连接接收数据并开始数据处理。同时TaskManager之间的数据交互都是通过数据流的方式进行的。可以看出Flink的任务运行其实是采用多线程的方式这和MapReduce多JVM进行的方式有很大的区别Flink能够极大提高CPU使用效率在多个任务和Task之间通过TaskSlot方式共享系统资源每个TaskManager中通过管理多个TaskSlot资源池进行对资源进行有效管理。
TaskManager在集群启动过程中起到什么作用
TaskManager的启动流程较为简单 启动类org.apache.flink.runtime.taskmanager.TaskManager核心启动方法 selectNetworkInterfaceAndRunTaskManager启动后直接向JobManager注册自己注册完成后进行部分模块的初始化。
Flink计算资源的调度是如何实现的
TaskManager中最细粒度的资源是Task slot代表了一个固定大小的资源子集每个TaskManager会将其所占有的资源平分给它的slot。
通过调整task slot的数量用户可以定义task之间是如何相互隔离的。每个TaskManager有一个slot也就意味着每个task运行在独立的JVM中。每个TaskManager有多个slot的话也就是说多个task运行在同一个JVM中。
而在同一个JVM进程中的task可以共享TCP连接基于多路复用和心跳消息可以减少数据的网络传输也能共享一些数据结构一定程度上减少了每个task的消耗。 每个slot可以接受单个task也可以接受多个连续task组成的pipeline如下图所示FlatMap函数占用一个taskslot而key Agg函数和sink函数共用一个taskslot 简述Flink的数据抽象及数据交换过程
Flink为了避免JVM的固有缺陷例如java对象存储密度低FGC影响吞吐和响应等实现了自主管理内存。MemorySegment就是Flink的内存抽象。默认情况下一个MemorySegment可以被看做是一个32kb大的内存块的抽象。这块内存既可以是JVM里的一个byte[]也可以是堆外内存DirectByteBuffer。在MemorySegment这个抽象之上Flink在数据从operator内的数据对象在向TaskManager上转移预备被发给下个节点的过程中使用的抽象或者说内存对象是Buffer。对接从Java对象转为Buffer的中间对象是另一个抽象StreamRecord。
Flink中的分布式快照机制是如何实现的
Flink的容错机制的核心部分是制作分布式数据流和操作算子状态的一致性快照。 这些快照充当一致性checkpoint系统可以在发生故障时回滚。 Flink用于制作这些快照的机制在“分布式数据流的轻量级异步快照”中进行了描述。 它受到分布式快照的标准Chandy-Lamport算法的启发专门针对Flink的执行模型而定制。 barriers在数据流源处被注入并行数据流中。快照n的barriers被插入的位置我们称之为Sn是快照所包含的数据在数据源中最大位置。例如在Apache Kafka中此位置将是分区中最后一条记录的偏移量。 将该位置Sn报告给checkpoint协调器Flink的JobManager。然后barriers向下游流动。当一个中间操作算子从其所有输入流中收到快照n的barriers时它会为快照n发出barriers进入其所有输出流中。 一旦sink操作算子流式DAG的末端从其所有输入流接收到barriers n它就向checkpoint协调器确认快照n完成。在所有sink确认快照后意味快照着已完成。一旦完成快照njob将永远不再向数据源请求Sn之前的记录因为此时这些记录及其后续记录将已经通过整个数据流拓扑也即是已经被处理结束。
简单说说FlinkSQL的是如何实现的
Flink将SQL校验、SQL解析以及SQL优化交给了Apache Calcite。Calcite在其他很多开源项目里也都应用到了譬如Apache Hive, Apache Drill, Apache Kylin, Cascading。Calcite在新的架构中处于核心的地位如下图所示。 构建抽象语法树的事情交给了Calcite去做。SQL query会经过Calcite解析器转变成SQL节点树通过验证后构建成Calcite的抽象语法树也就是图中的Logical Plan。另一边Table API上的调用会构建成Table API的抽象语法树并通过Calcite提供的RelBuilder转变成Calcite的抽象语法树。然后依次被转换成逻辑执行计划和物理执行计划。在提交任务后会分发到各个TaskManager中运行在运行时会使用Janino编译器编译代码后运行。
Flink的窗口了解哪些都有什么区别有哪几种?如何定义?
Flink窗口函数时间语义相关的问题
介绍下Flink的watermark(水位线)watermark需要实现哪个实现类在何处定义?有什么作用?
Flink的窗口(实现)机制
讲一下双流JOIN
说下Flink的CEP
说一说Flink的Checkpoint机制
Flink的Checkpoint底层如何实现的?savepoint和checkpoint有什么区别?
Flink的Checkpoint流程
Flink Checkpoint的作用
Flink中Checkpoint超时原因
Flink的ExactlyOnce语义怎么保证?
Flink的端到端ExactlyOnce
Flink的水印(Watermark)有哪几种?
Flink的时间语义
Flink相比于其它流式处理框架的优点?
Flink和Spark的区别?什么情况下使用Flink?有什么优点?
Flink backPressure反压机制指标监控你是怎么做的?
Flink如何保证一致性?
Flink支持JobMaster的HA啊?原理是怎么样的?
如何确定Flink任务的合理并行度?
Flink任务如何实现端到端一致?
Flink如何处理背(反)压?
Flink解决数据延迟的问题
Flink消费kafka分区的数据时flink件务并行度之间的关系
使用flink-client消费kafka数据还是使用flink-connector消费
如何动态修改Flink的配置前提是Flink不能重启
Flink流批一体解释一下
说一下Flink的check和barrier
说一下Flink状态机制
Flink广播流
Flink实时topN
在实习中一般都怎么用Flink
Savepoint知道是什么吗
为什么用Flink不用别的微批考虑过吗
解释一下啥叫背压
Flink分布式快照
Flink SQL解析过程
Flink on YARN模式
Flink如何保证数据不丢失 参考【大数据面试题】Flink第一弹60连发 - 知乎