ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【flink】一个TaskManager 实例下,多个slot线程分别执行不同job任务,如何隔离jar包资源以及计算资源

2021-08-11 20:57:41  阅读:267  来源: 互联网

标签:slot flink 任务 线程 jvm 计算资源 加载


文章目录

问题思考?

在这里插入图片描述

  1. 官网中flink架构图,flink中默认TaskManager是分配一个slot,对应一个jvm
  2. 如果一个TaskManager分配三个slot线程,并且3个slot分别执行了不同job的算子任务,根据官网描述可以共享“数据集和数据结构”,且按照我们日常编码,一个jvm实例内的不同线程,是共享jvm中的共同的成员变量以及类包的,那么显然如果这样flink执行任务会发生紊乱,所以flnk是怎么做的?:flink中一个jvm内共享了什么数据集,数据结构? 不同job任务可能存在同全类名的类,甚至同一个项目包的类,加载到一个jvm中怎么做到互相隔离,成员变量互不影响?

源码解析

org.apache.flink.runtime.taskmanager.Task#doRun
在这里插入图片描述
org.apache.flink.runtime.execution.librarycache.LibraryCacheEntry#LibraryCacheEntry
在这里插入图片描述
org.apache.flink.runtime.taskmanager.Task#doRun在这里插入图片描述
可以看到task获取到任务之后

  1. 下载任务代码
  2. 新建任务线程的类加载器
  3. 任务线程所有类使用新建的类加载器
  4. 显然,slot共享的数据结构就是flink框架启动提前已经加载的公共类,比如tcp连接相关的类,slotTable缓存等【双亲委派机制】

那么问题就清晰了,因为不同的类加载器有独立的类名称空间,即使来自同一个class文件,如果类加载器不一样,那么就是不同的类,因此不同task的代码运行在同一taskmanager上,即使有相同的class文件加载,也互相隔离,实际上这也是所有web容器框架都需要解决的问题。

结论

参考《深入理解jvm》
在这里插入图片描述
类加载器对instance of的影响,代码例子如下:
在这里插入图片描述

标签:slot,flink,任务,线程,jvm,计算资源,加载
来源: https://blog.csdn.net/qq_31454379/article/details/119204095

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有