-
-
11. 为什么使用Flink on Yarn或Spark on Yarn?
14. Flink on YARN部署:Session 会话模式---集群作业提交流程
15. Flink on YARN部署:Per-Job 单作业模式---集群作业提交流程
16. Flink从kafka中消费数据时,设置offset的5种方式?
17. Flink从kafka中消费数据时,设置topic的三种方式?
18. 针对基于事件时间EventTime窗口分析,如何解决乱序数据,延迟数据,迟到数据的呢?
25. Flink Checkpoint(分布式快照)之执行流程
26. 什么是CheckpointCoordinator检查点协调器?
30. Flink Checkpoint之StateBackend
31. 状态、状态后端、Checkpoint 三者之间的区别及关系?
35. Flink + Kafka 如何实现端到端一次性语义呢?
37. exactlyonce和EndtoEnd ExactlyOnce的区别?
38. Flink 如何实现End to End ExactlyOnce
41. Flink + MySQL 如何实现端到端一次性语义呢?
43. 什么条件下进行Operator合并,形成Operator Chain?有什么好处?
46. 同一份数据通过Flink程序分别存储到hbase和hdfs(hive)中, 查询的条目数不同, hive数据比hbase数据多 为什么?
47. Flink相比传统的Spark Streaming有什么区别?
56. Flink Table & SQL 熟悉吗?TableEnvironment这个类有什么作用
57. Flink SQL的实现原理是什么?是如何实现 SQL 解析的呢?
59. Flink 的 kafka 连接器有什么特别的地方?
62. Flink中在使用聚合函数 GroupBy、Distinct、KeyBy 等函数时出现数据热点该如何解决?
63. Flink任务延迟高,想解决这个问题,你会如何入手?
72. Flink SQL API State TTL 的过期机制?
74. Flink 配置 State TTL 时都有哪些配置项?每种配置项的作用?
75. Flink State TTL 是怎么做到数据过期的?
76. window 后面跟 aggregate 和 process 的两个窗口计算的区别是什么?
82. Flink中的Window出现了数据倾斜,你有什么解决办法?
83. Flink 任务 failover 之后,可能会重复写出数据到 Sink 中,你们公司是怎么做到端对端 exactly-once 的?
86. 使用用户心跳日志(20s 上报一次)计算同时在线用户、DAU 指标,你怎么设计链路?
87. 实时数仓的分层设计方案是怎样的?和离线数仓又有什么区别?是怎么兼顾时效性和通用性的?
88. 实时数仓用到的维表都有哪些类型?分别是通过什么样的方式构建的?
-
1.概述Flink
Flink 是一个开源的、基于流的、有状态的计算框架。它是分布式地执行的,具备低延迟、高吞吐、容错机制的优秀性能,并且非常擅长处理有状态的复杂计算逻辑场景。Flink提供了诸多高抽象层的API以便用户编写分布式任务:
DataSet API, 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持Java、Scala和Python。
DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用户可以方便地对分布式数据流进行各种操作,支持Java和Scala。
Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作,支持Java和Scala。特点:
高吞吐,低延迟,高性能,分布式,支持有状态计算的精确性一次语义框架。支持事件时间窗口操作,支持程序自动优化
2.应用场景
实时数仓,实时分析,实时监控,实时报表
3.JobManager和TaskManager的作用?
1)、JobManager:主节点Master,为每个Flink Job分配资源,管理和监控Job运行。
主要负责调度 Flink Job 并协调 Task 做 checkpoint;
从 Client 处接收到 Job 和JAR 包等资源后,会生成优化后的执行计划,并以 Task 为单元调度到各个 TaskManager去执行;
2)、TaskManager:从节点Workers,调度每个Job中Task任务执行,及负责Task监控和容错等。
在启动的时候设置:Slot 槽位数(资源槽),每个 slot 能启动 Task,其中Task 为线程。4.Flink各个组件的功能
(1)客户端
客户端主要用于提交任务到集群,在Session或Per Job模式中,客户端程序还要负责解析用户代码,生成JobGraph,在Application模式中,直接提交用户jar和执行参数即可。
客户端一般支持两种模式:detached模式,客户端提交后自动退出。attached模式,客户端提交后阻塞等待任务执行完毕再退出。
(2)JobManager
JM负责决定应用何时调度task,在task执行结束或失败时如何处理,协调检查点、故障恢复。该进程主要由下面几个部分组成:
ResourceManager(flink内部的),负责资源的管理,申请和释放、管理slot(Flink集群中最细粒度的资源管理单元)。
Flink实现了多种RM的实现方案以适配多种资源管理框架,如yarn、mesos、k8s或standalone。在standalone模式下,RM只能分配slot,而不能启动新的TM。注意:这里所说的RM跟Yarn的RM不是一个东西,这里的RM是JM中的一个独立的服务。
Dispatcher(通过rest方式),提供Flink提交任务的rest接口,负责接收用户提供的job,为每个提交的任务启动新的JobMaster,为所有的任务提供web ui,查询任务执行状态。
JobMaster,负责管理执行单个JobGraph,多个任务可以同时在一个集群中启动,每个都有自己的JobMaster。注意这里的JobMaster和JobManager的区别。
(3)TaskManager
TM也叫做worker,主要负责执行具体的task任务,用于执行数据流图中的任务,缓存并交换数据。集群至少有一个TM,TM中最小的资源管理单元是Slot,每个Slot可以执行一个Task,因此TM中slot的数量就代表同时可以执行任务的数量。5.Slot 共享主要的好处有以下几点
(1)可以起到隔离内存的作用,防止多个不同job的task竞争内存;
(2)Slot个数就代表了一个Flink程序的最高并行度,简化了性能调优的过程;
(3)允许多个Task共享Slot,提升了资源利用率。举一个实际的例子,kafka有3个partition,对应flink 的source有3个subtask,而keyBy设置的并行度为20,这个时候如果Slot不能共享的话,需要占用 23个Slot,如果允许共享的话,只需要20个Slot即可(Slot默认共享规则计算为20个);
6.Parallelism
一个特定算子的子任务(subtask)的个数被称之为其并行度(parallelism),一般情况下,一个流程序的并行度,可以认为就是其所有算子中最大的并行度。一个程序中,不同的算子可能具有不同的并行度Stream在算子之间传输数据的形式可以是one-to-one(forwarding)的模式也可以是redistributing的模式,具体是哪一种形式,取决于算子的种类。
one-to-one:stream(比如在source和map operator之间)维护着分区以及元素的顺序。那意味着flatMap算子的子任务看到的元素的个数以及顺序跟source 算子的子任务生产的元素的个数、顺序相同,map、fliter、flatMap等算子都是one-to-one的对应关系。类似于spark中的窄依赖
Redistributing:stream(map()跟keyBy/window之间或者keyBy/window跟sink之间)的分区会发生改变。每一个算子的子任务依据所选择的transformation发送数据到不同的目标任务。例如,keyBy()基于hashCode重分区、broadcast、rebalance(并行度的改变(轮询))会随机重新分区,这些算子都会引起redistribute过程,而redistribute过程就类似于Spark中的shuffle过程。类似于spark中的宽依赖
7.在Flink 中,并行度设置可以从4个层次级别指定
• 1)、Operator Level(算子级别)(可以使用)
一个operator、source和sink的并行度可以通过调用 operator.setParallelism()方法来指定。
• 2)、Execution Environment Level(Env级别,可以使用)
执行环境并行度可以通过调用env.setParallelism()方法指定。
• 3)、Client Level(客户端级别,推荐使用)
并行度可以在客户端将job提交到Flink时设定,对于CLI客户端,flink run -p,可以通过-p参数指定并行度
• 4)、System Level(系统默认级别,尽量不使用)
在系统级可以通过设置flink-conf.yaml文件中的parallelism.default属性来指定所有执行环境的默认并行度。
总结:并行度的优先级:算子级别 env级别 Client级别 系统默认级别
• 1)、如果source不可以被并行执行,即使指定了并行度为多个,也不会生效,如从TCP Socket消费数据
• 2)、实际生产中,推荐在算子级别显示指定各自的并行度,方便进行显示和精确的资源控制。
3)、 parallelism是动态的概念,是指程序运行时实际使用的并发能力;slot是静态的概念,是指taskmanager具有的并发执行能力。8.Flink的Slot和parallelism区别
slot决定单个taskmanager并发执行能力((TaskManager 中的不同slot不会CPU隔离,也不会在运行时相互竞争Flink托管内存 ,而是一开始就瓜分了Flink托管内存))
parallelism决定所有taskmanager的并发能力
9.Task与SubTask
算子的一个并行子任务,叫做subtask。 Task是由 不同算子的 subtask 根据一定的规则(满足 One to One的关系,并且并行度相同) 合并在一起形成Flink执行时,由于并行度的设置,可以将同一个Job不同算子的subtask放在同一块内存中进行处理,那么这样在执行时就可以合并成一个完整的task进行处理,而不是独立的子任务,这样就减少了子任务(SubTask)之间调度和数据传递的性能损耗
10.Operator Chains(任务链)
在Flink执行计算时,多个算子的subTask到底能不能组成一个Task是不确定的。比如读取并行度为1的数据源,但是map映射时使用并行度2,那么这样map算子就存在两个subtask,可以数据源读取时只有一个subtask,那么就会导致其中一个subtask无法链接成task,就需要在其他slot中执行。所以在这种情况下,到底哪些subtask可以组合,哪些subtask不能组合,就需要动态调整,这就需要用到一种任务链的操作进行设置。
任务链必须满足两个条件:one-to-one的数据传输 并且 并行度相同
11.为什么使用Flink on Yarn或Spark on Yarn?
1、Yarn的资源可以按需使用,提高集群的资源利用率
2、Yarn的任
-
【Flink面试题】(4.8M)
于 2023-10-29 13:29:10 首次发布