当前位置: 首页 > 编程日记 > 正文

slot没有毁灭的问题_解析flink之perjob模式下yn参数不生效问题

概要:

0. 问题背景

1. Stream Job的切分

2. 计算资源的调度 & 任务的执行

3. 最后的总结

0. 问题背景:

开始用flink处理流式作业的时候,用yarn-cluster模式提交作业的时候,脚本如下:

$FLINK_BIN run -m yarn-cluster -yqu root.profile -yn 20 -yjm 4096 -ytm 8192 -ynm RecentViewApp -ys 5 ./profileStreaming-0.1.jar

(程序中设置的并行度都是5)

脚本参数的解释:

-yn         要分配的YARN container数(Task Managers个数)

-yjm       JobManager内存

-ytm      每个TaskManager内存

-ys         每个TaskManager的slot数

比较奇怪的是,作业webUI的资源配置跟脚本上的资源分配不符合,而且启动的时候会有动态变化,下面两个截图,一个是最大资源的时候(图1.),一个是最终稳定资源的时候(图2.),而且经过测试调整yn参数,发现并没有发生变化,这里TaskManager和Task Slots是根据什么进行分配的似乎让人捉摸不定。

00605d59d5e56b9e20dfa32016e57ac7.png

图1

0ad1d648178be685b0518a91b60d9fa5.png

图2

1. Stream Job的切分

跟了下源码,分析这现象的原因(基于1.6.0版本的)

首先,要知道flink on yarn是怎么做资源分配之前,必须先要了解一个Stream job提交到flink是怎么进行job的切分的。首先程序构建成StreamGraph --> JobGraph,在生成JobGraph的时候,有几个重要的地方,见图4红色标记部分,然后提交到flink集群上,flink再对JobGraph转换ExecutionGraph,其实到ExecutionGraph这步就是为了后续的调度任务存在的,可以发现,ExecutionGraph(准确来说是有ExecutionJobVertex这个结构,而ExecutionJobVertex下又套有ExecutionVertex, Execution)下有这几种数据结构(图3):

c9965ad2514b751de4c79ecac9c646d5.png

图3

ExecutionGraph这里就已经可以进行任务调度了:

1. 一个task任务对应一个executor,后面会看到execution调用deploy就起一个任务;

2.IntermediateResultPartition对应ResultPartition,这两个本质上是相等的,只不过IntermediateResultPartition是ExecutionGraph调度阶段的概念,而ResultPartition是具体TaskManager底层数据交换时候的概念(这部分内容是flink底层数据底层数据如何处理,这里只需要知道ResultPartition(或者说ResultSubPartition)是存放序列化后的数据的,数据节点之间通过netty来传输,每个节点都会初始化一个netty server, netty client,每个节点既是server,又是client,而ResultPartition就是这里上游节点的数据结构,下游节点对应的数据结构是InputGate)。

2cd2f378a97da624a495c4dc70007edd.png

图4

2.计算资源的调度 & 任务执行

接下来看看是如何进行调度的:

e7c719b538c611bbd5d60f77510f7fd2.png

这里先说一点ExecutionJobVertex和ExecutionVertex的关系,如果说在程序里用flatMap这个算子,然后并行度设置为5,ExecutionJobVertex下的ExecutionVertex数组内容为:flatMap(1/5), flatMap(2/5), flatMap(3/5), flatMap(4/5), flatMap(5/5);

直接从Execution::scheduleForExecution()开始,有两个重要的方法:

1. allocateAndAssignSlotForExecution() ;

2. deploy();

c324a28b5b4ee457aa66e557c69be65d.png

Execution::allocateAndAssignSlotForExecution 里面重要的代码:

这里就是对slot的申请分配,也就是当当前状态是“CREATED"的时候才能往下进行操作,把"CREATED"状态转换成"SCHEDULED",这里就是针对executionVertext进行slot的申请分配,根据优先偏好设置进行分配,指定slot要分配在哪个TaskManager,具体的优先策略是怎么分配的,这里不做展开,简单的说,就是先确定输入源source的slot的分配,然后该源source的所在的TaskManager,肯定是下游slot分配的第一选择,也就是先把TaskManager所在的slot填满再说。

8cc512e3862fcae00911da7fa8cbe2b6.png

通过SlotPoolGateway进行转换SlotPool,

d99303e75bed36c03ebe2571d26dbddb.png

在SlotPool中(SlotPool是对Slot的池化,就是把slot资源放到一个池中,这个还是比较常见的),如果有slot共享,就多个task共享slot。

1f616d22de30bab8ae63326f879a3f66.png

如果没有slot共享,就要申请新的slot槽位

96e1a15ad04d6ba37a148c3c7ec9e8ee.png

6cf129fd9bbbb4daf01b02eb80705614.png

从resourceManager申请一个新的slot,如果没有resourceManager的链接(也是通过resourceManagerGateway转发),就保持到一个map中,等待拿到新的链接再发起request;如果有,直接发起申请。

aacacf346fcfc2ec88f4a1cad4c10329.png

保存到一个map里,

68c97a5d0389754a4e776612368a2b30.png

如果没有ResourceManager连接的话,把请求放到waitingForResourceManager这个map里。SlotPool一旦拿到ResourceManager连接,遍历waitingForResourceManager发送请求:

3adcfed4e88d936d6c4fdfd37f4748dd.png

拿到resourceManager的链接,发起的请求,

c306c260a99118a63b26706c53d21722.png

resourceManagerGateway.requestSlot(),从resourceManagerGateway,转到resourceManager(YarnResourceManager)

=====================Next0=====================

1.YarnResourceManager:

这里就是开始申请Yarn Container, 配置taskManager<8192 vcores:5>,也就是每个Container cpu Core是5,内存8192M,这里一共会调用5次,所以numPendingContainerRequests最终累加结果是5。8192>

ba08ecc3ef6895793660252415cdcfa9.png

numPendingContainerRequests 是用来记request次数的。

2.YarnResourceManager:

在YarnResourceManager的生命周期函数中,onContainersAllocated是请求container后的回调函数,这里的逻辑就是根据numPendingContainerRequests次数启动container

e3d4f1b6343b0d3787e6d9bc6ae88e29.png

ContainerLaunchContext taskExecutorLaunchContext= createTaskExecutorLaunchContext

038ff903ff4977ea8916ffd67143a015.png

Utils::createTaskExecutorContext(), 就是封装了要启动的Container的相关信息。Starting TaskManagers......起了5个。

YarnResourceManager::onContainersAllocated(),返回到这个方法里,

dc7cf1c6a84472136841e81411ffecc1.png

这下我们终于知道5个TaskManager是怎么起起来的。

接下去为啥TaskManager会慢慢减少呢?

SlotManager::start() slotManager在启动的时候,会有个定时任务,监控TaskManager的心跳,如果没有心跳,就释放掉container资源。代码比较简单,不做赘述。

5469c50ad561f8f1c2f907dba1ee03f7.png

7691ccbc20609b85333d6f7341ff9cd2.png

ResourceManager(YarnResourceManager)

958fd1f90651cd189ba2896e30883c5d.png

3d394a2d853c64d6f06432c401ddb7fe.png

YarnResourceManager:

通过nodeManagerClient,停止相应Container,并把container所在的worker节点从workerNodeMap里移除。

cbeb11b52c9918a3240e6624e50c0649.png

2.deploy():

重新回到Execution::scheduleForExecution()方法里,可以看到是遍历execution,然后每个execution调用一次deploy(),也就是说如果程序source--flatMap--sink的话,并行度是5,调用结果应该是,Execution(ExecutionJobVertxt) 5次[source-flatMap]+5次[sink] :

1c51e7abd2aad51720834251202ea197.png

f2ae3b88214bb993b5edd6376070e656.png

封装成TaskDeloymentDescriptor,根据taskManager网关提交任务,就是把封装的任务描述器提交过去,TaskManager就是任务执行管理器,提供了内存,IO,网络通信等功能,TaskManager收到taskDeloymentDescriptor,转换成task执行,包括序列化的算子,数据传输过程中的ResultParitition, InputGate等结构。task本身就是一个线程,这里就不做赘述了。

3. 最后的结论

回过头来看看,如果在程序中最大并行度是5,ys=5, 程序在启动的时候最大分配TaskManager=5, Task slots=5*5(最大并行度5,5个taskManager, 每个taskManager分配slot=5, 所以一共25个slot,用去5个slot, 剩下20个slot空闲)。

2c16c9bf5ad50e1e4e13cd64bb1abbe9.png

我们可以先假设如果设置并行度是6呢,ys=5,这时候启动最大TaskManager=6, Task slots=5*6=30,因为并行度是6,所以最高峰会是6个TaskManager, Task slots=30,剩下可用24个,由于每个TaskManager设置slot=5, 所以需要2个TaskManager,用去6个slot,所以剩余可用4,经测试验证,确实如此。

最终会是:

2ac69e204a9df422dd64be214cf269bf.png

我们可以看到, flink有两处的优化:

1. operator chain.(上图红色部分),需满足一些严格的条件

为了更高效地分布式执行,Flink会尽可能地将operator的subtask链接(chain)在一起形成task。每个task在一个线程中执行。将operators链接成task是非常有效的优化:它能减少线程之间的切换,减少消息的序列化/反序列化,减少数据在缓冲区的交换,减少了延迟的同时提高整体的吞吐量。(这里解释一下为啥sink没有做operator chain,因为sink前程序做了keyBy,keyBy不是operator,只是一个数据的分发策略,所以这里不满足operator chain的条件)

2. SlotSharingGroup共用slot (如上图中,[source1,flatmap1]和sink1共用一个slot)

对计算资源的利用率更高

最后最后的结论:yn的设置确实是不生效的,资源的分配是根据job最大并行度来设置的,先按照最大并行度来起TaskManager,如果有剩余,再进行释放,由于是per-job模式,就算是有剩余的TaskManager也没法给其他任务使用,所以这里又进行了回收。

相关文章:

获取access中表的相关信息

就用到两条.net自带的获取数据库信息的语句 OleDbConnection con new OleDbConnection(connection); // OleDB数据库连接实例 // 获取数据库中表的相关信息DataTable dt con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "Table"…

Matlab数据的可视化 -- 茎干图

本篇微信图文主要介绍Matlab数据可视化方面的内容。stem

Wink发布Wink Hub2家庭物联网控制中心

智能家居主要厂商之一Wink宣布推出Wink Hub2家庭物联网控制中心&#xff0c;支持更多的家庭物联网产品&#xff0c;更广泛的互联互通&#xff0c;以及提供更好用的控制程序。Wink Hub2主要作用是连接第三方家庭物联网产品&#xff0c;并从一个集中的应用程序进行控制。 Wink Hu…

mysql repalication_MySQL主从复制的原理及配置方法(比较详细)

一、复制的原理MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新&#xff0c;以便从服务器可以对其数据拷贝执行相同的更新。将主服务器的数据拷贝到从服务器的一个途径是…

贸易保护主义不能解决德国光伏企业的问题

针对德国媒体近期将该国光伏巨头SolarWorld宣布破产一事与中国相关联&#xff0c;甚至指责“中国盗走德国工作”的论调&#xff0c;中国驻德国大使馆经济商务参赞处公使衔参赞王卫东18日向记者表示&#xff0c;SolarWorld作为当初推动欧盟发起对华光伏产品“双反”措施的领头公…

Matlab数据的可视化 -- 平面多边形的着色

本篇微信图文主要介绍Matlab数据可视化方面的内容。fill

ASP.net session 使用总结(2)

Session又称为会话状态&#xff0c;是Web系统中最常用的状态&#xff0c;用于维护和当前浏览器实例相关的一些信息。举个例子来说&#xff0c;我们可以把已登录用户的用户名放在Session中&#xff0c;这样就能通过判断Session中的某个Key来判断用户是否登录&#xff0c;如果登录…

python re模块_Python re模块

正则表达式元字符说明. 匹配除换行符以外的任意字符^ 匹配字符串的开始$ 匹配字符串的结束[] 用来匹配一个指定的字符类别? 对于前一个字符字符重复0次到1次* 对于前一个字符重复0次到无穷次{} 对于前一个字符重复m次{m,n} 对前一个字符重复为m到n次\d 匹配数字&#xff0c;相…

国外优秀开源PHP建站程序一览

大量的PHP开源&#xff08;开放源代码/Open Source&#xff09;应用改变了这个世界&#xff0c;改变了互联网&#xff0c;以下我们总结从数据库到购物、博客等众多类型的开源PHP软件&#xff0c;供网站开发者们参考。 博客&#xff1a;WordPress WordPress是使用PHP开发的著名博…

《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.1 引言...

本节书摘来自华章计算机《数据科学R语言实践&#xff1a;面向计算推理与问题求解的案例研究法》一书中的第2章&#xff0c;第2.1节,作者&#xff1a;[美] 德博拉诺兰&#xff08;Deborah Nolan&#xff09;  邓肯坦普朗&#xff08;Duncan Temple Lang&#xff09;  更多章…

Matlab数据的可视化 -- 三维特殊图形

本篇微信图文主要介绍Matlab数据可视化方面的内容。plot3&#xff0c;bar3&#xff0c;barh3&#xff0c;scatter3

baidumap api MySQL_百度地图API开发笔记一(基础篇)

什么是百度地图API&#xff1f;百度地图API是一套由JavaScript语言编写的应用程序接口&#xff0c;它能够帮助您在网站中构建功能丰富、交互性强的地图应用。百度地图API包含了构建地图基本功能的各种接口&#xff0c;提供了诸如本地搜索、路线规划等数据服务。测试js API代码(…

Matlab数据的可视化 -- 三维网格图形

本篇微信图文主要介绍Matlab数据可视化方面的内容。mesh&#xff0c;meshc&#xff0c;meshz

我国网络安全人才培养缺口巨大

近日在武汉举行的国家网络安全宣传周的相关论坛上&#xff0c;我国网络安全人才培养缺口巨大成为与会专家热议的话题。来自中央和地方相关部门、高校研究者、互联网企业代表均认为&#xff0c;我国网络安全人才输出仍距国家、企业需求有较大差距。 去年&#xff16;月&#xff…

如何写网站的robots.txt和meta name robots的配置

robots.txt基本介绍robots.txt是一个纯文本文件&#xff0c;在这个文件中网站管理者可以声明该网站中不想被robots访问的部分&#xff0c;或者指定搜索引擎只收录指定的内容。当一个搜索机器人&#xff08;有的叫搜索蜘蛛&#xff09;访问一个站点时&#xff0c;它会首先检查该…

mysql innodb_data_file_path_关于innodb_data_file_path设置

关于innodb_data_file_path设置启动Mysql时报错&#xff0c;无法正常启动&#xff0c;通过日志发有数据文件大小错误&#xff0c;日志如下截图&#xff1a;[ERROR] InnoDB: auto-extending data file /usr/local/mysql/data/ibdata1 is of a different size 768 pages (rounded…

BM提供支持云的量子计算平台,以加速创新

IBM研究院日前首次宣布公众可试用IBM量子处理器。从5月4日开始&#xff0c;IBM通过云服务&#xff0c;使所有有兴趣亲自实践的人们可以接触到量子处理器&#xff0c;帮助科学家和科研社区加速科技创新&#xff0c;并在该领域激发出更多的前沿应用。 这仅仅是量子计算时代的开始…

Matlab数据的可视化 -- 图形格式的设置

本篇微信图文主要介绍Matlab数据可视化方面的内容。title、x&#xff0c;y&#xff0c;zlabel、legend、title、axis、text等

(转)koogra--Excel文件读取利器

koogra是一个.net平台下开源的excel读取程序&#xff0c;可以在开源社区下载它。使用它我们无需office就可以读取excel文件。尽管这个程序已经停止了更新&#xff0c;但是它还是很好用的。下面介绍怎么使用它。下载到该程序的源代码&#xff0c;编译生成Net.SourceForge.Koogra…

mysql切换系统盘命令_mysql常用命令

一、连接MySQL格式&#xff1a; mysql -h主机地址 -u用户名 &#xff0d;p用户密码1、例1&#xff1a;连接到本机上的MYSQL。首先在打开DOS窗口&#xff0c;然后进入目录 mysqlbin&#xff0c;再键入命令mysql -uroot -p&#xff0c;回车后提示你输密码&#xff0c;如果刚安装好…

Matlab数据的可视化 -- 视角与色彩控制

本篇微信图文主要介绍Matlab数据可视化方面的内容。view&#xff0c;colormap

大数据、智慧城市成生态贵州新名片

2016年中国贵州内陆开放型经济试验区跨境投资贸易洽谈会将于11月10日在贵安新区正式开幕。据主办方介绍&#xff0c;此次洽谈会邀请了来自美国、澳大利亚等24个国家和地区的100多家境外企业&#xff0c;以及1000多家国内企业参加&#xff0c;预计签约总金额或超过1400亿元。 9日…

提升网络安全 十大策略全面巩固企业内网

几乎所有企业对于网络安全的重视程度一下子提高了&#xff0c;纷纷采购防火墙等设备希望堵住来自Internet的不安全因素。然而&#xff0c;Intranet内部的攻击和入侵却依然猖狂。事实证明&#xff0c;公司内部的不安全因素远比外部的危害更恐怖。 大多企业重视提高企业网的边界安…

oracle mysql事物隔离级别_Oracle数据库事物隔离级别

事务隔离级别&#xff1a;一个事务对数据库的修改与并行的另一个事务的隔离程度。两个并发事务同时访问数据库表相同的行时&#xff0c;可能存在以下三个问题&#xff1a;1、幻想读&#xff1a;事务T1读取一条指定where条件的语句&#xff0c;返回结果集。此时事务T2插入一行新…

Matlab数据的可视化 -- 柱形立体图

本篇微信图文主要介绍Matlab数据可视化方面的内容。cylinder

中国大陆光伏中上游触底反弹 台湾省亦酝酿涨势

太阳能需求在中国十一长假前回温&#xff0c;厂商受限于人力的调配&#xff0c;难以立即将稼动率全开&#xff0c;使得短期供给无法立即上升以呼应需求&#xff0c;因而中国大陆市场从多晶硅至电池片价格出现短暂触底反弹的情形&#xff0c;台湾省厂商也正酝酿涨价动能。 多晶硅…

js版的box2D

http://sourceforge.net/projects/box2d-js/files/ 受不了了 转载于:https://www.cnblogs.com/vilyLei/articles/1522800.html

mysql 安装 se_mysql的安装过程

(1)下载mysql。(2)解压文件到特定位置。我解压到&#xff1a;/home/jim/Software(3)创建Mysql组和用户。mysql中的一个用户名就是链接mysql服务器时指定的用户名&#xff0c;该名字不必与linux登陆名联系起来&#xff0c;但是必须是linux系统下建立的用户。命令为&#xff1a;g…

创新类编辑推荐:Sequence iBPMS平台

创新类编辑推荐是Sequence&#xff0c;一个“iBPMS”工作流管理平台。本文介绍了该产品以及用户是如何成功使用该平台的。 SearchSOA的编辑会定期为创新性和市场影响而表彰应用集成和现代化技术。PNMsoft的Sequence iBPMS是2016年4月份的编辑推荐。 产品名称&#xff1a; Seque…

Matlab数据的可视化 -- 简易表面图

本篇微信图文主要介绍Matlab数据可视化方面的内容。ezsurf