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

导读:本篇文章讲解 【架构|概念|性能调优】slot相关概念:Flink的job的并行度是怎么计算的。算子链与slot共享是如何优化flink资源与计算的,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

在了解数据是如何在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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/65411.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!