【架构|概念|性能调优】slot相关概念:Flink的job的并行度是怎么计算的。算子链与slot共享是如何优化flink资源与计算的

在了解数据是如何在flink中进行传输之前,我们先看几个基础概念,为下一篇做一个预备知识。本文将要介绍的有一下几个概念:

一. 理论基础

1. Operator和Stream

Flink编程模型由Stream和StreamOperator组成。
编写一个Flink任务时,抽象来说,是在描绘一个有向图。下图的边相当于由一系列数据记录组成的数据流,方框相当于我们对数据流的处理。
在这里插入图片描述

  • operator代表一个task内的处理逻辑,下面会讲task的概念
  • Stream代表由一系列数据记录(data records)组成的数据流。

一般情况下,Stream从SourceOperator开始,到SinkOperator结束。而TransformationOperator消费一个或多个stream,对stream进行处理,最后生产出一个或多个stream作为处理结果。

 

2. Job

job理解起来很简单,就是一个可以独立提交的大任务。
 

3. Task和Subtask

  • 一个task就代表一个operator,同样的一个算子链也是一个task
  • 当运行flink job时,一个task根据本身的并行度创建多个sub Task,即sub task的数量代表这个task的并行度。
  • 每个subtask需要一个线程来运行。
     

简单地,计算一个job的并行度:所有Operator和它的并行度的乘积。
注意这不是最优的计算结果,见slot shareing下对应job的并行度计算

 

4. Operator Chain

flink可以将多个operator组成一个算子链,在逻辑上它是一个task,会在同一个task slot执行。当多个operator合并成一个算子链时,此时这些operator的数据不需要序列化和反序列化,提升系统的性能。

组成operator chain的算子需要满足的条件:都是one to one的算子。

具体见官网:
https://nightlies.apache.org/flink/flink-docs-release-1.12/dev/stream/operators/#task-chaining-and-resource-groups

 

5. Slot 与Slot共享

Slot

对于JVM进程,一个slot其实就是一个线程,一个taskmanager中包含的多个slot对应着线程池。

下面简单了解下slot的调度:
TaskManager启动时会将自己的资源以Slot的方式注册到RM,然后JM将(简单认为:优化过后的task)subtask调度到Slot上去运行。
整个过程中Subtask是调度的基本单元,Slot则是资源分配的基本单元。需要注意的是目前Slot只隔离内存,不隔离CPU。

 

Slot共享
简单的说

为了高效使用资源,Flink默认允许一个job中不同task的subtask运行到一个slot中,就是Slot共享。

共享的意义

因为每个subtask消耗的资源不同,将资源占用少和资源占用多的subtask放到一起,而不是都高或者都低的subtask放到一起,这样能使得资源能得到充分利用。比如source和sink一般都是网络通讯的IO操作,相对于中间Operator,消耗资源并不大。

默认slot shareing是开启的,开启slot有两个好处:

  • 计算一个job所需要的并行度:并行度最大的task所对应的并行度就是这个job所需的并行度。

A Flink cluster needs exactly as many task slots as the highest
parallelism used in the job.

  • 更好的资源利用:
    如下图官网,将资源占用不多的source/map和资源占用较多的window算子放到一个slot,并且实现了占用资源较多的算子均匀分到了每个slot中,最后还有一个slot下跑了一整个pipeline。

在这里插入图片描述

在这里插入图片描述

官网:https://nightlies.apache.org/flink/flink-docs-release-1.12/concepts/flink-architecture.html#task-slots-and-resources

 

二. 性能场景分析

通过上面的分析我们知道

  1. slot 其实是一个线程,一个subtask使用一个slot的资源去运行,一个task由多个subtask组成;
  2. 因为有slot共享,flink可以将资源占用少和资源占用多的subtask放到一起,这样能充分利用资源;
  3. 有了slot共享,可以认为并行度最大(maxNum个subtask)的task所对应的并行度就是这个job所需的并行度。

现我们的flink集群中taskmanager有3个节点,每个节点都有8个slot 也就是我们最多能同时运行24个subtask的线程任务。
在这里插入图片描述

一般的slot数和集群的core数一致,此时一个线程使用一个core,但对于非计算密集型(cpu执行的强度不大)的任务,资源可能会造成浪费。

 

slot数等于flink集群的并行能力

一个线程就代表一个slot,那如果job的并行度设置大于24,那集群资源显然不够,此时我设置并行度为30,看下任务的执行。
在这里插入图片描述

果然,因为当前集群中只有22个slot是空闲的,当提交任务之后,看到有8个线程在进行等待,而此时的等待是无劳的,因为30的并行度要求的资源已经超过集群最大的slot数了。

 

充分利用slot资源

方式1:

我们可以通过flink默认开启的slot共享,将资源占用少和资源占用多的subtask放到一起,使得资源充分利用。

方式2:

其次当我们对接的是低速系统时,cpu利用率不高,
参考:Flink 单并行度内使用多线程,提高写入性能10倍

 
 
 

参考
Apache Flink 1.12 Documentation: Flink Architecture
https://www.jianshu.com/p/b3c82682acb3
http://niyanchun.com/flink-quick-learning-job-task-slotsharing.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值