Flink 模块

image.png

Flink 架构

补充

  1. 每个工作程序(TaskManager)是一个JVM进程,并且可以在单独的线程中执行一个或多个子任务。为了控制一个 worker 接受多少个任务,一个 worker 有一个所谓的任务槽(至少一个)。

  2. 每个任务槽代表TaskManager的资源的固定子集。例如,具有三个插槽的TaskManager会将其托管内存的1/3专用于每个插槽

**

  1. 分配资源意味着子任务不会与其他作业的子任务竞争托管内存,而是具有一定数量的保留托管内存。请注意,此处没有发生CPU隔离。当前插槽仅将任务的托管内存分开

  2. 通过调整任务槽的数量,用户可以定义子任务如何相互隔离。每个TaskManager具有一个插槽,意味着每个任务组都在单独的JVM中运行(例如,可以在单独的容器中启动)。具有多个插槽意味着更多子任务共享同一JVM。

  3. 同一JVM中的任务共享TCP连接(通过多路复用)和心跳消息。它们还可以共享数据集数据结构从而减少每个任务的开销

image.png

  1. Flink允许子任务共享插槽,即使它们是不同任务子任务只要它们来自同一作业即可。结果是一个插槽可以容纳整个作业流水线。允许此插槽共享有两个主要好处
    1. Flink集群需要的任务槽数与作业中使用的最高并行度完全相同。不需要计算程序总共包含多少个任务(并行度不同)。
    2. as
  • 一个好的默认任务插槽数应该是CPU内核数。使用超线程,每个插槽将占用2个或更多硬件线程。

    并不是任意两个 operator 就能 chain 一起的。其条件还是很苛刻的:

  1. 上下游的并行度一致
  2. 下游节点的入度为1 (也就是说下游节点没有来自其他节点的输入)
  3. 上下游节点都在同一个 slot group 中
  4. 下游节点的 chain 策略为 ALWAYS(可以与上下游链接,map、flatmap、filter等默认是ALWAYS)
  5. 上游节点的 chain 策略为 ALWAYS 或 HEAD(只能与下游链接,不能与上游链接,Source默认是HEAD)
  6. 两个节点间数据分区方式是 forward
  7. 用户没有禁用 chain
  8. 在同一个TaskManager 上

Flink 四层模型

427b6dff300fab7ee5cceff5b94d77087c8d5db7.png

  • StreamGraph
  • JobGraph
  • ExecutionGraph
  • 物理执行图

image.png
image.png