1. 概述Flink
2. 应用场景
3. JobManager和TaskManager的作用?
4. Flink各个组件的功能
5. Slot 共享主要的好处有以下几点
6. Parallelism
7. 在Flink 中,并行度设置可以从4个层次级别指定
8. Flink的Slot和parallelism区别
9. Task与SubTask
10. Operator Chains(任务链)
11. 为什么使用Flink on Yarn或Spark on Yarn?
12. Flink on Yarn 三种运行模式区别?
13. 你们公司怎么提交的实时任务?
14. Flink on YARN部署:Session 会话模式---集群作业提交流程
15. Flink on YARN部署:Per-Job 单作业模式---集群作业提交流程
16. Flink从kafka中消费数据时,设置offset的5种方式?
17. Flink从kafka中消费数据时,设置topic的三种方式?
18. 针对基于事件时间EventTime窗口分析,如何解决乱序数据,延迟数据,迟到数据的呢?
19. Flink 的状态
20. Flink状态存储在哪里?
21. 为什么流式计算中需要State状态呢?
22. Checkpoint与State区别
23. Savepoint
24. Checkpoint属性设置
25. Flink Checkpoint(分布式快照)之执行流程
26. 什么是CheckpointCoordinator检查点协调器?
27. Flink Checkpoint之自动重启恢复状态
28. Flink是如何做容错的?
29. Flink如何容错(重要,面试很频繁)
30. Flink Checkpoint之StateBackend
31. 状态、状态后端、Checkpoint 三者之间的区别及关系?
32. 当作业失败后,从保存点如何恢复作业?
33. Flink的监控页面,有了解吗,主要关注那些指标?
34. 实现精确一致性语义
35. Flink + Kafka 如何实现端到端一次性语义呢?
36. Flink on YARN 运行机制
37. exactlyonce和EndtoEnd ExactlyOnce的区别?
38. Flink 如何实现End to End ExactlyOnce
39. 在Flink中Data Sink要实现精确一次性
40. 预写日志WAL和两阶段提交2PC区别:
41. Flink + MySQL 如何实现端到端一次性语义呢?
42. Exactly once 两阶段提交步骤总结:
43. 什么条件下进行Operator合并,形成Operator Chain?有什么好处?
44. 在Flink 并行度
45. Flink 与 Hive 的集成体现两个方面优势:
46. 同一份数据通过Flink程序分别存储到hbase和hdfs(hive)中, 查询的条目数不同, hive数据比hbase数据多 为什么?
47. Flink相比传统的Spark Streaming有什么区别?
48. 你们的Flink集群规模多大?
49. Flink如何保证精确一次性消费
50. Flink如何做压力测试和监控?
51. Flink的编程模型
52. DataStream分区算子
53. Flink中的时间有哪几类?
54. Flink的watermark?
55. Flink 的运行中必须依靠 Hadoop组件吗?
56. Flink Table & SQL 熟悉吗?TableEnvironment这个类有什么作用
57. Flink SQL的实现原理是什么?是如何实现 SQL 解析的呢?
58. Flink是如何支持批流一体的?
59. Flink 的 kafka 连接器有什么特别的地方?
60. Flink 分布式快照的原理是什么?
61. Flink是如何做到高效的数据交换的?
62. Flink中在使用聚合函数 GroupBy、Distinct、KeyBy 等函数时出现数据热点该如何解决?
63. Flink任务延迟高,想解决这个问题,你会如何入手?
64. 什么是Flink流批一体化,如何实现?
65. 广播变量
66. 批处理中广播变量与分布式缓存的区别
67. Flink Job 调度执行流程
68. Flink 作业的问题定位
69. Flink优化
70. 如何处理空闲数据源
71. 设置状态有效期 (TTL)
72. Flink SQL API State TTL 的过期机制?
73. 在实际清理state时,有哪几种策略?
74. Flink 配置 State TTL 时都有哪些配置项?每种配置项的作用?
75. Flink State TTL 是怎么做到数据过期的?
76. window 后面跟 aggregate 和 process 的两个窗口计算的区别是什么?
77. Table API 和 SQL 程序结构
78. TableEnvironment
79. 临时表和永久表
80. 动态表转换成数据流的方式
81. 怎么合理的评估 Flink 任务的并行度?
82. Flink中的Window出现了数据倾斜,你有什么解决办法?
83. Flink 任务 failover 之后,可能会重复写出数据到 Sink 中,你们公司是怎么做到端对端 exactly-once 的?
84. 反压
85. 监控及保障手段来保障实时指标的质量
86. 使用用户心跳日志(20s 上报一次)计算同时在线用户、DAU 指标,你怎么设计链路?
87. 实时数仓的分层设计方案是怎样的?和离线数仓又有什么区别?是怎么兼顾时效性和通用性的?
88. 实时数仓用到的维表都有哪些类型?分别是通过什么样的方式构建的?
89. Flink的窗口机制,以及各组件之间是如何相互工作的?
90. Flink如何进行资源管理的?
91. 为什么Flink使用自主内存而不用JVM内存管理?
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的任务有优先级,根据优先级运行作业
3、基于Yarn调度系统,能够自动化地处理各个角色的 Failover(容错)。当应用程序MR、Spark、Flink运行在YARN集群上时,可以实现容灾恢复。
(例如:JobManager 进程和 TaskManager 进程都由 Yarn NodeManager 监控;
如果 JobManager 进程异常退出,则 Yarn ResourceManager 会重新调度 JobManager到其他机器;
如果 TaskManager 进程异常退出,JobManager 会收到消息并重新向 Yarn ResourceManager 申请资源,重新启动 TaskManager。)
12.Flink on Yarn 三种运行模式区别?
# 1、Session 模式:
- 特点:需要先申请资源,使用Flink中的yarn-session(yarn客户端),启动JobManager和TaskManger
- 优点:不需要每次递交作业申请资源,而是使用已经申请好的资源,从而提高执行效率
- 缺点:作业执行完成以后,资源不会被释放,因此一直会占用系统资源。由于多个任务会共享相同的集群,因此任务间会存在竞争,比如网络带宽等。如果某个TM挂掉,上面的所有任务都会失败
- 应用场景:适合作业递交比较频繁的场景,小作业比较多的场景
所有作业Job共享1个集群资源,隔离性差,JM 负载瓶颈,每个Job中main 方法在客户端执行。
# 2、Per-Job 模式:
- 特点:每次递交作业都需要申请一次资源
- 优点