热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

flinksql设置并行度_FlinkSlot插槽和Parallelism并行度

1总结这次一上来就讲结论吧,在实际应用时,需要注意以下几个要点:slot是静态的概念,表示TaskManager具有多少并发

1 总结

这次一上来就讲结论吧,在实际应用时,需要注意以下几个要点:

  • slot 是静态的概念,表示 TaskManager 具有多少并发执行能力。
  • parallelism 是动态的概念,表示程序运行时实际使用时的并发能力。
  • 设置合适的 parallelism 可以提高运行效率,大小要适中 例如设置了 slot 为 4,但设置 parallelism 为 1,那么只使用了一个 slot,空闲了 3 个,这样也是不可取的。
  • 设置 parallelism 有多种方式,优先级为 api -> env -> -p 参数 -> file(flink-conf.yaml)(从低到高)
  • 设置的 parallelism 不能高于 slot 数量,不然将会出现计算资源不够用的情况,程序报错。

2 前言

前面一直都在学习的是 Flink 的基础使用,基础的套路 source –> transformation –> sink,了解过上面的基础语义和相关 API,就能够进行初步的开发,在 Flink UI 或者 IDE 的控制台就能看到输出结果。

但是对于它的计算资源管理和调度机制还不清晰,所以这次特意查找了相关资料,来学习 Flink 是如何对计算资源进行管理的。

详细可以查看英文文档:Distributed Runtime Environment


3 任务 Task 和算子链 Operator Chain

在分布式计算中,Flink 将算子(operator)的 subtask 链接(chain)成 task。每个 task 由一个线程执行。把算子链接成 tasks,也就是 Operator Chain, 能够减少线程间切换和缓冲的开销,在降低延迟的同时提高了整体吞吐量。

下图的 dataflow 工作流,source 的并行度 parallelism 为 2,map 算子的并行度为 2,keyBy()/window()/apply() 的并行度为 2, Sink 算子的并行度为 1,运行在有 2 个 Slot 的 TaskManager 上。

d71ccfee97ad968d02b68c1462d7bee4.png

可以看到,source 和 map 这两个 operator 进行了合并,在第二个视图中,每个虚框表示一个子任务,最终使用了 5 个并行的线程来执行。

如果没有开启 Operator Chain,那么使用的线程数将会增加到 7,线程数增加后,会增加开销,所以开启算子链是有好处的。

3.1 Slot Sharing

继续以上面的的图作为例子,如果在 slotSharingGroup 使用默认或者相同组名时,当前 Job 运行需要 2 个 slot (小于或等于 Job 中单个算子设定的最大 parallelism)

Slot Sharing:来自同一个 Job 且拥有相同 slotSharingGroup(默认:default)名称的不同 Task 的 SubTask 之间可以共享一个 Slot,这使得一个 Slot 有机会持有 Job 的一整条 Pipeline,所以默认情况下,所有的 operatro 有可能共享同一个 slot。

同样可以通过 api 来指定特定的算子共享组:

source.map(...).slotSharingGroup("otherGroup");

上述例子通过 slotSharingGroup() 方法,指定 map 算子到 otherGroup 分组。

3.2 Chain 条件

不是任意两个算子都能够进行链接,链接需要遵守以下原则:

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

3.3 配置方式

根据优先级,从低到高,依次有以下指定并行度的方式

  • API 设定

在单个算子上,通过调用 setParallelism() 方法来指定:

source.setParallelism(2) .map(xxxx).setParallelism(2) .keyBy(xxxx).window(xxx).apply(xxx)setParallelism(2) .sink(xxx).setParallelism(1);

  • Env 层次

Flink 程序运行在执行环境的上下文中。执行环境为所有执行的算子、数据源、数据接收器 (data sink) 定义了一个默认的并行度。可以显式配置算子层次的并行度去覆盖执行环境的并行度。

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env.setParallelism(3);

  • -p 任务提交设定参数

在提交作业时,可以通过 Flink UI 进行上传 jar 包启动,也可以在终端,使用 -p 参数指定并行度:

$./bin/flink run -p 10 .../demo/WordCount.jar

  • flink-conf.yaml 系统层次

定位到 ${FLINK_HOME}/conf 目录,可以通过设置 flink-conf.yaml 文件中的 parallelism.default 参数

29ccbcdc703c05c2a870cc5ec699046e.png

默认并行度为 1,通过修改该配置,在系统层次来指定所有执行环境的默认并行度(推荐并行度为服务器的 CPU 核数)


4 运行环境

要了解 Slot,就得熟悉 Job 运行的环境,有三个核心组件需要了解:

Job Managers、Task Managers 和客户端 Clients

  • Job Managers:也称为 master,协调分布式计算。它们负责调度任务、协调 checkpoints、协调故障恢复等
  • Task Managers:也称为 worker,执行 dataflow 中的 tasks (准确来说是 subtasks),并且缓存和交换数据流。
  • Clients:它不属于运行时(runtime)和作业执行时的一部分,但它是被用作准备和提交作业的工具。提交完成之后,客户端可以断开连接,也可以保持连接来接收进度报告。(例如 CLI 客户端,通过 flink run ... 提交任务)
319b4cd9d7c05ee9b9b41f8a219ec951.png

5 Task Slot 和 Resources

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

每一个 Task Slot 代表了 TaskManager 所拥有的计算资源的一个固定的子集。例如,一个拥有 3 个 slot 的 TaskManager,那么每个 slot 可以使用 1/3 的内存。这样,运行在不同 slot 中的 subtask 不会竞争内存资源。目前 Flink 还不支持 CPU 的隔离,只支持内存的隔离。

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

具有多个 slot 意味着允许多个子任务共享一个 JVM。可以在同一个 JVM 中共享 TCP连接(通过多路复用)和心跳消息。他们还可以共享数据集和数据结构,从而减少每个任务的开销。

a47fb3aa925b85fc356873e8d7529ca2.png

默认情况下,Flink 允许子任务共享 slot,即使它们是不同任务的子任务也是如此,只要它们来自同一任务 job,并且不是同一个 operator 的子任务。通过 slot sharing 的结果是一个 slot 可以容纳整个作业流水线 pipeline。

允许 slot 共享有两个主要好处:

  • Flink 集群所需的 slot 与作业中使用的最高并行度 parallelism 恰好一样多。无需计算一个程序总共包含多少个 job (具有不同的并行度)。
  • 更好的资源利用率。如果没有 slot sharing,则非密集型 source / map()子任务将阻塞与资源密集型窗口子任务一样多的资源。而通过 slot sharing,可以充分利用插槽资源,同时确保沉重的 subtask 在 TaskManager 之间公平分配。

以一个作业调度为例子:

一个由 source、MapFunction 和 ReduceFunction 组成的 Job,其中数据源和 MapFunction 的并行度 parallelism 为 4,ReduceFunction 的并行度为 3。

d37e2cbc4f07d5de2ee6e41a1eb3a22a.png

在上图中,流水线 pipeline 由一系列的 source - Map - Reduce 组成,运行在两个 TaskManager 组成的集群上,每个 TaskManager 包含 3 个 slot。

其中每条线连着的,表示有可能的 pipeline,然后在右边显示了哪些 task 共享一个 slot。

Flink 内部通过 SlotSharingGroup 和 CoLocationGroup 来定义哪些 task 可以共享一个 slot, 哪些 task 必须严格放到同一个 slot。

关于分配的原理和实现,可以参考云邪写的分配 slot 过程


6 Slot 和 Parallelism

回归主题,前面学习了 slot 和 parallelism,那么将两者联系起来会是怎样呢,可以看下云星数据的博文介绍,用来加深理解:

6.1 Slot 是指 Task Manager 的并发执行能力

5a0e64cadcba25669742163440739b89.png
在 flink-config.yaml 设置了默认 slot 数量为 3图中有三个 Task Manager,结合上面的参数,每个 worker 分配了 3 个 slot,整个集群就有 9 个 Task Slot

6.2 Parallelism 是指 Task Manager 实际使用的并发能力

73a37c029b9d5c66ecd4dde300c0d55b.png
在配置文件中,设置了默认并行度 parallelism.default: 1Example1 提交的 Job 只使用了 1 个并行度,占用 1 个 slot,于是还剩下 8 个空闲的 Task Slot,设定合适的并行度大小能提升效率和降低空转时间

6.3 Parallelism 是可配置、可指定的

505078d428d5ff8869bfd3ec7a07199e.png

关于并行度的设定方式,前面也提高过的,这里说下图中想要展示信息:

  • Example 2 设置的并发度为 2,Example 3 设置的并发度为 9
  • 由于设置的是全局并发度,默认会链接成 Operator Chain,然后串成 pipeline,每个流水线占有 1 个 slot
cf8e2ec44af4cc6ca5d3c3fabdcfa708.png
Example 4 中,除了 sink 算子的并行度为 1,其它算子的并行的都是 9,于是出现了,只能在一个 slot 中看到 sink 算子其它 slot 计算后的结果,将会输送到 Task Manager 3 的 sink 算子中

7 小总结

这次再次将 Flink 的运行结构和算子执行的工作地 Task Manager 熟悉了一下,也了解到多个子任务链接成的 Operator Chain,通过算子链,优化了计算资源的利用,减少不必要的开销。

在进一步学习 slot 和 parallelism 时,参考了很多文章,可以看下参考文献,加深理解。如有其它学习建议或文章不对之处,请与我讨论吧~

8 参考文献

  1. Flink 原理与实现:理解 Flink 中的计算资源
  2. Flink 源码阅读笔记(6)- 计算资源管理
  3. 作业调度
  4. Flink中slot的一点理解
  5. Flink 从 0 到 1 学习 —— Flink parallelism 和 Slot 介绍
  6. Slot和Parallelism的深入分析004
  7. 并行执行
  8. Flink Slot 详解与 Job Execution Graph 优化



推荐阅读
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 本文介绍了协程的概念和意义,以及使用greenlet、yield、asyncio、async/await等技术实现协程编程的方法。同时还介绍了事件循环的作用和使用方法,以及如何使用await关键字和Task对象来实现异步编程。最后还提供了一些快速上手的示例代码。 ... [详细]
author-avatar
尛丶俊_188
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有