[flink 实时流基础] flink组件栈以及任务执行与资源划分

文章目录

    • 7. Flink组件栈
      • 1. 部署层
        • (1)Local模式
        • (2)Cluster模式
        • (3)Cloud模式
      • 2.运行时
      • 3.API层
      • 4. 上层工具
    • 8. 任务执行与资源划分
      • 1. 再谈逻辑视图到物理执行图
      • 2. 任务、算子子任务与算子链
      • 3. Slot与计算资源
      • 4. 并行度和Slot数目的概念可能容易让人混淆,这里再次阐明一下。


7. Flink组件栈

我们从更宏观的角度来对Flink的组件栈分层剖析。Flink的组件栈分为4层:部署层、运行时层、API层和上层工具。
image.png

1. 部署层

Flink支持多种部署模式,可以部署在单机(Local)、集群(Cluster),以及云(Cloud)上。

(1)Local模式

Local模式有两种不同的模式,一种是单节点 (SingleNode),一种是单虚拟机 (SingleJVM)Local-SingleJVM 模式大多是开发和测试时使用的部署方式,该模式下JobManager和TaskManager都在同一个JVM里。Local-SingleNode 模式下,JobManagerTaskManager 等所有角色都运行在一个节点上,虽然是按照分布式集群架构进行部署,但是集群的节点只有1个。该模式大多是在测试或者IoT设备上进行部署时使用的。

(2)Cluster模式

一般使用 Cluster 模式将 Flink 作业投入到生产环境中,生产环境可以是 Standalone 的独立集群,也可以是 YARNKubernetes 集群。
对于一个 Standalone 集群,我们需要在配置文件中配置好 JobManagerTaskManager 对应的节点,然后使用 Flink 主目录下的脚本启动一个 Standalone 集群。我们将在详细介绍如何部署一个 Flink Standalone 集群。Standalone 集群上只运行 Flink 作业。除了 Flink,绝大多数企业的生产环境运行包括 MapReduce、Spark 等各种各样的计算任务,一般都会使用 YARN或Kubernetes 等方式对计算资源进行管理和调度。Flink 目前已经支持了 YARNMesos 以及 Kubernetes,开发者提交作业的方式变得越来越简单。

(3)Cloud模式

Flink也可以部署在各大云平台上,包括AWS、谷歌云和阿里云。

2.运行时

层运行时 (Runtime) 层为Flink各类计算提供了实现。该层对分布式执行进行了支持。Flink运行时层是Flink最底层也是最核心的组件。

3.API层

API层主要实现了流处 DataStream API 和批处理 DataSet API
:::info
目前,DataStream API 针对有界和无界数据流,DataSet API 针对有界数据集。
:::
用户可以使用这两大API进行数据处理,包括转换 (Transformation)、连接 (Join)、聚合 (Aggregation)、窗口 (Window) 以及状态 (State) 的计算。

4. 上层工具

DataStreamDataSet 两大 API 之上,Flink还提供了以下丰富的工具。
面向流处理的:复杂事件处理 (Complex Event Process,CEP)
面向批处理的:图 (Graph Processing)Gelly 计算库。
面向SQL用户的Table API和SQL。数据被转换成了关系型数据库式的表,每个表拥有一个表模式(Schema),用户可以像操作表那样操作流数据,例如可以使用 SELECT、JOIN、GROUP BY 等操作。
针对 Python 用户推出的 PyFlink,方便 Python 用户使用 Flink。目前,PyFlink 主要基于 Table API

8. 任务执行与资源划分

1. 再谈逻辑视图到物理执行图

:::info
逻辑视图转化为物理执行图的过程,该过程可以分成4层:StreamGraph→JobGraph→ExecutionGraph→物理执行图。
:::
我们根据下图来大致了解这些图的功能。
image.png

  • StreamGraph:根据用户编写的代码生成的最初的图,用来表示一个 Flink 流处理作业的拓扑结构。在 StreamGraph 中,节点 StreamNode 就是算子。
  • JobGraph:JobGraph是被提交给JobManager的数据结构。StreamGraph 经过优化后生成了 JobGraph,主要的优化为,将多个符合条件的节点链接在一起作为一个 JobVertex 节点,这样可以减少数据交换所需要的传输开销。这个链接的过程叫算子链 (Operator Chain)JobVertex 经过算子链后,会包含一到多个算子,它的输出是 IntermediateDataSet,这是经过算子处理产生的数据集。
  • ExecutionGraphJobManagerJobGraph 转化为 ExecutionGraph

ExecutionGraph是JobGraph的并行化版本:假如某个JobVertex的并行度是2,那么它将被划分为2个ExecutionVertex,ExecutionVertex表示一个算子子任务,它监控着单个子任务的执行情况。每个ExecutionVertex会输出一个IntermediateResultPartition,这是单个子任务的输出,再经过ExecutionEdge输出到下游节点。ExecutionJobVertex是这些并行子任务的合集,它监控着整个算子的执行情况。

:::info
ExecutionGraph 是调度层非常核心的数据结构。
:::

  • 物理执行图:JobManager 根据 ExecutionGraph 对作业进行调度后,在各个 TaskManager 上部署具体的任务,物理执行图并不是一个具体的数据结构。

:::info
可以看到,Flink在数据流图上可谓煞费苦心,仅各类图就有4种之多。对于新人来说,可以不用太关心这些非常细节的底层实现,只需要了解以下两点。

  • Flink采用主从架构,Master起着管理协调作用,TaskManager负责物理执行,在执行过程中会发生一些如数据交换、生命周期管理等事情。
  • 用户调用Flink API,构造逻辑视图,Flink会对逻辑视图优化,并转化为并行化的物理执行图,最后被执行的是物理执行图。
    :::

2. 任务、算子子任务与算子链

在构造物理执行图的过程中,Flink会将一些算子子任务链接在一起,组成算子链。链接后以任务(Task)的形式被TaskManager调度执行。使用算子链是一个非常有效的优化,它可以有效减少算子子任务之间的传输开销。链接之后形成的任务是TaskManager中的一个线程。
image.png
:::info
如图所示,展示了任务、子任务和算子链之间的关系。
:::
例如,数据从 Source 前向传播到 FlatMap,这中间没有发生跨分区的数据交换,因此,我们完全可以将 Source、FlatMap 这两个子任务组合在一起,形成一个任务。
数据经过 keyBy() 发生了数据交换,数据会跨越分区,因此无法将 keyBy() 以及其后面的窗口聚合、链接到一起。
由于 WindowAggregation 的并行度为2、Sink 的并行度为1,数据再次发生了交换,我们不能把 WindowAggregationSink 两部分链接到一起。Sink的并行度被人为设置为1,如果我们把Sink的并行度也设置为2,那么是可以让这两个算子链接到一起的。
默认情况下,Flink会尽量将更多的子任务链接在一起,这样能减少一些不必要的数据传输开销。但一个子任务有超过一个输入或发生数据交换时,链接就无法建立。两个算子能够链接到一起是有一些规则的,感兴趣的读者可以阅读 Flink 源码中 org.apache.flink.streaming.api.graph.StreamingJobGraphGenerator 中的 isChainable() 方法。StreamingJobGraphGenerator 类的作用是将 StreamGraph 转换为 JobGraph

尽管将算子链接到一起会减少一些传输开销,但是也有一些情况并不需要太多链接。比如,有时候我们需要将一个非常长的算子链拆开,这样我们就可以将原来集中在一个线程中的计算拆分到多个线程中来并行计算。Flink允许开发者手动配置是否启用算子链,或者对哪些算子使用算子链。

3. Slot与计算资源

  • slot

image.png
TaskManager 是一个 JVM 进程,在 TaskManager 中可以并行执行一到多个任务。每个任务是一个线程,需要 TaskManager 为其分配相应的资源,TaskManager 使用 Slot 给任务分配资源。
FlinkSlot 分配机制上,一个 TaskManager 是一个进程,TaskManager 可以管理一至多个任务,每个任务是一个线程,占用一个 Slot。每个 Slot 的资源是整个 TaskManager 资源的子集,如上图所示的 TaskManager 下有3个 Slot,每个 Slot 占用 TaskManager 1/3 的内存,第一个 Slot 中的任务不会与第二 个 Slot 中的任务互相争抢内存资源。
:::info
注意,在分配资源时,Flink并没有将CPU资源明确分配给各个Slot。
:::

Flink允许用户设置TaskManager中Slot的数目,这样用户就可以确定以怎样的粒度将任务做相互隔离。如果每个TaskManager只包含一个Slot,那么该Slot内的任务将独享JVM。如果TaskManager包含多个Slot,那么多个Slot内的任务可以共享JVM资源,比如共享TCP连接、心跳信息、部分数据结构等。官方建议将Slot数目设置为TaskManager下可用的CPU核心数,那么平均下来,每个Slot都能获得1个CPU核心。

  • 槽位共享

默认情况下,Flink还提供了一种槽位共享 (Slot Sharing) 的优化机制,进一步减少数据传输开销,充分利用计算资源。将上图所示的任务做槽位共享优化后,结果如下图所示。
image.png
开启槽位共享后,Flink允许多个任务共享一个Slot。如图所示,最左侧的数据流,一个作业从Source到Sink的所有子任务都可以放置在一个Slot中,这样数据交换成本更低。而且,对于一个数据流图来说,Source、FlatMap等算子的计算量相对不大,WindowAggregation算子的计算量比较大,计算量较大的算子子任务与计算量较小的算子子任务可以互补,空出更多的槽位,分配给更多任务,这样可以更好地利用资源。如果不开启槽位共享,计算量小的Source、FlatMap算子子任务独占槽位,造成一定的资源浪费。
:::info
综上,Flink的一个Slot中可以执行一个算子子任务、也可以是被链接的多个子任务组成的任务,或者是共享Slot的多个任务,具体这个Slot上执行哪些计算由算子链和槽位共享两个优化措施决定。我们将在9.3节再次讨论算子链和槽位共享这两个优化选项。
:::

4. 并行度和Slot数目的概念可能容易让人混淆,这里再次阐明一下。

用户使用Flink提供的API算子可以构建一个逻辑视图,需要将任务并行才能被物理执行。一个算子将被切分为多个子任务,每个子任务处理整个作业输入数据的一部分。如果输入数据过大,增大并行度可以让算子切分为更多的子任务,加快数据处理速度。可见,并行度是Flink对任务并行切分的一种描述。Slot数目是在资源设置时,对单个TaskManager的资源切分粒度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/577752.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv9改进策略:loss优化 | LRM loss困难样本挖掘,提升难样本、遮挡物、低对比度等检测精度

💡💡💡本文改进内容:LRM loss困难样本挖掘引入到YOLOv9,性能优于Focal Loss 💡💡💡 LRM loss应用到能够大幅提升小目标、红外小目标、大幅度提升遮挡物性能,性能如下图所…

【51单片机入门记录】Onewire单总线协议 温度传感器DS18B20概述

一、温度传感器DS18B20概述 (1)数字化温度传感器 美国DALLAS半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建…

JSON数据的类型

JSON 代表 JavaScript Object Notation。JSON是开放的标准格式,由key-value对组成。JSON的主要用于在服务器与web应用之间传输数据。 PostgreSQL提供了两种存储JSON数据的类型:json和jsonb; jsonb是json的二进制形式。 json格式写入快&#x…

comfyui api

stable diffusion comfyui的api使用教程_厦门外里科技的技术博客_51CTO博客stable diffusion comfyui的api使用教程,为什么要使用comfyui的api?对比webui的api,它有什么好处?stablediffusion如何实现队列https://blog.51cto.com/u…

HarmonyOS 应用开发之UIAbility组件启动模式

UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景,系统提供了三种启动模式: singleton(单实例模式)multiton(多实例模式)specified(指定实例模式)…

【SpringBoot】【经典面试题】每天10个Java面试题-面试大厂起飞系列-day01

嗨,各位小伙伴! 🐱‍💻 我是【行走的程序喵】!一个兼具Web前端和Java后端技能的技术宅! 🌟 我的博客上分享最新的Web前端和Java后端技术文章,从基础入门到进阶应用,应有…

Git相关命令(一)

一、简介 Git 是一个开源的分布式版本控制系统。 当然, git 不会傻傻的把你的每一个版本完整的存储下来,他仅仅会存储每次修改的位置和内容(可持久化),每一次 commit 可以理解为产生一个版本,接下来的版本…

HarmonyOS实战开发-实现UIAbility内和UIAbility间页面的跳转

介绍 本篇Codelab基于Stage模型下的UIAbility开发,实现UIAbility内和UIAbility间页面的跳转。包含如下功能: UIAbility内页面的跳转。跳转到指定UIAbility的首页。跳转到指定UIAbility的指定页面(非首页)。 最终效果图如下&…

【HCIP学习】网络类型级数据链路层协议

思维导图在上面哦~ 一、网络类型的分类(4种) 出现原因:数据链路层使用的协议及规则不同,造成了不同的网络类型 1、多点接入网络(MA)------一条网段内上出现多个设备 BMA:广播型多点接入&…

vivado 生成比特流或器件镜像

在生成比特流或器件镜像之前 , 请复查其设置 , 确保这些设置对于您的设计都正确无误 , 这一点至关重要。 Vivado IDE 中的比特流和器件镜像设置分为 2 种类型 : 1. 比特流或器件镜像文件格式设置。 2. 器件配置设置。 在 V…

翔云身份证实名认证接口-PHP调用方法

网络平台集成实名认证接口,是顺应当下网络实名制规定,有效规避法律风险。互联网平台若没有实名认证功能,那么便无法保证网民用户身份的真实性,很有可能被虚假用户攻击,特别是在当网络平台产生垃圾信息乃至是违法信息时…

大模型预测,下一个token何必是文字?

太快了太快了… 大模型的生成技能,已经到了普通人看不懂的境界! 它可以根据用户过去5年的体检报告,生成未来第1年、第2年、第3年的体检报告。 你看,这个生成的过程,是不是像极了ChatGPT,根据历史单词预测…