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

Flink架构及基本概念

TaskManager启动后,JobManager会与它建立连接,并将作业图(JobGraph)转换成可执行的执行图


TaskManager启动后,JobManager会与它建立连接,并将作业图(JobGraph)转换成可执行的执行图(ExecutionGraph)分发给可用的TaskManager,然后由TaskManager具体执行任务。


作业管理器(JobManager)

对于一个提交执行的作业,Jobmanager是管理者(Master),负责管理调度,在不考虑高可用的情况下只能有一个。JobManager是一个Flink集群中任务管理和调度的核心,是控制应用执行的主程序。即每个以用都应该被唯一的JobManager所控制执行。
JobManager包括3个组件


JobMaster

jobMaster是JobManager中最核心的组件,负责处理单独的作业。jobMaster和具体的job是一一对应的,多个job可以同时运行在一个Flink集群中,每个job都有一个自己的jobMaster
作业提交时,jobMaster会先接收到要执行的应用。jobMaster会把JobGraph转换成一个物理层面的数据流图,这个图被称作“执行图”,它包含了所有可以并发执行的任务。jobMaster会向资源管理器发出请求,申请执行任务必要的资源。一旦获取到了足够的资源,就会将执行图发到真正运行它们的TaskManager上。
在运行过程中,JobMaster会负责所有需要中央协调的操作。


ResourceManager(资源管理器)

ResourceManager主要负责资源的分配和管理,在Flink集群中只有一个。所谓“资源”,主要指的是TaskManager的任务槽(task Slots)。任务槽就是Flink集群中的资源调配单元,包含了机器用来执行计算的一组CPU和内存资源。每一个任务(task)都需要分配到一个slot上执行。
在Standalone部署时,因为TaskManager是单独启动的,所以ResourceManager只能分发可用TaskManager的任务槽,不能启动新的TaskManager。
在有资源管理平台时,当新的作业申请资源时,ResourceManager会将有空闲的槽位的TaskManager分配给JobManager。如果ResourceManager没有足够的任务槽,它还可以向资源提供平台发起会话,请求提供启动TaskManager进程的容器。另外,ResourceManager还负责停掉空闲的TaskManager,释放计算资源。


Dispatcher(分发器)

Dispatcher主要负责提供一个REST接口,用来提交作业,并且负责每一个新提交的作业启动一个新的JobManager组件。Dispatcher也会启动一个Web UI,用来方便地展示监控作业执行的信息。


任务管理器(TaskManager)

TaskManager是工作者(Worker、Slave),负责执行任务处理数据,所以可以有一个或多个。
TaskManager是Flink中的工作进程,负责数据流的具体计算任务。Flink集群中必须至少有一个TaskManaager;每个TaskManager都包含了一定数量的任务槽。Slot是资源调度的最小单位,slots的数量限制了TaskManager能够并行处理的任务数量。
启动之后,TaskManager会将一个或多个槽位提供给JobMaster调用,jobMaster就可以分配任务来执行。
在执行过程中,TaskManager可以缓冲数据,还可以跟其它运行同一应用的TaskManager交换数据。


作业提交流程


独立模式

独立模式下,只有会话模式和应用模式两种部署方式。两者流程基本类似:TaskManager都需要手动启动,所以当ResourceManager收到JobMaster的请求时,会直接要求TaskManager提供资源。而JobMaster的启动时间点,会话模式是预先启动,应用模式则是在作业提交时启动。
1. 由客户端通过分发器提供的REST接口,将作业提交给JobManager
2. 由分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster。
3. JobManager将JobGraph解析为可执行的ExecutionGraph,得到所需的资源数量,然后再向资源管理器请求任务资源槽。
4. 资源管理器判断当前是否有足够的资源;如果没有则启动新的TaskManager。
5. TaskManager启动后,向ResourceManager注册自己可用的任务槽。
6. 资源管理器通知TaskManager为新的作业提供slots。
7. TaskManager连接到对应的JobMaster,提供slots
8. jobMaster将需要执行的任务分发给TaskManager。
9. TaskManager执行任务。


Yarn集群


  • 会话模式 提交作业流程
    1. 客户端通过REST接口,将作业提交给分发器
    2. 分发器启动JobMaster,并将作业(包含JobGraph)提交给JobMaster
    3. JobMaster向资源管理器请求资源
    4. 资源管理器向Yarn的资源管理器请求container资源
    5. Yarn启动新的TaskManager容器
    6. TaksManager启动后,向Flink的资源管理器注册自己的可用任务槽
    7. 资源管理器通知TaskManager为新的作业提供任务槽
    8. TaskManager连接到对应的JobMaster,提供任务槽
    9. JobMaster将需要执行的任务分发到TaskManager,执行任务

  • 单作业模式提交作业流程
    1. 客户端将作业提交给YARN的资源管理器,这一步中会同时将Flink的Jar包和配置上传到HDFS,以便后续启动的Flink相关组件的容器
    2. YARN的资源管理器分配容器资源,启动Flink JobManager,并将作业提交给JobMaster
    3. JobMaster向资源管理器请求资源
    4. 资源管理器请YARN的资源管理器请求容器
    5. YARN启动新的TakManager容器
    6. TaskManager启动后,向Flink的任务管理器注册自己的可用任务槽
    7. 资源管理器通知TaskManager为新的任务提供任务槽
    8. TaskManager连接到对应的JobMaster,提供任务槽
    9. JobManager将需要执行的任务分发给TaskManager,执行任务

  • 应用模式
    应用模式与单作业模式的提交流程类似,只是初始提交给YARN资源管理器的不再是具体的作业,而是整个应用。一个应用中可能包含多个作业,这些作业都在Flink集群中启动各自对应的JobMaster。


重要概念


数据流图(Dataflow Graph)

Flink中每一个处理转换操作称为“算子”。
所有的Flink程序都可以归纳为由三部分构成:Source、Transformation和Sink


  • Source 表示“元算子”,负责读取数据源。
  • Transformation表示“转换算子”,利用各种算子进行加工处理
  • Sink表示“下沉算子”,负责数据的输出

在运行时,Flink程序会被映射成所有算子按照逻辑顺序链接在一起的一张图,被称为“逻辑数据流”(数据流图)。


并行度

一个特定算子的子任务(subtask)的个数被称之为其并行度(parallelism)。包含并行子任务的数据流,就是并行数据流,它需要多个分区(stream partition)来分配并行任务。一般情况下,一个流程序的并行度,可以认为就是其所有算子中最大的并行度。一个程序中,不同的算子可能具有不同的并行度


并行度设置

Flink中,可以用不同的方法来设置并行度,它们的有效范围和优先级是不同的。


  1. 代码中设置

// 算子后跟着调用setParallelism()方法,来设置当前算子的并行度,这种设置只对当前算子有效
stream.map((_, 1)).setParallelism(2)

注:KeyBy()方法返回的不是算子,所以无法对KeyBy()设置并行度
2. 提交作业时设置

# 使用flink run命令提交作业时,可以增加-p参数来设置当前应用程序的执行并行度,作用类似于执行环境的全局设置
bin/flink run -p 2 -c com.wc.StreamWordCount ./FlinkWc-1.0.jar

  1. 配置文件中设置
    修改集群的配置文件flink-conf.yaml中直接更改默认并行度

parallelism.default: 2

对整个集群上提交的所有作业有效,默认为1。


算子连

在Flink中,并行度相同的一对一算子操作,可以直接连接在一起 形成一个“大”的任务,这样原本的算子就成为真正任务里的一部分,每个任务会被一个线程执行。这样的技术被称为“算子链”。


算子间数据传输

  1. 一对一
    这种模式下,数据流维护着分区以及元素的顺序。Source算子读取数据之后,可以直接发送给 map()算子做处理,它们之间不需要重新分区,也不需要调整数据的顺序。这就意味着 map() 算子的子任务,看到的元素个数和顺序跟 Source 算子的子任务产生的完全一样,保证着“一对一”的关系。map()、filter()、flatMap()等算子都是这种one-to-one 的对应关系
  2. 重分区
    每一个算子的子任务,会根据数据传输的策略,把数据发送到不同的下游目标任务。例如,keyBy()是分组操作,本质上基于键(key)的哈希值(hashCode)进行了重分区;而当并行度改变时,比如从并行度为 2 的 window 算子,要传递到并行度为 1 的 Sink 算子,这时的数据传输方式是再平衡(rebalance),会把数据均匀地向下游子任务分发出去。这些传输方式都会引起重分区(redistribute)的过程

合并算子链

Flink 默认会按照算子链的原则进行链接合并,如果我们想要禁止合并或者自行定义,也可以在代码中对算子做一些特定的设置:

// 禁用算子链
.map((_,1)).disableChaining()
// 从当前算子开始新链
.map((_,1)).startNewChain()

作业图与执行图

Flink 中任务调度执行的图,按照生成顺序可以分成四层:
逻辑流图(StreamGraph)→ 作业图(JobGraph)→ 执行图(ExecutionGraph)→ 物理图(Physical Graph)


  1. 逻辑流图
    根据用户通过DataStream API编写的代码生的最初的DAG图,用来表示程序的拓扑结构
  2. 作业图
    逻辑流图经过优化之后生成的就是作业图,这是提交给JobManager的数据结构,确定了当前作业中所有任务的划分。主要的优化为:将多个符合条件的节点连接在一起合并成一个任务节点,形成算子链,这样可以减少数据交换的消耗。作业图一般在客户端生成,在作业提交时传递给JobMaster。
  3. 执行图
    JobMaster收到作业图后,会根据它来生成执行图。执行图时作业图的并行化版本,是调度最核心的数据结构。
  4. 物理图
    JobMaster生成执行图后,会将它分发给TaskManager;各个TaskManager会根据执行图部署任务,最终的物理执行过程也会形成一张“图”,一般就叫做物理图,这只是具体执行层面的图,并不是一个具体的数据结构

任务和任务槽


任务槽

Flink中每一个work都是一个JVM进程,它可以启动多个独立的线程,来并行执行多个任务。
为了控制并发量,需要在TaskManager上对每个任务运行所占用的资源做出明确的划分,这就是所谓的任务槽。每个任务槽其实表示了TaskManager拥有计算资源的一个固定大小的子集。


任务槽数量的设置

可以通过集群的配置文件来设定TaskManager的槽数量

taskmanager.numberOfTaskSlots: 8

通过调整槽的数量,可以控制子任务间的隔离级别。槽目前只能用来隔离内存,不会涉及CPU隔离


任务对任务槽的共享

默认情况下,Flink允许子任务共享槽。如果希望某个算子对应的任务完全独占一个槽,或者只有某一部分共享槽,可以通过设置“槽共享组”手动指定

.map((_,1)).slotSharingGroup("1")

这样属于同一个槽共享组的子任务,才会开启槽共享;不同组之间的任务时完全隔离的,必须分配到不同的槽上


任务槽和并行度的关系

任务槽时静态的概念,是指TaskManager具有的并发执行能力,可以通过参数taskmanager…numberOfTaskSlots进行设置;而并行度是动态概念,就是TaskManager运行程序时实际使用的并发能力,可以通过参数parallelism.default进行设置。







推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 你知道Kafka和Redis的各自优缺点吗?一文带你优化选择,不走弯路 ... [详细]
  • 数据库异常智能分析与诊断
    数据库,异常, ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文总结了淘淘商城项目的功能和架构,并介绍了传统架构中遇到的session共享问题及解决方法。淘淘商城是一个综合性的B2C平台,类似京东商城、天猫商城,会员可以在商城浏览商品、下订单,管理员、运营可以在平台后台管理系统中管理商品、订单、会员等。商城的架构包括后台管理系统、前台系统、会员系统、订单系统、搜索系统和单点登录系统。在传统架构中,可以采用tomcat集群解决并发量高的问题,但由于session共享的限制,集群数量有限。本文探讨了如何解决session共享的问题。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • Struts2+Sring+Hibernate简单配置
    2019独角兽企业重金招聘Python工程师标准Struts2SpringHibernate搭建全解!Struts2SpringHibernate是J2EE的最 ... [详细]
  • Play1.2.3中主要包括的第三方包有xstreamxml与object互转snakeyamlyaml解析与发射slf4j日志接口相关signpost ... [详细]
  • Linux运维 第五阶段 puppet基础
    一、相关概念:1、puppet基于CS架构,使用ruby编写,在类UNIX平台上集中配置管理系统,它可以管理配置文件、用户、 ... [详细]
author-avatar
海啸1203_902
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有