10分钟入门Flink--架构和原理

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
简介: 相信你读完上一节的[《10分钟入门Flink--了解Flink》](https://mp.weixin.qq.com/s?__biz=MzI3OTA2MDQyOQ==&mid=2247483800&idx=1&sn=bcba92c8bc5081ec481f0ec01926ce26&chksm=eb4ccb3adc3b422cbae3bc577525f8611bcbb76b5ac4e5d395d5ee85f26897e27846b68bc4b8&token=2145213332&lang=zh_CN#rd)对Flink已经有初步了解了。这是继第一节之后的Flink入门系列的第二篇,本篇主要内容是

相信你读完上一节的《10分钟入门Flink--了解Flink》对Flink已经有初步了解了。这是继第一节之后的Flink入门系列的第二篇,本篇主要内容是是:了解Flink运行模式、Flink调度原理、Flink分区、Flink安装。

1、运行模式

Flink有多种运行模式,可以运行在一台机器上,称为本地(单机)模式;也可以使用YARN作为底层资源调度系统以分布式的方式在集群中运行,称为Flink On YARN模式;还可以使用Flink自带的资源调度系统,不依赖其他系统,称为Flink Standalone模式。还有将Flink部署到Kubernetes的模式,称为Flink On Kubernetes模式。

1.1、单机(本地)模式

直接下载jar包后启动。

1.2、Flink Standalone模式

先一起看下这种模式运行架构图:

Flink Standalone模式为经典的主从(Master/Slave)架构,资源调度是Flink自己实现的。集群启动后,主节点上会启动一个JobManager进程,类似YARN集群的ResourceManager,因此主节点也称为JobManager节点;各个从节点上会启动一个TaskManager进程,类似YARN集群的NodeManager,因此从节点也称为TaskManager节点。

执行流程:Client接收到Flink应用程序后,将作业提交给JobManager。JobManager要做的第一件事就是分配Task(任务)所需的资源。完成资源分配后,Task将被JobManager提交给相应的TaskManager,TaskManager会启动线程开始执行。在执行过程中,TaskManager会持续向JobManager汇报状态信息,例如开始执行、进行中或完成等状态。作业执行完成后,结果将通过JobManager发送给Client。

各组件作用:

Client :Client是提交作业的客户端,虽然不是运行时和作业执行时的一部分,但它负责准备和提交作业到JobManager,它可以运行在任何机器上,只要与JobManager环境连通即可。

JobManager :JobManager根据客户端提交的应用将应用分解为子任务,从资源管理器(YARN等)申请所需的计算资源,然后分发任务到TaskManager执行,并跟踪作业的执行状态等。JobManager的主要作用是协调资源分配、任务调度、故障恢复等。整个集群有且仅有一个活跃的JobManager。

TaskManager :TaskManager是Flink集群的工作进程。Task被调度到TaskManager上执行。TaskManager相互通信,只为在后续的Task之间交换数据。TaskManager工作内容:

  1. 接收JobManager分配的任务,负责具体的任务执行。TaskManager会在同一个JVM进程内以多线程的方式执行任务
  2. 负责对应任务在每个节点上的资源申请,管理任务的启动、停止、销毁、异常恢复等生命周期。
  3. 负责对数据进行缓存。TaskManager之间采用数据流的形式进行数据交互。

Task :Flink中的每一个操作算子称为一个Task(任务)。Task是基本的工作单元,由Flink的Runtime来执行。每个Task在一个JVM线程中执行。多个Task可以在同一个JVM进程中共享TCP连接(通过多路复用技术)和心跳信息。它们还可能共享数据集和数据结构,从而降低每个Task的开销。

Task Slot :TaskManager为了控制执行的Task数量,将计算资源(内存)划分为多个Task Slot(任务槽),每个Task Slot代表TaskManager的一份固定内存资源,Task则在Task Slot中执行。

1.3、Flink On YARN模式

先来回顾下yarn的集群架构:

Flink On YARN模式遵循YARN的官方规范,YARN只负责资源的管理和调度,运行哪种应用程序由用户自己实现,因此可能在YARN上同时运行MapReduce程序、Spark程序、Flink程序等。

Flink On YARN模式下的运行架构:

1.4、Flink On Kubernetes模式

这种模式我没用过,不做介绍,感兴趣的朋友可以自行查阅。

2、调度原理

2.1、任务链

Flink中的每一个操作算子称为一个Task(任务),算子的每个具体实例则称为SubTask(子任务),SubTask是Flink中最小的处理单元,多个SubTask可能在不同的机器上执行。一个TaskManager进程包含一个或多个执行线程,用于执行SubTask。TaskManager中的一个Task Slot对应一个执行线程,一个执行线程可以执行一个或多个SubTask。他们的结构如下图所示:

由于每个SubTask只能在一个线程中执行,为了能够减少线程间切换和缓冲的开销,在降低延迟的同时提高整体吞吐量,Flink可以将多个连续的SubTask链接成一个Task在一个线程中执行。这种将多个SubTask连在一起的方式称为任务链。任务链的结构如下图所示:

2.2、并行度

Flink应用程序可以在分布式集群上并行运行,其中每个算子的各个并行实例会在单独的线程中独立运行,并且通常情况下会在不同的机器上运行。为了充分利用计算资源,提高计算效率,可以增加算子的实例数(SubTask数量)。一个特定算子的SubTask数量称为该算子的并行度,且任意两个算子的并行度之间是独立的,不同算子可能拥有不同的并行度。如下图所示,将Source算子、map()算子、keyby()/window()/apply()算子的并行度设置为2,Sink算子的并行度设置为1。运行效果如下图所示:

2.3、数据流

一个Flink应用程序会被映射成逻辑数据流(Dataflow),而Dataflow都是以一个或多个Source开始、以一个或多个Sink结束的,且始终包括Source、Transformation、Sink三部分。

Dataflow描述了数据如何在不同算子之间流动,将这些算子用带方向的直线连接起来会形成一个关于计算路径的有向无环图,称为DAG(Directed Acyclic Graph,有向无环图)或Dataflow图。各个算子的中间数据会被保存在内存中。

Flink算子组成的DAG,如下图所示:

程序的Dataflow图,如下图所示:

2.3、执行图

Flink应用程序执行时会根据数据流生成多种图,转成执行图,每种图对应了作业的不同阶段,根据不同图的生成顺序,主要分为4层:StreamGraph→JobGraph→ExecutionGraph→物理执行图。具体过程见下图:

  • StreamGraph:流图。使用DataStream API编写的应用程序生成的最初的图代表程序的拓扑结构,描述了程序的执行逻辑。StreamGraph在Flink客户端中生成,在客户端应用程序最后调用execute()方法时触发StreamGraph的构建。
  • JobGraph:作业图。所有高级别API都需要转换为JobGraph。StreamGraph经过优化(例如任务链)后生成了JobGraph,以提高执行效率。StreamGraph和JobGraph都是在本地客户端生成的数据结构,而JobGraph需要被提交给JobManager进行解析。
  • ExecutionGraph:执行图。JobManager对JobGraph进行解析后生成的并行化执行图是调度层最核心的数据结构。它包含对每个中间数据集或数据流、每个并行任务以及它们之间的通信的描述。
  • 物理执行图:JobManager根据ExecutionGraph对作业进行调度后,在各个TaskManager上部署Task后形成的“图”。物理执行图并不是一个具体的数据结构,而是各个Task分布在不同的节点上所形成的物理上的关系表示。

2.4、执行计划

Flink的优化器会根据数据量或集群机器数等的不同自动地为程序选择执行策略。

3、数据分区

3.1、分区概念

在Flink中,数据流或数据集被划分成多个独立的子集,这些子集分布到了不同的节点上,而每一个子集称为分区(Partition)。因此可以说,Flink中的数据流或数据集是由若干个分区组成的。

3.2、分区数量

在运行期间,每个数据记录将被分配给一个或多个分区,各个分区中的数据可以并行计算。我们已经知道,数据是由上游算子的某个实例(SubTask)发往下游算子的一个或多个实例,而一个算子实例只负责计算一个分区的数据。因此,分区的数量是由下游算子的实例数量(并行度)决定的,发往下游算子的数据分区数量等于下游算子的实例数量。

数据分区的一个原则是使得分区的数量尽量等于集群节点CPU的核心数量。

3.3、分区策略

Flink分区策略决定了一条数据如何发送给下游算子的不同实例。

  • 转发策略

  • 广播策略

  • 键值策略

  • 随机策略

  • 全局策略

  • 自定义策略
    如果内置的分区策略不能满足当前需求,则可以在程序中自定义分区策略。这块后续再介绍。

4、安装

具体安装步骤参见下一篇。文中会介绍Flink Standalone的集群安装。

感谢你的阅读,欢迎关注、点赞、收藏!!!

原文链接:https://mp.weixin.qq.com/s/GwNQNHTr0-NrrajCoRM6Ag

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
相关文章
|
3月前
|
存储 监控 算法
园区导航系统技术架构实现与原理解构
本文聚焦园区导航场景中室内外定位精度不足、车辆调度路径规划低效、数据孤岛难以支撑决策等技术痛点,从架构设计到技术原理,对该系统从定位到数据中台进行技术拆解。
110 0
园区导航系统技术架构实现与原理解构
|
4月前
|
消息中间件 存储 Kafka
一文带你从入门到实战全面掌握RocketMQ核心概念、架构部署、实践应用和高级特性
本文详细介绍了分布式消息中间件RocketMQ的核心概念、部署方式及使用方法。RocketMQ由阿里研发并开源,具有高性能、高可靠性和分布式特性,广泛应用于金融、互联网等领域。文章从环境搭建到消息类型的实战(普通消息、延迟消息、顺序消息和事务消息)进行了全面解析,并对比了三种消费者类型(PushConsumer、SimpleConsumer和PullConsumer)的特点与适用场景。最后总结了使用RocketMQ时的关键注意事项,如Topic和Tag的设计、监控告警的重要性以及性能与可靠性的平衡。通过学习本文,读者可掌握RocketMQ的使用精髓并灵活应用于实际项目中。
2353 9
 一文带你从入门到实战全面掌握RocketMQ核心概念、架构部署、实践应用和高级特性
|
4月前
|
存储 消息中间件 canal
zk基础—2.架构原理和使用场景
ZooKeeper(ZK)是一个分布式协调服务,广泛应用于分布式系统中。它提供了分布式锁、元数据管理、Master选举及分布式协调等功能,适用于如Kafka、HDFS、Canal等开源分布式系统。ZK集群采用主从架构,具有顺序一致性、高性能、高可用和高并发等特点。其核心机制包括ZAB协议(保证数据一致性)、Watcher监听回调机制(实现通知功能)、以及基于临时顺序节点的分布式锁实现。ZK适合小规模集群部署,主要用于读多写少的场景。
|
5月前
|
存储 人工智能 自然语言处理
为什么混合专家模型(MoE)如此高效:从架构原理到技术实现全解析
本文深入探讨了混合专家(MoE)架构在大型语言模型中的应用与技术原理。MoE通过稀疏激活机制,在保持模型高效性的同时实现参数规模的大幅扩展,已成为LLM发展的关键趋势。文章分析了MoE的核心组件,包括专家网络与路由机制,并对比了密集与稀疏MoE的特点。同时,详细介绍了Mixtral、Grok、DBRX和DeepSeek等代表性模型的技术特点及创新。MoE不仅解决了传统模型扩展成本高昂的问题,还展现出专业化与适应性强的优势,未来有望推动AI工具更广泛的应用。
1805 4
为什么混合专家模型(MoE)如此高效:从架构原理到技术实现全解析
|
4月前
|
机器学习/深度学习 运维 监控
实时异常检测实战:Flink+PAI 算法模型服务化架构设计
本文深入探讨了基于 Apache Flink 与阿里云 PAI 构建的实时异常检测系统。内容涵盖技术演进、架构设计、核心模块实现及金融、工业等多领域实战案例,解析流处理、模型服务化、状态管理等关键技术,并提供性能优化与高可用方案,助力企业打造高效智能的实时异常检测平台。
327 1
|
5月前
|
机器学习/深度学习 算法 测试技术
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
本文探讨了基于图的重排序方法在信息检索领域的应用与前景。传统两阶段检索架构中,初始检索速度快但结果可能含噪声,重排序阶段通过强大语言模型提升精度,但仍面临复杂需求挑战
139 0
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
|
6月前
|
SQL 运维 Java
蚂蚁 Flink 实时计算编译任务 Koupleless 架构改造
本文介绍了对Flink实时计算编译任务的Koupleless架构改造。为解决进程模型带来的响应慢、资源消耗大等问题,团队将进程模型改为线程模型,并借助Koupleless的类加载隔离能力实现版本和包的隔离。通过动态装配Plugin及其Classpath,以及Biz运行时仅对依赖Plugin可见的设计,大幅优化了编译任务的性能。结果表明,新架构使编译耗时降低50%,吞吐量提升5倍以上。
蚂蚁 Flink 实时计算编译任务 Koupleless 架构改造
|
5月前
|
Java 开发者 Spring
Spring框架 - 深度揭秘Spring框架的基础架构与工作原理
所以,当你进入这个Spring的世界,看似一片混乱,但细看之下,你会发现这里有个牢固的结构支撑,一切皆有可能。不论你要建设的是一座宏大的城堡,还是个小巧的花园,只要你的工具箱里有Spring,你就能轻松搞定。
210 9
|
10月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。

热门文章

最新文章