Flink的classLoader加载机制(推测)-- 记一次程序问题中的探索

2023-05-16

    项目中需要用flink去加载c++的so文件。flink任务中如果有加载so的逻辑,当任务挂掉之后,再次重启的时候会报“Native Library xxx is being loaded in another classloader”的错误(这个过程中Flink集群的进程没退出)。

    通过分析System.loadLibrary(String libname)方法,发现加载后的so文件会记录在内存里,会记录一些信息,包括so文件名、加载这个so的类所用的classLoader(每个类都是被一个classLoader加载的,如果同一个类被不同的classLoader加载,这个类在内存里是不一样的,虽然他们的源头相同)。如果在加载某个so文件的时候,发现该so文件被加载过了,且加载这个so的classLoader和当前classLoader不相同,那么就会报上面的错误。

     由此推测,这个应该是flink每个任务都有自己的classLoader(这个在看flink任务分发的代码时有看到过,jobmanager把解析后的job分发给taskmanager的时候会把jobmanager中使用的classloader也发出去),so是任务自定义的classLoader加载的,当任务重启的时候,又生成了一个新的classLoader,它去加载so,结果发现已经加载过了。

    这个问题推测可以用一下两种方法解决:

     (1)每次修改so文件的文件名,这样每次加载的so文件不是一样的,也就不冲突了。(已实验过,可行)

     (2)用更高层的classLoader进行so的加载,比如bootStrapClassLoader,这种是进程共享的,这就避免了每次都由任务自己的ClassLoader去加载so文件。

 

第一个方案使用过,是可行的。第二个方案在理论上进行了实验,并没有真正的使用在项目中。

     

使用ExtClassLoader加载so文件

研究了一下java的ClassLoader机制,感觉可以用ExtClassLoader加载对应的类,让这个类去load   so文件

那么,怎么能让类被ExtClassLoader加载呢?做了一个小实验,说明这个逻辑。

A.java

public class A {
    public static String s = "test";
    public static void main(String[] args) {
        System.out.println(A.class.getClassLoader());
    }
}
$ javac A.java
$ jar -cvf A.jar A.class
# 打好的jar包中有A.class 和META-INF/MANIFEST.MF。但是META-INF/MANIFEST.MF文件中没有指定Main,所以不可以直接执行,要想直接执行,采用下面的操作
$ jar -xf A.jar
# 给MANIFEST.MF 文件加入“Main-Class: A”,然后重新打包
$ jar -cvfm A.jar META-INF/MANIFEST.MF A.class
$ java -jar A.jar
sun.misc.Launcher$AppClassLoader@7852e922


# 然后,把A.jar放到${JAVA_HOME}/jre/lib/ext目录下
$ java -jar A.jar
sun.misc.Launcher$ExtClassLoader@6d06d69c

上面可以看出,把jar包放到ext目录下之后,A类被扩展类加载器加载,其他所有的类都可以调用这个类使用。

那么,可以把loadLibrary的逻辑放在ext目录下,这样不管是哪个程序调用这个类,去加载so的时候都不会重复加载,而且只要jvm还存在,这个加载关系就一直能存在。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flink的classLoader加载机制(推测)-- 记一次程序问题中的探索 的相关文章

  • MsOS——概述

    自己接触的操作系统也有不少了 xff0c 如RT Thread Cos等 xff0c 这些实时操作系统基本的思想就是围绕任务的调度 更像是一个软件平台 xff0c 提供使用者丰富的软件资源 RT Thread是比较成功的应用于消费类产品的国
  • Pixhawk室内自动控制:参数设置

    Pixhawk室内自动控制 xff1a 参数设置 本文针对使用光流传感器和超声波传感器 xff08 或激光雷达 xff09 的Pixhawk用户 ArduCopter目前 xff08 3 52 xff09 已经能够使用光流传感器提供的位置信
  • python函数--capitalize()方法

    capitalize 方法 描述 Python capitalize 将字符串的第一个字母变成大写 其他字母变小写 语法 capitalize 方法语法 xff1a str capitalize 参数 无 返回值 该方法返回一个首字母大写的
  • c# 接口

    1 接口的特点 接口的定义是指定一组函数成员而不实现成员的引用类型 xff0c 其它类型和接口可以继承接口 定义还是很好理解的 xff0c 但是没有反映特点 xff0c 接口主要有以下特点 xff1a span class token pu
  • 在linux上增加swap交换空间

    在虚拟机里面安装oracle11g grid时 发现之前分配的swap交换空间不满足oracke gi安装的最低要求 xff0c 因为我分配的物理内存是8G xff0c 那么就按照要求需要8 12G的swap交换空间 xff0c 而我分配的
  • Elasticsearch7.6.1安装报错及解决过程

    Windows环境Elasticsearch7 6 1安装报错及解决过程 Elasticsearch是一个基于Lucene的搜索服务器 第一次安装ES7 6 1 xff0c 过程中遇到了一些报错 xff0c 把解决方法列出来 xff0c 总
  • 我的 Ubuntu 装机必备软件

    文章目录 我的 Ubuntu 装机必备软件Ubuntu的安装u盘制作添加中科大镜像源NVIDIA显卡驱动的安装卸载旧显卡驱动 安装sogou输入法下载安装配置 安装gitROS kinetic installationgoogle chro
  • GCC源码分析(十三) — 机器描述文件

    版权声明 xff1a 本文为CSDN博主 ashimida 64 的原创文章 xff0c 遵循CC 4 0 BY SA版权协议 xff0c 转载请附上原文出处链接及本声明 原文链接 xff1a https blog csdn net lid
  • VNC登录报错too many security failures解决方法

    桌面进程编号为1 xff0c 可以通过使用 sudo vncserver kill 1 sudo vncserver 1 杀掉并重启解决
  • tensorflow模型保存、读取与可训练参数提取

    一 保存 读取说明 我们创建好模型之后需要保存模型 xff0c 以方便后续对模型的读取与调用 xff0c 保存模型我们可能有下面三种需求 xff1a 1 只保存模型权重参数 xff1b 2 同时保存模型图结构与权重参数 xff1b 3 在训
  • pytorch------cpu与gpu load时相互转化 torch.load(map_location=)

    将gpu改为cpu时 xff0c 遇到一个报错 xff1a RuntimeError Attempting to deserialize object on a CUDA device but torch cuda is available
  • 优化OpenCV视频的读取速度

    我们使用Opencv读取视频时 xff0c 常规的做法是使用read 函数逐帧读取 xff0c 如 code import cv2 cap 61 cv2 VideoCapture 34 test mp4 34 while True read
  • 图像信噪比SNR求解

    xff08 xff08 通常也采用图像信号与噪声的方差之比来近似估计图像的信噪比 xff09 xff09 利用OpenCV计算灰度图像的峰值信噪比 xff08 PSNR xff09 计算两灰度图像之间的峰值信噪比 cpp view plai
  • Jetson TX1启动自带的摄像头

    最近在使用NVIDIA的Jetson TX1开发板 xff0c 并对开发板上自带的摄像头进行了测试 xff0c 下面将测试过程中所使用的一些指令做一些记录 xff0c 在终端上输入 xff1a nvgstcapture 1 0即可打开板子上
  • 判断用new申请内存是否成功

    c 43 43 申请大的内存空间 xff08 如何判断失败 xff09 我想用new申请一个特别大的空间 xff08 多大都可以 xff09 xff0c 主要是我不能判断到底是成功还是失败 假如我这样写 int p i 61 new int
  • 图像对比度计算

    matlab中求解方式 xff1a 计算图像对比度 方法一 xff1a 中心像素灰度值与周围4近邻像素灰度值之差的平方之和 xff0c 除以以上平方项的个数 functioncg 61 duibidu4 f f为输入图像 xff0c cg为
  • 图片占内存容量计算公式

    1 图片占内存容量计算公式为 xff1a 图片所占内存大小 61 图片长度 xff08 像素 xff09 图片宽度 xff08 像素 xff09 一个像素所占内存空间 xff08 单位 xff1a 字节 xff09 一般地 xff0c 一个
  • OpenCV学习:fastAtan2函数解密

    OpenCV学习 xff1a fastAtan2函数解密 高中数学中各种正弦函数 xff0c 余弦函数总是把人搞得头大 xff0c 但是具体应用时你会发现 xff0c 其实你只需要搞清楚一个2 空间内函数分布即可 下面分析OpenCV中fa
  • ubuntu 下安装NVIDIA显卡驱动出现X service error问题解决方法

    34 You appear to be running an X server 34 的解决方法 xff1a 在安装过程中出现了这个问题 xff0c 我在刚刚看到的教程 xff08 http wenku baidu com link url
  • 移动硬盘提示磁盘结构损坏且无法读取怎么办

    移动硬盘出现 磁盘结构损坏且无法读取 xff0c 1 突然关机 xff1b 2 硬盘没有正常通过系统卸载 xff1b 3 病毒破坏 xff1b 4 有可能是usb供电不足 xff1b 5 也可能是文件丢失 xff1b 6 还可能是盘片损坏

随机推荐