Flink的API分层、架构与组件原理、并行度、任务执行计划

Flink的API分层

        Apache Flink的API分为四个层次,每个层次都提供不同的抽象和功能,以满足不同场景下的数据处理需求。下面是这四个层次的具体介绍:

  • CEP API:Flink API 最底层的抽象为有状态实时流处理。其抽象实现是Process Function,并且Process Function被  框架集成到了DataStream API中来为我们使用。它允许用户在应用程序中自由地处理来自单流或多流的事件(数据),并提供具有全局一致性和容错保障的状态。此外,用户可以在此层抽象中注册事件时间(event time)和处理时间(processing time)回调方法,从而允许程序可以实现复杂计算。

  • Core APIs:Flink API 第二层抽象是Core APIs。实际上,许多应用程序不需要使用到上述最底层抽象的 API,而是可以使用Core APIs进行编程:其中包含DataStream API(应用于有界/无界数据流场景)和DataSet API(应用于有界数据集场景)两部分。Core APIs 提供的流式 API(Fluent API)为数据处理提供了通用的模块组件,例如各种形式的用户自定义转换(transformations)、联接(joins)、聚合(aggregations)、窗口(windows)和状态(state)操作等。此层 API 中处理的数据类型在每种编程语言中都有其对应的类。

    Process Function 这类底层抽象和 DataStream API 的相互集成使得用户可以选择使用更底层的抽象 API 来实现自己的需求。DataSet API 还额外提供了一些原语,比如循环/迭代(loop/iteration)操作。

  • Table API:Flink API 第三层抽象是Table API。Table API是以表(Table)为中心的声明式编程(DSL)API,例如在流式数据场景下,它可以表示一张正在动态改变的表。Table API遵循(扩展)关系模型:即表拥有 schema(类似于关系型数据库中的 schema),并且 Table API 也提供了类似于关系模型中的操作,比如 select、project、join、group-by 和 aggregate 等。Table API 程序是以声明的方式定义应执行的逻辑操作,而不是确切地指定程序应该执行的代码。尽管 Table API 使用起来很简洁并且可以由各种类型的用户自定义函数扩展功能,但还是比 Core API 的表达能力差。此外,Table API 程序在执行之前还会使用优化器中的优化规则对用户编写的表达式进行优化。

           表和DataStream/DataSet可以进行无缝切换,Flink 允许用户在编写应用程序时将Table API与DataStream/DataSetAPI 混合使用。Table API提供了更简洁、易读的编程模型,适合对结构化数据进行处理。

  • SQL API:Flink API 最顶层抽象是SQL。这层抽象在语义和程序表达式上都类似于Table API,但是其程序实现都是 SQL 查询表达式。SQL抽象与 Table API 抽象之间的关联是非常紧密的,并且 SQL 查询语句可以在Table API中定义的表上执行。用户可以将SQL查询直接提交给Flink引擎,然后Flink会将查询解析为对应的Table API操作,并执行查询计划。SQL API使得熟悉SQL语言的用户能够更方便地使用Flink进行数据处理,无需编写额外的代码。

        这四个层次的API相互补充,用户可以根据自己的需求和技术背景选择适合的API进行数据处理。无论使用哪个层次的API,底层都是Flink的核心引擎来执行计算任务,因此它们在性能和功能上是相当的,只是提供了不同的编程模型和抽象层次。

Flink架构

        当 Flink 集群启动后,首先会启动一个 JobManger 和一个或多个的 TaskManager。由 Client 提交任务给 JobManager,JobManager 再调度任务到各个 TaskManager 去执行,然后 TaskManager 将心跳和统计信息汇报给 JobManager。TaskManager 之间以流的形式进行数据的传输。上述三者均为独立的 JVM 进程。

Client

        为提交 Job 的客户端,可以是运行在任何机器上(与 JobManager 环境连通即可)。提交 Job 后,Client 可以结束进程(Streaming的任务),也可以不结束并等待结果返回。

        Client 不是运行时和程序执行的一部分,而是用于准备数据流并将其发送给 JobManager。之后,客户端可以断开连接(分离模式),或保持连接来接收进程报告(附加模式)。客户端可以作为触发执行 Java/Scala 程序的一部分运行,也可以在命令行进程./bin/flink run ...中运行。

        可以通过多种方式启动 JobManager 和 TaskManager:直接在机器上作为standalone 集群启动、在容器中启动、或者通过YARN等资源框架管理并启动。TaskManager 连接到 JobManagers,宣布自己可用,并被分配工作。

JobManager

        主要负责从 Client 处接收到 Job 和 JAR 包等资源后,会生成优化后的执行计划,并以 Task 的单元调度到各个 TaskManager 去执行。JobManager 具有许多与协调 Flink 应用程序的分布式执行有关的职责:它决定何时调度下一个 task(或一组 task)、对完成的 task 或执行失败做出反应、协调 checkpoint、并且协调从失败中恢复等等。这个进程由三个不同的组件组成:

  • ResourceManager

    ResourceManager 负责 Flink 集群中的资源提供、回收、分配 - 它管理 task slots,这是 Flink 集群中资源调度的单位(请参考TaskManagers
    )。Flink 为不同的环境和资源提供者(例如 YARN、Kubernetes 和 standalone 部署)实现了对应的 ResourceManager。在 standalone 设置中,ResourceManager 只能分配可用 TaskManager 的 slots,而不能自行启动新的 TaskManager。

  • Dispatcher

    Dispatcher 提供了一个 REST 接口,用来提交 Flink 应用程序执行,并为每个提交的作业启动一个新的 JobMaster。它还运行 Flink WebUI 用来提供作业执行信息。

  • JobMaster

    JobMaster 负责管理单个JobGraph
    的执行。Flink 集群中可以同时运行多个作业,每个作业都有自己的 JobMaster。

始终至少有一个 JobManager。高可用(HA)设置中可能有多个 JobManager,其中一个始终是 leader,其他的则是 standby

TaskManager

       TaskManager(也称为 worker)执行作业流的 task,并且缓存和交换数据流。

         在启动的时候就设置好了槽位数(Slot),每个 slot 能启动一个 Task,Task 为线程。从 JobManager 处接收需要部署的 Task,部署启动后,与自己的上游建立 Netty 连接,接收数据并处理。

        必须始终至少有一个 TaskManager。在 TaskManager 中资源调度的最小单位是 task slot。TaskManager 中 task slot 的数量表示并发处理 task 的数量。请注意一个 task slot 中可以执行多个算子

        flnik架构中的角色间的通信使用Akka,数据的传输使用Netty


Task Slot
        在上图中我们介绍了 TaskManager 是一个 JVM 进程,并会以独立的线程来执行一个task或多个subtask。为了控制一个 TaskManager 能接受多少个 task,Flink 提出了 Task Slot 的概念。
Flink 中的计算资源通过 Task Slot 来定义。每个 task slot 代表了 TaskManager 的一个固定大小的资源子集。例如,一个拥有3个slot的 TaskManager,会将其管理的内存平均分成三分分给各个 slot。将资源 slot 化意味着来自不同job的task不会为了内存而竞争,而是每个task都拥有一定数量的内存储备。需要注意的是,这里不会涉及到CPU的隔离,slot目前仅仅用来隔离task的内存。
通过调整 task slot 的数量,用户可以定义task之间是如何相互隔离的。每个 TaskManager 有一个slot,也就意味着每个task运行在独立的 JVM 中。每个 TaskManager 有多个slot的话,也就是说多个task运行在同一个JVM中。而在同一个JVM进程中的task,可以共享TCP连接(基于多路复用)和心跳消息,可以减少数据的网络传输。也能共享一些数据结构,一定程度上减少了每个task的消耗。

Flink 主要组件

  1. JobManager: JobManager是Flink集群的主节点,负责接收和调度任务,并协调所有TaskManager的工作。它还负责检查各个任务的状态,以及提供监控和管理服务。

  2. TaskManager: TaskManager是Flink集群中的工作节点,每个TaskManager都会启动一个或多个任务,执行具体的计算逻辑。TaskManager负责维护和管理本地资源,包括内存、CPU、IO等资源。

  3. DataStream: DataStream是Flink中的基本数据处理单元,代表了一个无限的数据流。用户可以通过DataStream API来定义数据流的输入源、转换操作和输出目的地。

  4. DataSet: DataSet是Flink中的批处理组件,它可以在有限的数据集上执行批处理操作。DataSet API提供了类似于Spark的RDD API的编程模型,允许用户对数据集进行转换、过滤、聚合等操作。

  5. Connector: 连接器是Flink中用于连接外部系统的组件,包括Kafka、Hadoop、Elasticsearch等常见的数据存储和消息队列系统。Flink提供了丰富的Connector库,使得用户可以方便地与各种外部系统进行交互。

Flink的核心实现原理

  1. 流式计算模型:Flink采用基于时间的窗口机制来对无限数据流进行处理,任务被切分为若干个子任务,每个子任务处理一部分数据。数据在不同的TaskManager之间通过网络传输,Flink使用基于消息的异步通信模型来实现高效的数据传输。

  2. 基于内存的计算引擎:Flink使用内存存储来提高计算性能和效率,它利用了Java虚拟机的内存管理机制,并采用了紧凑的数据结构和高效的内存管理策略来减少内存开销。

  3. 分布式快照机制:Flink采用了基于检查点的容错机制,通过定期创建快照来记录任务状态并恢复故障。检查点可以保存在HDFS等分布式存储系统中,以保证数据的持久性和可靠性。

  4. 优化器和执行引擎:Flink提供了强大的查询优化器和执行引擎,能够对Job进行优化和重排,以提高执行效率和性能。Flink还支持各种类型的窗口、聚合和Join操作,以满足不同的计算需求。

        总的来说,Flink的架构和组件设计充分考虑了分布式计算的特点和要求,采用了多项高级技术来提高计算性能和可靠性,使得它成为了一个高效、灵活和可扩展的分布式数据处理框架。

flink 的并行度

        Flink的并行度是指在执行数据处理任务时,将任务分解为多个子任务并行执行的能力。并行度可以帮助提高计算性能和吞吐量,充分利用集群中的资源。

        在Flink中,有两种类型的并行度:任务并行度(Task Parallelism)和数据并行度(Data Parallelism)。

  1. 任务并行度(Task Parallelism):任务并行度是指将一个Flink作业分解为多个任务(Tasks),这些任务可以在不同的TaskManager上并行执行。任务并行度由JobManager进行调度和分配,它决定了作业的整体并行度。通过增加任务并行度,可以提高作业的并发度和处理速度,但也会增加系统的负载和资源消耗。

  2. 数据并行度(Data Parallelism):数据并行度是指将一个任务根据数据流进行切分,让每个子任务处理不同的数据分片。数据并行度通常涉及到数据的分区和并行操作,并且可以根据数据源的特性进行设置。通过增加数据并行度,可以使得每个子任务处理更少的数据量,从而提高任务的执行效率。

        在Flink中,任务并行度和数据并行度可以同时使用,以实现更好的性能和资源利用。通过合理设置并行度参数,可以根据数据的特点、计算的复杂度和集群的资源情况来优化作业的执行效果。

        需要注意的是,并行度的设置需要综合考虑多个因素,包括可用的计算资源、数据源的分布、任务之间的依赖关系等。过低的并行度可能导致资源浪费和性能瓶颈,而过高的并行度则可能导致资源竞争和系统负载过重。因此,在设置并行度时需要进行实际测试和调优,找到最佳的配置参数。

flink 任务执行计划

        Flink是一个开源的流处理和批处理框架,它提供了用于构建高性能、可伸缩的分布式数据处理应用程序的工具和库。在执行Flink任务时,它会根据任务的逻辑生成执行计划。

        Flink的执行计划描述了任务在集群中的执行方式和顺序,它将任务转化为一系列的操作算子,这些算子会在不同的并行任务槽(task slot)上执行。执行计划包含以下几个关键组成部分:

  1. 数据源(Source):执行计划的起点是数据源,它可以是从文件、消息队列、数据库等读取数据的操作。数据源会生成一个或多个数据流,作为整个任务的输入。

  2. 转换操作(Transformation):转换操作是对输入数据流进行处理和转换的操作,如过滤、映射、聚合等。每个转换操作都会生成一个新的数据流,并形成有向无环图(DAG)结构,描述了数据流之间的依赖关系。

  3. 算子(Operator):每个转换操作都会被映射为一个具体的算子,例如Map、Filter、Join等。算子会在任务的task slot上执行,并处理输入数据流的每个数据元素。

  4. 并行度(Parallelism):Flink任务可以以并行的方式执行,算子的并行度定义了在集群中并行执行的任务槽数量。并行度可以根据数据量和任务的处理能力进行调整,以提高任务的吞吐量和性能。

  5. 数据分区(Data Partitioning):数据分区定义了数据在不同算子之间的分发方式,它决定了数据在不同任务槽之间的均衡性和负载情况。Flink支持多种数据分区策略,如哈希分区、重分区、广播等。

  6. Sink操作(Sink):Sink操作将处理后的数据流输出到外部系统,如文件、数据库、消息队列等。它是执行计划的终点。

        在执行计划生成后,Flink会将其提交给执行引擎,执行引擎会根据执行计划中定义的算子和并行度,在集群中分配任务槽,并分配资源进行任务执行。执行引擎会负责任务的调度、数据的传输和故障恢复等工作,确保任务能够按照计划顺利执行。

        总之,Flink的执行计划描述了任务的逻辑和执行方式,通过转换操作和算子将任务映射到具体的执行环境中。这种灵活和可扩展的执行计划是Flink实现高性能、可伸缩数据处理的关键。

更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

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

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

相关文章

《研发效能(DevOps)工程师》课程简介(五)丨IDCF

由国家工业和信息化部教育与考试中心颁发的职业技术证书,也是国内首个研发效能(DevOps)职业技术认证,内涵1000页学习教材2000分钟的课程内容讲解460多个技术知识点300多道练习题。 在这里,你不仅可以了解到华为、微软、…

服装展示服务预约小程序的内容如何

互联网电商深入,很多服装商家开始线上卖货经营、会员管理及私域营销等,这也是当今商家们的一个优选项,当然除了直接卖货以外,展示和预约、客户交互也同样是不少商家需要的。 那么商家通过服装展示预约小程序能够实现什么效果呢&a…

Flutter——最详细(AppBar)使用教程

AppBar简介 Material Design 应用栏(标题栏) 使用场景: 顶部标题栏包括一些常用的菜单按钮 属性作用leading左边工具视图automaticallyImplyLeading左边图标的颜色title标题视图actions右边菜单按钮flexibleSpace其高度将与应用栏的整体高度相同bottom左侧底部文本内…

【Delphi】Android 开发HTTP请求出错解决方案

目录 一、故障现象 二、原因及解决方案 一、故障现象 在android内建的WebBrowser浏览器中通过http访问一个网站(注意不是https),出现如下错误提示: 在使用ntfy的时候,访问http定义的服务器地址(注意不是…

【Git】Gui图形化管理、SSH协议私库集成IDEA使用

一、Gui图形化界面使用 1、根据自己需求打开管理器 2、克隆现有的库 3、图形化界面介绍 1、首先在本地仓库更新一个代码文件,进行使用: 2、进入图形管理界面刷新代码资源: 3、点击Stage changed 跟踪文件,将文件处于暂存区 4、通过…

Web APIs——综合案例

1、学生就业统计表 2、渲染业务 根据持久化数据渲染页面 步骤: ①:读取localstorage本地数据 如果有数据则转换为对象放到变量里面一会使用它渲染页面如果没有则用默认空数组[]为了测试效果,可以先把initData存入本地存储看效果 ②&…

防火防盗防小人 使用 Jasypt 库来加密配置文件

⚔️ 项目配置信息存放在哪? 在日常开发工作中,我们经常需要使用到各种敏感配置,如数据库密码、各厂商的 SecretId、SecretKey 等敏感信息。 通常情况下,我们会将这些敏感信息明文放到配置文件中,或者放到配置中心中。…

【vue 仿百度分页】

vue 仿百度分页 效果图 代码 公用组件 <template><nav class"pagination_nav"><ul class"pagination"><li :class"{ disabled: current 1 }"><a href"javascript:;" click"setCurrent(current - …

页表和cache

页表基本原理 页表主要用来将虚拟地址映射到物理地址&#xff0c;在使用虚拟地址访问内存时&#xff0c;微处理器首先将虚拟地址拆分成页号和页内偏移量&#xff0c;然后使用页号在页表中查找对应的物理页框号&#xff0c;将物理页地址加上页内偏移量&#xff0c;得到最终的物…

Rust核心功能之一(所有权)

目录 1、什么是所有权&#xff1f; 1.1 所有权规则 1.2 变量作用域 1.3 String 类型 1.4 内存与分配 变量与数据交互的方式&#xff08;一&#xff09;&#xff1a;移动 变量与数据交互的方式&#xff08;二&#xff09;&#xff1a;克隆 只在栈上的数据&#xff1a;拷贝…

如何使用Pyarmor保护你的Python脚本

目录 一、Pyarmor简介 二、使用Pyarmor保护Python脚本 1、安装Pyarmor 2、创建Pyarmor项目 3、添加Python脚本 4、配置执行环境 5、生成保护后的脚本 三、注意事项与未来发展 四、未来发展 五、总结 本文深入探讨了如何使用Pyarmor工具保护Python脚本。Pyarmor是一个…

k8s的安装部署,详细过程展示(保姆级安装教程)

k8s应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;不能为应用程序定义资源使用…

Python 的 datetime 模块

目录 简介 一、date类 &#xff08;一&#xff09;date 类属性 &#xff08;二&#xff09;date 类方法 &#xff08;三&#xff09;实例属性 &#xff08;四&#xff09;实例的方法 二、time类 &#xff08;一&#xff09;time 类属性 &#xff08;二&#xff09;tim…

UDP网络编程

一)熟悉TCP/IP五层协议: 1)封装:就是在数据中添加一些辅助传输的信息&#xff1b; 2)分用:就是解析这些信息 3)发送数据的时候&#xff0c;上层协议要把数据交给下层协议&#xff0c;由下层协议来添加一些信息 4)接收数据的时候&#xff0c;下层协议要把数据交给上层协议&#…

Python初学者软件以及如何安装和配置,新手入门必看系列。

文章目录 前言一、Python软件二、集成开发环境&#xff08;IDE&#xff09;1.PyCharm2.Spyder3.IDLE 三、包管理工具四、使用Python虚拟环境总结Python技术资源分享1、Python所有方向的学习路线2、学习软件3、精品书籍4、入门学习视频5、实战案例6、清华编程大佬出品《漫画看学…

探索云世界的无限可能

文章目录 每日一句正能量前言云计算的定义和现状云计算能做什么&#xff1f;云计算市场的新特征需求方向&#xff1a;云计算的基础服务已经稳固&#xff0c;行业解决方案是新的发力点模式方向&#xff1a;分布式云模式方向&#xff1a;边缘计算是一朵新的云技术方向&#xff1a…

AMESim 2021安装教程

主要是AMESim的安装 写在前面&#xff0c;由于项目需要&#xff0c;需要自学AMESim&#xff0c;因此需要安装这个软件&#xff0c;目前仅仅安装使用&#xff0c;还不涉及到与MATLAB的联合仿真&#xff0c;老板说用 RT LAB半实物仿真平台&#xff0c;但是简单搜了一下&#xff0…

ASUS华硕灵耀X2 Duo UX481FA(FL,FZ)_UX4000F工厂模式原装出厂Windows10系统

下载链接&#xff1a;https://pan.baidu.com/s/1sRHKBOyc3zu1v0qw4dSASA?pwd7nb0 提取码&#xff1a;7nb0 带有ASUS RECOVERY恢复功能、自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、MyASUS华硕电脑管家等预装程序所需要工具&#xff1a;16G或以上…

麒麟KYLINIOS软件仓库搭建03-软件仓库添加新版本的软件包

原文链接&#xff1a;麒麟KYLINIOS软件仓库搭建03-软件仓库添加新版本的软件包 hello&#xff0c;大家好啊&#xff0c;今天给大家带来麒麟桌面操作系统软件仓库搭建的文章03-软件仓库添加新版本的软件包&#xff0c;本篇文章主要给大家介绍了如何在麒麟桌面操作系统2203-x86版…

Vite项目的初体验 - 非Vite脚手架版本

开箱即用 &#xff08;out of box&#xff09;: 无需做任何的配置&#xff0c;就可以用vite来帮助我们处理构建工作。 前提 &#xff1a;node 版本 > 12.0.0&#xff0c;使用 npm 进行依赖管理。 本文的案例&#xff0c;从0到1的&#xff0c;一步一步的体会vite的作用。 本文…