微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

文章目录

问题思考?

在这里插入图片描述

  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的影响,代码例子如下:

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐