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.mzph.cn/news/134173.shtml

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

相关文章

macOS电池续航工具:Endurance中文

Endurance for Mac是一款强大而实用的电池管理和优化软件,专为MacBook设计。通过智能调整系统设置和管理后台应用,它能有效延长电池续航时间,提升工作和娱乐效率,成为你在各种场合下的得力助手。 Endurance for Mac软件的功能特色…

spring中纯注解实现Advice

背景:课本上是注解和Xml文件混用的方式,研究了一下用配置类加注解和测试方法实现各种通知方式的切入。 1.首先dao的接口,增删改查 public interface UserDaoAspect {public void add();public void delete();public void update();public vo…

【Go 编程实践】从零到一:创建、测试并发布自己的 Go 库

为什么需要开发自己的 Go 库 在编程语言中,包(Package)和库(Library)是代码组织和复用的重要工具。在 Go 中,包是代码的基本组织单位,每个 Go 程序都由包构成。包的作用是帮助组织代码&#xf…

[java进阶]——方法引用改写Lambda表达式

🌈键盘敲烂,年薪30万🌈 目录 📕概念介绍: ⭐方法引用的前提条件: 1.引用静态方法 2.引用构造方法 ①类的构造: ②数组的构造: 3.引用本类或父类的成员方法 ①本类&#xff1…

思维训练4

题目描述1 Problem - A - Codeforces 题目分析 对于此题我们要求差值种类最大,故我们可以构造出相邻差值分别为1,2,3...由于n规定了最大的范围故我们增到一定的差值之后其差值必定为之前出现过的数字,但由于要保证数组呈递增趋势…

学习LevelDB架构的检索技术

目录 一、LevelDB介绍 二、LevelDB优化检索系统关键点分析 三、读写分离设计和内存数据管理 (一)内存数据管理 跳表代替B树 内存数据分为两块:MemTable(可读可写) Immutable MemTable(只读&#xff0…

Qt Creator插件

这里以Qt Creator 4.15.2版本的源码为示例进行分析 源码结构如下,为了追溯其插件加载过程,从main.cpp入手 Qt Creator的插件目录,生成的插件,好几十个呢 Qt Creator插件的读取 int main(int argc, char **argv)中以下代码创建插…

Vue 3 相对于 Vue2,模板和组件的一些变化

目录 1,模板的变化1,v-modelvue2vue3 2,v-if 和 v-for3,keyv-forv-if 4,Fragment 2,组件的变化1,Teleport2,异步组件 1,模板的变化 1,v-model vue2 对组件…

垃圾回收系统小程序定制开发搭建攻略

在这个数字化快速发展的时代,垃圾回收系统的推广对于环境保护和可持续发展具有重要意义。为了更好地服务于垃圾回收行业,本文将分享如何使用第三方制作平台乔拓云网,定制开发搭建垃圾回收系统小程序。 首先,使用乔拓云网账号登录平…

【UE5 Cesium】actor随着视角远近来变化其本身大小

效果 步骤 1. 首先我将“DynamicPawn”设置为默认的pawn类 2. 新建一个父类为actor的蓝图,添加一个静态网格体组件 当事件开始运行后添加一个定时器,委托给一个自定义事件,每2s执行一次,该事件每2s获取一下“DynamicPawn”和acto…

html+css 通过div模拟出一个表格样式,优化多个边框导致的宽度计算问题

htmlcss 通过div模拟出一个表格样式&#xff0c;优化多个边框导致的宽度计算问题 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, i…

VB.NET—DataGridView控件教程详解

目录 前言: 过程: 第一步: 第二步: 第三步: 第四步: 第五步&#xff1a; 番外篇: 总结: 前言: DataGridView是.NET FormK中的一个Windows窗体控件&#xff0c;它提供了一个可视化的表格控件&#xff0c;允许用户以表格形式显示和编辑数据。它通常用于显示和编辑数据库…

JavaEE-博客系统2(功能设计)

本部分内容&#xff1a;实现博客列表页&#xff1b;web程序问题的分析方法&#xff1b;实现博客详情页&#xff1b; 该部分的代码如下&#xff1a; WebServlet("/blog") public class BlogServlet extends HttpServlet {//Jackson ObjectMapper类(com.fasterxml.jac…

Pyhotn: Mac安装selenium没有chromedriver-114以上及chromedriver无法挪到/usr/bin目录下的问题

1.0 安装selenium 终端输入&#xff1a; pip install selenium 查看版本&#xff1a; pip show selenium2.0 安装chromedriver 查看chrome版本 网上大多数是&#xff0c;基本到114就停了。 https://registry.npmmirror.com/binary.html?pathchromedriver/ 各种搜索&#…

ros1 自定义订阅者Subscriber的编程实现

话题模型 图中&#xff0c;我们使用ROS Master管理节点。 有两个主要节点&#xff1a; Publisher&#xff0c;名为Turtle Velocity&#xff08;即海龟的速度&#xff09;Subscriber&#xff0c;即海龟仿真器节点 /turtlesim Publisher(Turtle Velocity)&#xff0c;发布Messa…

Appium 移动端自动化测试,触摸(TouchAction) 与多点触控(MultiAction)

一、触摸 TouchAction 在所有的 Appium 客户端库里&#xff0c;TouchAction 触摸对象被创建并被赋予一连串的事件。 规范里可用的事件有&#xff1a; * 短按(press) * 释放(release) * 移动到(moveTo) * 点击(tap) * 等待(wait) * 长按(longPress) * 取消(cancel) * 执行(per…

【教程】多进程下载百度旋转验证码图片-制作数据集

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 效果展示&#xff1a; 直接上代码&#xff0c;开箱即用&#xff08;当然selenium库自己装一下&#xff09;&#xff1a; import os import time import requests from selenium import webdriver from selenium.…

【Linux】服务器与磁盘补充知识,硬raid操作指南

服务器硬件 cpu 主板 内存 硬盘 网卡 电源 raid卡 风扇 远程管理卡 1.硬盘尺寸: 目前生产环境中主流的两种类型硬盘 3.5寸 和2.5寸硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器 但是3.5寸没法转换成2.5寸 2.如何在服务器上制作raid 华为服务器为例子做…

如何找出最优的【SVC】核函数和参数值—以乳腺癌数据集为例

在实际的工作中&#xff0c;有的时候我们不知道数据特征&#xff0c;也不知道我们的数据是线性还是非线性。因此我们需要对数据一步步进行摸索&#xff0c;来找到最优的核函数和参数值。接下来我们以sklearn乳腺癌数据集为例。 先来导入相应的模块&#xff1a; from sklearn.d…

【I/O流之旅】File类-零基础入门指南

&#x1f38a;专栏【Java】 &#x1f33a;每日一句:看不清楚未来时,就比别人坚持久一点 ⭐欢迎并且感谢大家指出我的问题 目录 1.File概述 2.File构造方法 (1).根据文件路径创建文件对象 (2).根据父路径名字符串和子路径名字符串创建对象 (3).根据父路径对应文件对象和子路…