文章目录

1.Flink 是如何支持批流一体的

Flink面试题_3_big data
Flink 的开发者认为批处理是流处理的一种特殊情况。批处理是有限的流处理。Flink 使用一个引擎支持了 DataSet API 和 DataStream API。

2.Flink 是如何做到高效的数据交换的

Flink Job 中,数据需要在不同的 task 中进行交换,整个数据交换是有 TaskManager 负责的,TaskManager 的网络组件首先从缓冲 buffer 中收集 records,然后再发送。Records 并不是一个一个被发送的,二是积累一个批次再发送,batch 技术可以更加高效的利用网络资源。

3.Flink 是如何做容错的

CheckPoint 机制和 State 机制
CheckPoint机制:负责定时制作分布式快照,对程序的状态进行备份
State:存储计算过程的中间状态

4.Flink 分布式快照的原理是什么

分布式快照是Chandy-Lamport 算法而成的。
持续创建分布式数据流及其状态的一致快照。

Flink面试题_3_大数据_02

核心思想是在input source端插入barrier,控制barrier的同步实现快照的备份和exactly-once 语义。

5.Flink 是如何保证 Exactly-once 语义的

通过实现两阶段提交和状态保存来实现端到端的一致性语义

  • 开始事务(beginTransaction)创建一个临时文件夹,来写把数据写入到这个文件夹里面
  • 预提交(preCommit)将内存中缓存的数据写入文件并关闭
  • 正式提交(commit)将之前写完的临时文件放入目标目录下。这代表着最终的数据会
    有一些延迟
  • 丢弃(abort)丢弃临时文件
  • 若失败发生在预提交成功后,正式提交前。可以根据状态来提交预提交的数据,也可删
    除预提交的数据。

6.说说 Flink 的内存管理是如何做的

Flink 并不是将大量对象存在堆上,而是将对象都序列化到一个预分配的内存块上。Flink使用了堆外内存。

如果需要处理的数据超出了内存限制,则会将部分数据存储到硬盘上。

1.Network Buffers:这个是在 TaskManager 启动的时候分配的,这是一组用于缓存网络数据的内存,每一个块是32K,默认为2048个。
2.Memory Manage Pool:大量的 Memory Segment 块,用于运行时的算法Sort/Join/Shuffle启动时分配。
3.Use Code:

7.Flink 的序列化

TypeInformation:类型描述符的基类,可以生成序列化器

1.BasicTypeInfo: 任意 Java 基本类型或 String 类型
2.BaseicArrayTypeInfo:任意Java数组类型或String数组
3.WritableTypeInfo: 任意 Hadoop Writable 接口的实现类
4.TupleTypeInfo: 任意的 Flink Tuple 类型(Tuple - Tuple25)
5.CaseClassTypeInfo: 任意的 Scala CaseClass(包括 Scala tuples)
6.PojoTypeInfo: 任意的 POJO (Java or Scala)

针对前六种类型数据集,Flink 皆可以自动生成对应的 TypeSerializer,能非常高效地对数据集进行序列化和反序列化。

8. Flink 中的 Window 出现了数据倾斜,你有什么解决办法

window发送数据倾斜,本质是不同的窗口数据差过多,数据源的原因

1.在数据进入窗口的时候进行预聚合
2.重写设计窗口聚合的key

9.Flink SQL 的实现原理是什么

Flink SQL解析是基于Apache Calcite框架的

1.用户使用对外提供的Stream sql进行业务
2.Apache Calcite对Stream sql进行语法解析,生成calcite的逻辑树节点,最后变成calcite的逻辑计划
3.采用flink自定义优化规则和calcite火山模型, 启发式模型对逻辑树优化,生成最终的flink物理计划
4.对物理计划采用janino codegen生成代码,生成用低阶Api DataStream描述的流应用,提交到flink平台执行