flinkonyarn时,如何确定taskmanager数

author author     2023-03-26     469

关键词:

参考技术A 答案写在最前面:Job的最大并行度除以每个TaskManager分配的任务槽数。

在 Flink 1.5 Release Notes 中,有这样一段话,直接上截图。

这说明从1.5版本开始,Flink on YARN时的容器数量——亦即TaskManager数量——将由程序的并行度自动推算,也就是说flink run脚本的-yn/--yarncontainer参数不起作用了。那么自动推算的规则是什么呢?要弄清楚它,先来复习Flink的并行度(Parallelism)和任务槽(Task Slot)。

与Spark类似地,一个Flink Job在生成执行计划时也划分成多个Task。Task可以是Source、Sink、算子或算子链(算子链有点意思,之后会另写文章详细说的)。Task可以由多线程并发执行,每个线程处理Task输入数据的一个子集。而并发的数量就称为Parallelism,即并行度。

Flink程序中设定并行度有4种级别,从低到高分别为:算子级别、执行环境(ExecutionEnvironment)级别、客户端(命令行)级别、配置文件(flink-conf.yaml)级别。实际执行时,优先级则是反过来的,算子级别最高。简单示例如下。

Flink运行时由两个组件组成:JobManager与TaskManager,与Spark Standalone模式下的Master与Worker是同等概念。从官网抄来的图如下所示,很容易理解。

JobManager和TaskManager本质上都是JVM进程。为了提高Flink程序的运行效率和资源利用率,Flink在TaskManager中实现了任务槽(Task Slot)。任务槽是Flink计算资源的基本单位,每个任务槽可以在同一时间执行一个Task,而TaskManager可以拥有一个或者多个任务槽。

任务槽可以实现TaskManager中不同Task的资源隔离,不过是逻辑隔离,并且只隔离内存,亦即在调度层面认为每个任务槽“应该”得到taskmanager.heap.size的N分之一大小的内存。CPU资源不算在内。

TaskManager的任务槽个数在使用flink run脚本提交on YARN作业时用-ys/--yarnslots参数来指定,另外在flink-conf.yaml文件中也有默认值taskManager.numberOfTaskSlots。一般来讲,我们设定该参数时可以将它理解成一个TaskManager可以利用的CPU核心数,因此也要根据实际情况(集群的CPU资源和作业的计算量)来确定。

以Flink自带示例中简化的WordCount程序为例:

用--yarnslots 3参数来执行,即每个TaskManager分配3个任务槽。TaskManager、任务槽和任务的分布将如下图所示,方括号内的数字为并行线程的编号。

由图中可以看出,由于算子链机制的存在,KeyAgg与Sink操作链接在了一起,作为一个Task来执行。

Flink允许任务槽共享,即来自同一个Job的不同Task的Sub-Task(理解为Task的子集就行)进入同一个槽位,因此在图中也可以见到任务槽X中同时存在FlatMap[X]与KeyAgg[X]+Sink[X]。任务槽共享有两点好处:

所以,可以得出Flink on YARN时,TaskManager的数量就是:max(parallelism) / yarnslots(向上取整)。例如,一个最大并行度为20,每个TaskManager有两个任务槽的作业,就会启动10个TaskManager,如Web UI所示。

参考: https://www.jianshu.com/p/5b670d524fa5

flink1.6系列之—flinkonyarn流程详解

 本篇我们介绍下,Flink在YARN上运行流程:   当开始一个新的Flinkyarn会话时,客户端首先检查所请求的资源(containers和内存)是否可用。如果资源够用,之后,上传一个jar包,包含Flink和HDFS的配置。客户端向yarnreso... 查看详情

flinkonyarn如何查看任务日志

参考技术A无论Flink还是Spark都支持自建集群(standalonecluster)。但是为了保证稳定性和资源隔离等,生产环境里的任务最好借助资源管理框架(如Yarn)运行。任务运行在yarn上,查询日志就可能不是很方便,尤其是任务进程异常退出之... 查看详情

设计时组件如何确定项目目录

】设计时组件如何确定项目目录【英文标题】:Howcanacomponentatdesigntimedeterminetheprojectdirectory【发布时间】:2011-01-2621:01:06【问题描述】:我编写了一个组件,它应该存储一些与项目目录相关的信息。每次更改我的组件的属性时,... 查看详情

flinkonyarn三部曲之三:提交flink任务(代码片段)

欢迎访问我的GitHub本文是《FlinkonYarn三部曲》系列的终篇,先简单回顾前面的内容:《FlinkonYarn三部曲之一:准备工作》:准备好机器、脚本、安装包;《FlinkonYarn三部曲之二:部署和设置》:完成CDH和Flink部署,并在管理页面做... 查看详情

flinkonyarn模式配置(代码片段)

FlinkOnYarn模式配置FlinkOnYarn模式配置引言一、安装JDK二、安装Hadoop三、安装Zookeeper四、安装FlinkFlinkOnYarn模式配置引言​Flink依靠Yarn来实现高可用,由于Yarn依赖于Hadoop,而Hadoop又依赖于Jdk。​准备三台机器​1.1.1.1node1​1.1.1... 查看详情

flinkonyarn模式启动流程分析

...欢迎访问网易云社区,了解更多网易技术产品运营经验。FlinkOnYarn架构Paste_Image.png前提条件首先需要配置YARN_CONF_DIR,HADOOP_CONF_DIR,HADOOP_CONF_PATH其中一个用来确保Flink能够访问HDFS和Yarn的RM。主要启动流程1.启动进程首先我们通过下... 查看详情

flinkonyarn模式启动流程分析

...欢迎访问网易云社区,了解更多网易技术产品运营经验。FlinkOnYarn架构Paste_Image.png前提条件首先需要配置YARN_CONF_DIR,HADOOP_CONF_DIR,HADOOP_CONF_PATH其中一个用来确保Flink能够访问HDFS和Yarn的RM。主要启动流程1.启动进程首先我们通过下... 查看详情

GSM返回'99'时如何确定信号强度?

】GSM返回\\\'99\\\'时如何确定信号强度?【英文标题】:HowtodeterminesignalstrengthwhenGSMreturns\'99\'?GSM返回\'99\'时如何确定信号强度?【发布时间】:2011-11-1519:18:52【问题描述】:我们有一个内部Android应用程序,它是对现有JME应用程序... 查看详情

使用 QueryMultiple 时如何确定返回哪些记录?

】使用QueryMultiple时如何确定返回哪些记录?【英文标题】:HowtodeterminewhichrecordsarereturnedwhenusingQueryMultiple?【发布时间】:2021-07-1513:37:04【问题描述】:我正在通过执行以下操作来检索记录:using(varmulti=awaitconnection.QueryMultipleAsync(... 查看详情

flinkonyarn(上):一张图轻松掌握基础架构与启动流程

...N集群部署模式在国内的应用越来越广泛。Flink社区将推出FlinkonYARN应用解读系列文章,分为上、下两篇。本文基于FLIP-6重构后的资源调度模型将介绍FlinkonYARN应用启动全流程,并进行详细步骤解析。FlinkonYARN应用启 查看详情

flinkonyarn启动模式对比

|启动模式|优点|缺点||||||yarn-session模式|在yarn集群提前开辟一块固定资源空间,flinkjob共享一个jm,jmwebui固定,适合细粒度job的添加和停止,和运行时间短的,频繁添加修改的flinkjob|资源不释放,申请的yarn 查看详情

flinkonyarn三部曲之二:部署和设置

欢迎访问我的GitHub本文是《FlinkonYarn三部曲》系列的第二篇,上一篇《FlinkonYarn三部曲之一:准备工作》已将所需的机器和文件准备完毕,可以部署CDH和Flink了;执行ansible脚本部署CDH和Flink(ansible电脑)进入ansible电脑的~/playbooks目录... 查看详情

CloudKit 环境如何在运行时确定?

】CloudKit环境如何在运行时确定?【英文标题】:HowcanCloudKitenvironmentbedeterminedatruntime?【发布时间】:2015-09-0818:24:23【问题描述】:是否有一种编程方式来发现我的应用是在与CloudKit开发环境还是生产环境对话?(我知道我可以查... 查看详情

构造 ArgumentException 时如何以编程方式确定参数名称?

】构造ArgumentException时如何以编程方式确定参数名称?【英文标题】:HowtoprogrammaticallydetermineparamnamewhenconstructinganArgumentException?【发布时间】:2010-09-1018:59:09【问题描述】:在构造ArgumentException时,一些重载采用一个字符串,该... 查看详情

flinkonyarn模式启动流程源代码分析(代码片段)

...欢迎访问网易云社区,了解更多网易技术产品运营经验。Flinkonyarn的启动流程可以参见前面的文章FlinkonYarn启动流程,下面主要是从源码角度看下这个实现,可能有的地方理解有误,请给予指正,多谢。-->1.命令行启动yarnsessionbin... 查看详情

flinkonyarn模式启动流程源代码分析(代码片段)

...欢迎访问网易云社区,了解更多网易技术产品运营经验。Flinkonyarn的启动流程可以参见前面的文章FlinkonYarn启动流程,下面主要是从源码角度看下这个实现,可能有的地方理解有误,请给予指正,多谢。-->1.命令行启动yarnsessionbin... 查看详情

如何确定从iOS后台返回前台时加载哪个视图?

】如何确定从iOS后台返回前台时加载哪个视图?【英文标题】:howtodeterminewhichviewloadsonreturningtoforegroundfromthebackgroundiniOS?【发布时间】:2011-09-2111:21:47【问题描述】:我有一个具有多个视图的应用程序。当我从后台回到前台时,... 查看详情

如何在运行时确定设置的 oneof 字段的名称?

】如何在运行时确定设置的oneof字段的名称?【英文标题】:Howtodetermineatruntimethenameoftheoneoffieldthatisset?【发布时间】:2021-12-0721:37:32【问题描述】:使用protobuf-net,而不是遍历每个ShouldSerialize*(),我如何确定设置了哪个oneof?我... 查看详情