- 1.Flink 是如何支持批流一体的
- 2.Flink 是如何做到高效的数据交换的
- 3.Flink 是如何做容错的
- 4.Flink 分布式快照的原理是什么
- 5.Flink 是如何保证 Exactly-once 语义的
- 6.说说 Flink 的内存管理是如何做的
- 7.Flink 的序列化
- 8. Flink 中的 Window 出现了数据倾斜,你有什么解决办法
- 9.Flink SQL 的实现原理是什么
Flink 的开发者认为批处理是流处理的一种特殊情况。批处理是有限的流处理。Flink 使用一个引擎支持了 DataSet API 和 DataStream API。
Flink Job 中,数据需要在不同的 task 中进行交换,整个数据交换是有 TaskManager 负责的,TaskManager 的网络组件首先从缓冲 buffer 中收集 records,然后再发送。Records 并不是一个一个被发送的,二是积累一个批次再发送,batch 技术可以更加高效的利用网络资源。
3.Flink 是如何做容错的CheckPoint 机制和 State 机制
CheckPoint机制:负责定时制作分布式快照,对程序的状态进行备份
State:存储计算过程的中间状态
分布式快照是Chandy-Lamport 算法而成的。
持续创建分布式数据流及其状态的一致快照。
核心思想是在input source端插入barrier,控制barrier的同步实现快照的备份和exactly-once 语义。
5.Flink 是如何保证 Exactly-once 语义的通过实现两阶段提交和状态保存来实现端到端的一致性语义
- 开始事务(beginTransaction)创建一个临时文件夹,来写把数据写入到这个文件夹里面
- 预提交(preCommit)将内存中缓存的数据写入文件并关闭
- 正式提交(commit)将之前写完的临时文件放入目标目录下。这代表着最终的数据会
有一些延迟 - 丢弃(abort)丢弃临时文件
- 若失败发生在预提交成功后,正式提交前。可以根据状态来提交预提交的数据,也可删
除预提交的数据。
Flink 并不是将大量对象存在堆上,而是将对象都序列化到一个预分配的内存块上。Flink使用了堆外内存。
如果需要处理的数据超出了内存限制,则会将部分数据存储到硬盘上。
1.Network Buffers:这个是在 TaskManager 启动的时候分配的,这是一组用于缓存网络数据的内存,每一个块是32K,默认为2048个。
2.Memory Manage Pool:大量的 Memory Segment 块,用于运行时的算法Sort/Join/Shuffle启动时分配。
3.Use Code:
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
Flink SQL解析是基于Apache Calcite框架的
1.用户使用对外提供的Stream sql进行业务
2.Apache Calcite对Stream sql进行语法解析,生成calcite的逻辑树节点,最后变成calcite的逻辑计划
3.采用flink自定义优化规则和calcite火山模型, 启发式模型对逻辑树优化,生成最终的flink物理计划
4.对物理计划采用janino codegen生成代码,生成用低阶Api DataStream描述的流应用,提交到flink平台执行
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)