Flink高频面试题(中级篇)

1. Flink是如何做到流批一体的? 不论是DataSet API 还是 DataStream API 都是依赖于Runtime来进行实现的。其实也就是设计理念的问题,Spark和Flink的设计思路有着本质的区别,Flink认为批是流的特例,Spark认为只要我的批无限的小,那么就是流。
2. Flink是如何做到高效的网络数据交换的? 在一个Flink Job里面,数据需要在不同的task来进行交互,整个数据交互的过程是由TaskManager来进行负责,TaskManagert的网络组建首先从缓冲buffer中收集records,然后在发送。封装批次能大大的减少网络连接次数,因为在分布式场景中网络IO是稀缺资源,如果看过我的kafka源码剖析的话,其实我们发现kafka也是进行的records的封装,这样可以增加吞吐。
3. Flink是如何做到容错的? Flink实现容错主要依靠强大的checkpoing机制和state机制。state分为,opertor State和keyed state。checkpoint是用来负责定时制作快照的,对程序中的状态进行备份,State是用来存储计算过程中的中间状态,并且这个就是我们的快照。
4. Flink 分布式快照的原理是什么? Flink的分布式快照是根据Chandy-Lamport算法量身定做的。简单来说就是持续创建分布式数据流及其状态的一致快照。其实是通过statebackend来实现的,并且有个栅栏机制,也就是barrier。
首先需要确保的是所有的subtask都进行提交了快照。其实也就是每个subtask就会生成一个文件。
5. Flink是如何保证Exactly-once语义的? 【Flink高频面试题(中级篇)】Flink通过实现2PC来实现两阶段提交同时还有状态。来实现端到端的一致性的。
1、开始事务 创建一个临时文件夹,把数据写入到这个文件夹里面
2、预提交 将内存中缓存的数据写入文件并关闭
3、正式提交 将之前写完的临时文件放入目标目录下。这代表这最终的数据。
4、丢失 执行成功的时候会吧临时文件都干掉
5、若失败发生在预提交之后,正式提交前,可以根据状态来提交预提交的数据,也可以删除预提交的数据
我之前在分布式原理中写过2PC事务!
其实这些东西,可以自己写一个Flink checkpoint Function就可以明白很多东西
6. Flink内存管理 FLink并没有使用很多的堆,他自己开辟了一个内存块,Flink他大量使用了堆外内存,和kafka是很类似的,如果需要处理的数据就溢写到磁盘上。
Flink的内存分为三个部分(还没有看Flink源码,看过之后我会详细的再来看看这一块):

  • Network Buffers:网络缓冲区
  • Memory Manage pool :这一块内存用来运行时操作的内存
  • User Code 这一部分是除了Memory Manager之外的内存用于User code和 TaskManager本身的数据结构
7. Flink中的Window出现了数据倾斜,你有什么解决办法? window产生数据倾斜指的是数据在不同的窗口内堆积的数据量相差过多。本质上产生这种情况的原因是数据源头发送的数据量速度不同导致的。出现这种情况一般通过两种方式来解决:
1、在数据进入窗口之前做预聚合
2、重新设计窗口聚合的key
8. Flink在使用聚合函数之后出现数据热点怎么解决 其实可以借鉴sparkstreaming中的数据处理场景,其实目前来看,业务化向宽表化发展,目前依赖于Olap强大的计算能力,来满足业务的无限扩张。因为业务的需求,永远是永无止境的!
9. Flink 任务延迟高,想解决这个问题,你会如何入手? 在Flink的后台任务管理中,我们可以看到Flink的那个算子和task出现了反压。最主要的手段是资源调优和算子调优。例如调大并发,
增加运行任务的资源。缩短窗口时长。
10. Flink是如何处理反压的? 其实Flink是自带反压策略的,也就是每个taskmanager和jobmanger都是有通信的,假如下游处理任务时间太长,那么source端就会调整自己的拉取数据的量级,来减少这种问题。
11. Operator Chains 你知道是什么吗? 为了更高效地分布式执行,Flink会尽可能地将operator的subtask链接(chain)在一起形成task。每个task在一个线程中执行。将operators链接成task是非常有效的优化:它能减少线程之间的切换,减少消息的序列化/反序列化,减少数据在缓冲区的交换,减少了延迟的同时提高整体的吞吐量。这就是我们所说的算子链。其实就是尽量吧操作逻辑放入到同一个subtask里面也就是一个槽TaskSolt
12. Flink什么情况下才会把Operator chain在一起形成算子链? 1、上下游并行度一致
2、下游数据没有其他的输入
3、上下游节点都在同一个soltgroup中,默认是一样的,如果不是,单独指定的算子资源,会独占TaskSolt
4、没有keyed操作
5、数据发送策略是forward
6、用户没有禁用chain

    推荐阅读