Flink 笔记
第4章 运行架构
4.1 运行架构
Flink运行时包含2种进程:1个JobManager和至少1个TaskManager
4.2 核心概念
TaskManager
TaskManager 是一个JVM进程。
经验:TaskManager内存设置,一般一个TaskManager 4-6G内存;再大反而不好,因为可能会发生GC,发生GC时TaskManager不对外工作,若内存很大,发生GC时 时间会比较久。
内存设置超出yarn上限也不好。yarn一个任务的内存上限默认是8G。
Slot(插槽)
Slot:对CPU和内存的封装
一个TaskManager有多个slot, 多个slot之间对内存进行隔离,共享一个TaskManager的CPU。
Task对应合并后的算子
- 以下概念一一对应:
subtask(子任务)、线程;
slot、最大并行度。
一个算子有几个并行度就有几个子任务subtask
经验:一般设置slot数量为TaskManager工作节点的核心数的1倍或2倍。即1:1 或 1:2
ExecutionGraph(执行图)
由Flink程序直接映射成的数据流图是StreamGraph,也被称为****逻辑流图****,因为它们表示的是计算逻辑的高级视图。为了执行一个流处理程序,Flink需要将逻辑流图转换为物理数据流图(也叫执行图),详细说明程序的执行方式。
Flink 中的执行图可以分成四层:1. StreamGraph ->2. JobGraph -> 3. ExecutionGraph -> 4. Physical Graph。
1.StreamGraph 和 2.JobGraph 都是在客户端。(Application Mode 是在JobManager)
1. StreamGraph:
是根据用户通过 Stream API 编写的代码生成的最初的图。用来表示****程序的拓扑结构****。
2. JobGraph:
比1.StreamGraph 多了操作链的优化。
作用:算子与算子之间减少数据的传输。(减少在数据节点之间传输需要序列化/反序列化的传输消耗)
3. ExecutionGraph:
JobManager 根据 2. JobGraph 生成 3. ExecutionGraph。3. ExecutionGraph是 2.JobGraph的并行化版本,是调度层最核心的数据结构。
4. Physical Graph:
JobManager 根据 3. ExecutionGraph 对 Job 进行调度后,在各个TaskManager 上部署 Task 后形成的“图”,并不是一个具体的数据结构。
例子:
2个并发度(Source为1个并发度)的 SocketTextStreamWordCount 四层执行图的演变过程
env.socketTextStream().flatMap(…).keyBy(0).sum(1).print();
第5章 核心编程
- Flink使用Rich富函数来代替Spark的mapPartitions或foreachPartition. 在Rich函数的open() 和 close() 方法来实现对每个并行度的操作。
第7章 高阶编程
7.3.7 多并行度下WaterMark的传递
总结: 多并行度的条件下, 向下游传递WaterMark的时候, 总是以最小的那个WaterMark为准! 木桶原理!
数据倾斜水印不更新问题的解决方案
- 隔一段时间往所有并行度扔一个无用数据,专门用于更新水印。(无用数据到后面再过滤)
- 自定义触发器,每隔一段时间用处理时间触发一次。(这种方式一般不怎么用)
- Flink官方提供的解决方案
官网:https://nightlies.apache.org/flink/flink-docs-release-1.13/zh/docs/dev/datastream/event-time/generating_watermarks/#%e5%a4%84%e7%90%86%e7%a9%ba%e9%97%b2%e6%95%b0%e6%8d%ae%e6%ba%90 标题:处理空闲数据源
// 如果生成水印算子的某个并行度数据5s没有更新,则水印的传递以其他并行度为准
.withIdleness(Duration.ofSeconds(5))
定时器
定时器只能在keyBy之后使用,每个key的定时器相互独立。
加了窗口之后也用不了定时器。