Flink 笔记

Flink 笔记

第4章 运行架构

4.1 运行架构

Flink 笔记_第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();

Flink 笔记_第2张图片

第5章 核心编程

  • Flink使用Rich富函数来代替Spark的mapPartitions或foreachPartition. 在Rich函数的open() 和 close() 方法来实现对每个并行度的操作。

第7章 高阶编程

7.3.7 多并行度下WaterMark的传递

总结: 多并行度的条件下, 向下游传递WaterMark的时候, 总是以最小的那个WaterMark为准! 木桶原理!

数据倾斜水印不更新问题的解决方案

  1. 隔一段时间往所有并行度扔一个无用数据,专门用于更新水印。(无用数据到后面再过滤)
  2. 自定义触发器,每隔一段时间用处理时间触发一次。(这种方式一般不怎么用)
  3. 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的定时器相互独立。

加了窗口之后也用不了定时器。

你可能感兴趣的:(flink,大数据,flink,java,大数据)