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

news2024/11/25 11:06:28

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.coloradmin.cn/o/1178095.html

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

相关文章

MySQL -- 索引

MySQL – 索引 文章目录 MySQL -- 索引一、索引简介1.简介2.索引效率的案例 二、认识磁盘1.磁盘2.结论3.磁盘随机访问(Random Access)与连续访问(Sequential Access) 三、MySQL 与磁盘交互基本单位1.基本单位2.MySQL中的数据管理 五、索引的理解1.索引案例2.单页mysql page3.管…

“七人拼团模式:创新玩法助力平台快速裂变引流“

七人拼团模式是一种结合了社交电商和拼购玩法的快速裂变引流模式。这种模式通过抽取平台营业所得作为奖励补贴用户,以更人性化的奖励机制吸引用户,服务用户,以此加快用户向粉丝的转变,为平台拉取有效流量。本文将介绍七人拼团模式…

二十、泛型(2)

本章概要 泛型接口泛型方法 变长参数和泛型方法一个泛型的 Supplier简化元组的使用一个 Set 工具 泛型接口 泛型也可以应用于接口。例如 生成器,这是一种专门负责创建对象的类。实际上,这是 工厂方法 设计模式的一种应用。不过,当使用生成…

基础课23——设计客服机器人

根据调查数据显示,使用纯机器人完全替代客服的情况并不常见,人机结合模式的使用更为普遍。在这两种模式中,不满意用户的占比都非常低,不到1%。然而,在满意用户方面,人机结合模式的用户满意度明显高于其他模…

freertos简单串口

先来完善一下FreeRTOSConfig.h这个配置文件 /*FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.All rights reservedVISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.This file is part of the FreeRTOS distribution.FreeRTOS is …

无代码平台哪家好,盘点最新国内十大无代码零代码平台排名

无代码(No Code)是一种通过使用可视化界面和预构建的模块来创建应用程序、网站或其他数字化解决方案的方法,不需要编写大量的手动代码。 无代码平台通常包括一些基本的构建块,如表单、按钮、文本框等,用户可以通过拖拽…

用小程序打造品牌网站的效果如何

网站是企业线上门户,很多企业或商家在成立之初就会选择搭建企业官网展示品牌、承载信息及服务相关预约咨询等,当然除了搭建网页外,还可以通过小程序实现官网效果。 除了浏览器流量外,如微信、百度、头条抖音、支付宝、快手等平台…

ACWing.第 128 场周赛 (B、C题解)

B、5286. 翻倍(思维推导) 一、题目要求 给定两个正整数,初始时两数均为 1。 你可以进行任意次(也可以不进行)翻倍操作,每次操作任选一个非负整数 k,令两数中的一个数乘以 k,另一个…

MySQL数据库之表操作

目录 表的操作1.创建表创建表案例 2.查看表结构3.修改表4.删除表 表的操作 1.创建表 语法: CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明: field 表示列…

Python异步编程--获取girlypic写真集

前言 在日常生活中,无论是网络配置、文件整理、web开发还是工具,时常用到Python写些脚本。 这次主要是分享下异步编程的经验,就拿获取girlypic的图片举例吧,也希望能给一些同学带来思考。 使用argparse而不是os.args&#xff0…

pytorch直线拟合

目录 1、数据分析 2、pytorch直线拟合 1、数据分析 直线拟合的前提条件通常包括以下几点: 存在线性关系:这是进行直线拟合的基础,数据点之间应该存在一种线性关系,即数据的分布可以用直线来近似描述。这种线性关系可以是数据点…

86.Linux系统下复制进程fork(逻辑地址和物理地址)

目录 fork复制进程 逻辑地址和物理地址 fork复制进程 fork 是一个系统调用,在 Linux/Unix 系统中用于创建一个新的进程,新进程称为子进程。子进程是父进程的副本,它从父进程那里继承了大部分属性和资源,包括代码、数据、打开的文…

【逗老师的无线电】Debian Linux手工编译安装MMDVM

看我干了啥,在Vmware里面装了一个Debian Linux并且运行了MMDVMHost,来支持业余无线电通联 开始之前先举个手,有多少朋友能分清MMDVM和Pi-Star关系的? MMDVM、Pi-Star和树莓派的关系 咱们先科普一下这个小知识点。各位HAM们应…

Python基础(第五期): python数据容器(序列) 列表 集合 元素 字符串 字典 序列遍历操作

python基础专栏 python基础(第五期) 文章目录 python基础(第五期)数据容器一、列表1、列表的定义2、列表的下标索引 3、列表的(添加)方法3.1 列表的查询方法3.2 修改特定下标索引的值3.3 列表指定位置插入元素3.3 列表指定元素的追…

自动驾驶高效预训练--降低落地成本的新思路(AD-PT)

自动驾驶高效预训练--降低落地成本的新思路 1. 之前的方法2. 主要工作——面向自动驾驶的点云预训练2.1. 数据准备 出发点:通过预训练的方式,可以利用大量无标注数据进一步提升3D检测 https://arxiv.org/pdf/2306.00612.pdf 1. 之前的方法 1.基于对比学…

setTimeout和setImmediate以及process.nextTick的区别?

目录 前言 setTimeout 特性和用法 setImmediate 特性和用法 process.nextTick 特性和用法 区别和示例 总结 在Node.js中,setTimeout、setImmediate和process.nextTick是用于调度异步操作的三种不同机制。它们之间的区别在于事件循环中的执行顺序和优先级。…

django安装数据库

使用pip安装django pip3 install django注意我使用的是python3所以用pip3安装,如需安装指定版本 django ..* 检测是否安装成功,不报错,则安装成功 # python3 # import django下边这是报错的 django迁移数据库 再mysql中简历数据库 CREATE DATABA…

COOHOM通过采用亚马逊云科“专库专用”的方式,为云原生的构建提供稳定的数据支撑

全球化浪潮下,面对全球化业务发展带来的新需求与新挑战,越来越多的企业开启了云原生构建旅程,以推动业务系统快速迭代,为国际业务的拓展打下坚实的基础。COOHOM是杭州群核信息技术有限公司旗下的国际化品牌。为全球企业和个人提供…

au怎么把音乐和人声单独分离出来?分享最简单的方法!

把音乐和人声单独分离,对于音频处理和后期制作来说,可以方便地对人声或音乐进行单独的处理和编辑,以达到更好的效果。下面介绍了怎么把利用AU音乐和人声单独分离出来的详细步骤。 一、AU 1、把自己需要处理的那首歌copy到桌面,再…

npm install:sill idealTree buildDeps

执行npm install,卡在 sill idealTree buildDeps PS D:\workspace-groovy\attendance-india-web> npm install -g cnpm --registryhttps://registry.npm.taobao.org [..................] / idealTree:node_global: sill idealTree buildDeps[.................…