热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flink教程(05)Flink原理简单分析

文章目录01引言02Flink角色03Flink执行流程3.1Standalone版本3.2onyarn04FlinkStreamingDataflow4.1Flink相关词汇4.


文章目录

  • 01 引言
  • 02 Flink角色
  • 03 Flink执行流程
    • 3.1 Standalone版本
    • 3.2 on yarn
  • 04 Flink Streaming Dataflow
    • 4.1 Flink相关词汇
    • 4.2 Operator传递模式
    • 4.3 Operator Chain
    • 4.4 任务槽与槽共享
      • 4.4.1 任务槽(TaskSlot)
      • 4.4.2 槽共享(Slot Sharing)
  • 05 Flink运行时组件
    • 5.1 作业管理器(JobManager)
    • 5.2 任务管理器(TaskManager)
    • 5.3 资源管理器(ResourceManager)
    • 5.4 分发器(Dispatcher)
  • 06 Flink执行图(ExecutionGraph)
    • 6.1 原理


01 引言

在前面的博客,我们运行了简单的Flink案例了,有兴趣的同学可以参阅下:


  • 《Flink教程(01)- Flink知识图谱》
  • 《Flink教程(02)- Flink入门》
  • 《Flink教程(03)- Flink环境搭建》
  • 《Flink教程(04)- Flink入门案例》

本文简单讲解Flink的原理。


02 Flink角色

在实际生产中,Flink 都是以集群在运行,在运行的过程中包含了两类进程。

Flink有如下角色:


  • JobManager:它扮演的是集群管理者的角色,负责调度任务、协调 checkpoints、协调故障恢复、收集Job 的状态信息,并管理Flink集群中的从节点 TaskManager;
  • TaskManager:实际负责执行计算的 Worker,在其上执行Flink Job的一组 Task;TaskManager还是所在节点的管理员,它负责把该节点上的服务器信息比如内存、磁盘、任务运行情况等向 JobManager 汇报。
  • Client:用户在提交编写好的 Flink工程时,会先创建一个客户端再进行提交,这个客户端就是 Client

在这里插入图片描述

在这里插入图片描述


03 Flink执行流程


3.1 Standalone版本

在这里插入图片描述


3.2 on yarn

在这里插入图片描述
上述流程:


  1. ClientHDFS上传FlinkJar包和配置 ;
  2. ClientYarn ResourceManager提交任务并申请资源;
  3. ResourceManager分配Container资源并启动ApplicationMaster,然后AppMaster加载FlinkJar包和配置构建环境,启动JobManager;
  4. ApplicationMasterResourceManager申请工作资源,NodeManager加载FlinkJar包和配置构建环境并启动TaskManager;
  5. TaskManager启动后向JobManager发送心跳包,并等待JobManager向其分配任务。

04 Flink Streaming Dataflow


4.1 Flink相关词汇

官网关于Flink的词汇表:https://ci.apache.org/projects/flink/flink-docs-release-1.11/concepts/glossary.html#glossary


  • Dataflow:Flink程序在执行的时候会被映射成一个数据流模型
  • Operator:数据流模型中的每一个操作被称作Operator,Operator分为:Source/Transform/Sink
  • Partition:数据流模型是分布式的和并行的,执行中会形成1~n个分区
  • Subtask:多个分区任务可以并行,每一个都是独立运行在一个线程中的,也就是一个Subtask子任务
  • Parallelism:并行度,就是可以同时真正执行的子任务数/分区数

在这里插入图片描述


4.2 Operator传递模式

数据在两个Operator(算子)之间传递的时候有两种模式:


  • One to One模式:两个operator用此模式传递的时候,会保持数据的分区数和数据的排序;如上图中的Source1Map1,它就保留的Source的分区特性,以及分区元素处理的有序性。
  • Redistributing 模式:这种模式会改变数据的分区数 ,每个一个operator subtask会根据选择transformation把数据发送到不同的目标subtasks,比如keyBy()会通过hashcode重新分区,broadcast()rebalance()方法会随机重新分区。

4.3 Operator Chain

在这里插入图片描述
客户端在提交任务的时候会对Operator进行优化操作,能进行合并的Operator会被合并为一个Operator,合并后的Operator称为Operator chain,实际上就是一个执行链,每个执行链会在TaskManager上一个独立的线程中执行–就是SubTask


4.4 任务槽与槽共享


4.4.1 任务槽(TaskSlot)

在这里插入图片描述
每个TaskManager是一个JVM的进程,为了控制一个TaskManager(worker)能接收多少个task,Flink通过Task Slot来进行控制。


  • TaskSlot数量是用来限制一个TaskManager工作进程中可以同时运行多少个工作线程;
  • TaskSlot是一个TaskManager 中的最小资源分配单位;
  • 一个 TaskManager中有多少个 TaskSlot就意味着能支持多少并发的Task处理。

Flink将进程的内存进行了划分到多个slot中,内存被划分到不同的slot之后可以获得如下好处:


  • TaskManager最多能同时并发执行的子任务数是可以通过TaskSolt数量来控制的;
  • TaskSolt有独占的内存空间,这样在一个TaskManager中可以运行多个不同的作业,作业之间不受影响。

4.4.2 槽共享(Slot Sharing)

在这里插入图片描述
Flink允许子任务共享插槽,即使它们是不同任务(阶段)的子任务(subTask),只要它们来自同一个作业

比如上图图左下角中的mapkeyBysink 在一个 TaskSlot里执行以达到资源共享的目的。

允许插槽共享有两个主要好处:


  • 资源分配更加公平,如果有比较空闲的slot可以将更多的任务分配给它;
  • 有了任务槽共享,可以提高资源的利用率。

注意:


  • slot是静态的概念,是指taskmanager具有的并发执行能力;
  • parallelism是动态的概念,是指程序运行时实际使用的并发能力。

05 Flink运行时组件

在这里插入图片描述

Flink运行时架构主要包括四个不同的组件,它们会在运行流处理应用程序时协同工作:


  • 作业管理器(JobManager):分配任务、调度checkpoint做快照
  • 任务管理器(TaskManager):主要干活的
  • 资源管理器(ResourceManager):管理分配资源
  • 分发器(Dispatcher):方便递交任务的接口,WebUI

因为Flink是用JavaScala实现的,所以所有组件都会运行在Java虚拟机上,每个组件的职责如下:


5.1 作业管理器(JobManager)


  • 控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobManager 所控制执行。
  • JobManager 会先接收到要执行的应用程序,这个应用程序会包括:作业图(JobGraph)、逻辑数据流图(logical dataflow graph)和打包了所有的类、库和其它资源的JAR包;
  • JobManager 会把JobGraph转换成一个物理层面的数据流图,这个图被叫做“执行图”(ExecutionGraph),包含了所有可以并发执行的任务;
  • JobManager会向资源管理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)上的插槽(slot),一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TaskManager上,而在运行过程中,JobManager会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。

5.2 任务管理器(TaskManager)


  • Flink中的工作进程,通常在Flink中会有多个TaskManager运行,每一个TaskManager都包含了一定数量的插槽(slots)。插槽的数量限制了TaskManager能够执行的任务数量。
  • 启动之后,TaskManager会向资源管理器注册它的插槽;收到资源管理器的指令后,TaskManager就会将一个或者多个插槽提供给JobManager调用。JobManager就可以向插槽分配任务(tasks)来执行了。
  • 在执行过程中,一个TaskManager可以跟其它运行同一应用程序的TaskManager交换数据。

5.3 资源管理器(ResourceManager)


  • 主要负责管理任务管理器(TaskManager)的插槽(slot),TaskManger 插槽是Flink中定义的处理资源单元。
  • Flink为不同的环境和资源管理工具提供了不同资源管理器,比如YARNMesosK8s,以及standalone部署。
  • JobManager申请插槽资源时,ResourceManager会将有空闲插槽的TaskManager分配给JobManager。如果ResourceManager没有足够的插槽来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。

5.4 分发器(Dispatcher)


  • 可以跨作业运行,它为应用提交提供了REST接口;
  • 当一个应用被提交执行时,分发器就会启动并将应用移交给一个JobManager;
  • Dispatcher也会启动一个Web UI,用来方便地展示和监控作业执行的信息;
  • Dispatcher在架构中可能并不是必需的,这取决于应用提交运行的方式。

06 Flink执行图(ExecutionGraph)

Flink程序直接映射成的数据流图是StreamGraph,也被称为逻辑流图,因为它们表示的是计算逻辑的高级视图,为了执行一个流处理程序,Flink需要将逻辑流图转换为物理数据流图(也叫执行图),详细说明程序的执行方式。

Flink 中的执行图可以分成四层:StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图:
在这里插入图片描述


6.1 原理

Flink执行executor会自动根据程序代码生成DAG数据流图;

Flink 中的执行图可以分成四层:StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图:


  • StreamGraph :是根据用户通过 Stream API编写的代码生成的最初的图,表示程序的拓扑结构
  • JobGraph :StreamGraph经过优化后生成了JobGraph,提交给JobManager的数据结构。主要的优化为,将多个符合条件的节点 chain在一起作为一个节点,这样可以减少数据在节点之间流动所需要的序列化/反序列化/传输消耗。
  • ExecutionGraph :JobManager根据 JobGraph生成ExecutionGraphExecutionGraphJobGraph的并行化版本,是调度层最核心的数据结构。
  • 物理执行图 :JobManager 根据 ExecutionGraphJob进行调度后,在各个TaskManager 上部署 Task后形成的“图”,并不是一个具体的数据结构。

可以简单理解为:


  • StreamGraph:最初的程序执行逻辑流程,也就是算子之间的前后顺序–在Client上生成;
  • JobGraph:将OneToOneOperator合并为OperatorChain–在Client上生成
  • ExecutionGraph:将JobGraph根据代码中设置的并行度和请求的资源进行并行化规划!–在JobManager上生成
  • 物理执行图:将ExecutionGraph的并行计划,落实到具体的TaskManager上,将具体的SubTask落实到具体的TaskSlot内进行运行。

推荐阅读
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 在项目开发中,我们搭建了私有的Maven仓库服务器,以方便管理和下载所需的JAR包。然而,某些外部JAR包可能无法从公共Maven仓库获取,或者我们自行开发了一些仅供公司内部使用的插件,这些都需要上传到私有仓库中进行共享。本文详细介绍了如何使用Maven命令行工具将这些第三方JAR包部署至Nexus仓库服务器,确保团队成员能够轻松访问和使用这些资源。 ... [详细]
  • 本指南详细介绍了如何在CentOS 6.6 64位系统上以root用户身份部署Tomcat 8服务器。系统环境为CentOS 6.6 64位,采用源码安装方式。所需软件为apache-tomcat-8.0.23.tar.gz,建议将软件下载至/root/opt目录。具体下载地址请参见官方资源。本指南涵盖了从环境准备到服务启动的完整步骤,适用于需要在该系统环境下搭建高性能Web应用服务器的技术人员。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 本文最初发表在Thorben Janssen的Java EE博客上,每周都会分享最新的Java新闻和动态。 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 本文深入探讨了如何利用Maven高效管理项目中的外部依赖库。通过介绍Maven的官方依赖搜索地址(),详细讲解了依赖库的添加、版本管理和冲突解决等关键操作。此外,还提供了实用的配置示例和最佳实践,帮助开发者优化项目构建流程,提高开发效率。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • CSS3 @font-face 字体应用技术解析与实践
    在Web前端开发中,HTML教程和CSS3的结合使得网页设计更加多样化。长期以来,Web设计师受限于“web-safe”字体的选择。然而,CSS3中的`@font-face`规则允许从服务器端加载自定义字体,极大地丰富了网页的视觉效果。通过这一技术,设计师可以自由选择和使用各种字体,提升用户体验和页面美观度。本文将深入解析`@font-face`的实现原理,并提供实际应用案例,帮助开发者更好地掌握这一强大工具。 ... [详细]
author-avatar
mobiledu2502873797
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有