首页 > 其他分享 >flink 类加载剖析

flink 类加载剖析

时间:2024-11-03 16:41:45浏览次数:1  
标签:DriverManager java ChildFirstClassLoader flink 剖析 org 加载

Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://25.79.1.13:90/tide_cloud?connectTimeout=60000&socketTimeout=60000
        at java.sql.DriverManager.getConnection(DriverManager.java:689) ~[?:1.8.0_332]
        at java.sql.DriverManager.getConnection(DriverManager.java:247) ~[?:1.8.0_332]
        at org.apache.flink.connector.jdbc.catalog.MySqlCatalog.getDriverVersion(MySqlCatalog.java:159) ~[?:?]
        at org.apache.flink.connector.jdbc.catalog.MySqlCatalog.<init>(MySqlCatalog.java:93) ~[?:?]
        at com.tide.util.TableAssembler.build(TableAssembler.java:63) ~[?:?]
        at com.tide.Insight.prepare(Insight.java:112) ~[?:?]
        at com.tide.Insight.execute(Insight.java:104) ~[?:?]
        at com.tide.Insight.main(Insight.java:48) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_332]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_332]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_332]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_332]
        at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:355) ~[flink-dist-1.17.1.jar:1.17.1]
        ... 7 more
public void invokeInteractiveModeForExecution() throws ProgramInvocationException {
        FlinkSecurityManager.monitorUserSystemExitForCurrentThread();
        try {
            callMainMethod(mainClass, args);
        } finally {
            FlinkSecurityManager.unmonitorUserSystemExitForCurrentThread();
        }
    }
 this.mainClass =
                loadMainClass(
                        // if no entryPointClassName name was given, we try and look one up through
                        // the manifest
                        entryPointClassName != null
                                ? entryPointClassName
                                : getEntryPointClassNameFromJar(this.jarFile),
                        userCodeClassLoader);

mainClass是 ChildFirstClassLoader加载的,因此java.sql.DriverManager.getConnection也是ChildFirstClassLoader加载的。

因此,

//        log.info(java.sql.DriverManager.class.getClassLoader().toString());
 log.info(Insight.class.getClassLoader().toString());
 log.info(com.mysql.cj.jdbc.Driver.class.getClassLoader().toString());

输出:

org.apache.flink.util.ChildFirstClassLoader@7d81f8b6
sun.misc.Launcher$AppClassLoader@12a3a380

ChildFirstClassLoader 是 Flink 自定义的类加载器,继承自 Java 的 ClassLoader 类,但它的工作机制和 AppClassLoader 不同。
ChildFirstClassLoader 会将子类加载器的类优先加载,而 AppClassLoader 则是按照默认的父类优先加载机制工作。
这两者之间并没有直接的继承关系或父子关系,而是独立存在的,用于不同的目的和场景。

去掉classloader.parent-first-patterns.additional: com.mysql.; org.codehaus.配置之后,
打印:

org.apache.flink.util.ChildFirstClassLoader@69cebb68
org.apache.flink.util.ChildFirstClassLoader@69cebb68

这时候抱错了,提示No suitable driver found for jdbc,猜测原因:

  • java.sql.DriverManager是由Boostrap类加载器加载的
  • com.mysql.cj.jdbc.Driver 是由ChildFirstClassLoader类加载器加载的。

https://juejin.cn/post/7249934982114672695

知识点

1、任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。这句话可以表达更通俗一些:比较两个类是否”相等”,只有再这两个类是有同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个Class 文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等。

2、类加载器本身不存在继承关系。 即使有双亲委派关系的存在,一个类的加载器,指的也是实际加载这个类的classLoader

3、每个线程绑定一个classLoader

标签:DriverManager,java,ChildFirstClassLoader,flink,剖析,org,加载
From: https://www.cnblogs.com/xushengbin/p/18319603

相关文章

  • 79 号文及信创浪潮下:低代码平台的多维核心能力剖析与战略价值思考
    一、引言在数字化时代的汹涌浪潮中,信创产业如同一座灯塔,为国家信息安全和自主可控发展照亮了前行的道路。国资委79号文的重磅发布,更是为信创在央企、国企中的落地实施吹响了冲锋号,明确了信息化系统国产化替代的时间表和路线图。在这一宏大的历史进程中,低代码平台作为新兴的......
  • 《动物园之星》加载libcurl.dll文件丢失处理办法:原因与解决指南
    当您在尝试启动《动物园之星》(PlanetZoo)时遇到“libcurl.dll文件丢失”错误,这通常意味着游戏所需的某个动态链接库文件缺失。这种情况可能是由多种原因造成的,包括不完全的安装、损坏的文件、系统路径问题等。以下是一些解决这个问题的方法:重新安装游戏•彻底卸载:首先,确保完......
  • Flink历史服务器History Server部署:创建hdfs存储目录、启动和停止
    运行Flinkjob的集群一旦停止,只能去yarn或本地磁盘上查看日志,不再可以查看作业挂掉之前的运行的WebUI,很难清楚知道作业在挂的那一刻到底发生了什么。如果我们还没有Metrics监控的话,那么完全就只能通过日志去分析和定位问题了,所以如果能还原之前的WebUI,我们可以通......
  • 剖析xxl-job任务调度及高可用机制
    xxl-job任务执行器调度的实现机制整体上来讲,就是在xxl-job-admin中通过调用任务执行器的HTTP接口,实现对任务执行器的调度。具体又可以分为2个层面进行剖析,如下:任务执行器侧:当在项目中引入xxl-job-core组件之后,如果是在Spring容器环境中,会通过XxlJobSpringExecutor组件的afterS......
  • 深入剖析卷积神经网络中的卷积核
    深入剖析卷积神经网络中的卷积核前言一、卷积核的数学基础代码示例:简单的2D卷积操作二、卷积核的类型与作用1.边缘检测卷积核代码示例:Sobel算子2.模糊与平滑卷积核代码示例:高斯滤波器三、卷积核的实际应用四、卷积核的初始化与学习五、卷积核的挑战与优化六、卷积......
  • 类加载器与双亲委派机制
    类加载器  在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将字节码文件加载到内存中并转换为类对象的组件。类加载器的主要任务是将.class文件加载到JVM中,以便程序能够使用这些类。JVM中的类加载器机制是Java平台的关键部分,它实现了Java的动态类加载特性。JVM的类加......
  • Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
    本示例演示在vue+openlayers项目中通过WebGLVectorLayerRenderer方式加载海量多边形数据。这里相当于将海量的数据放在同一个层的source中,然后通过webglTile的方式渲染出这一层。本示例数据为5000个多边形,加载速度超级快。一、示例效果专栏名称内容介绍Openlay......
  • 什么是ETL(提取、转换、加载)过程在数据处理中的重要性
    ETL(提取、转换、加载)过程在数据处理中承担着至关重要的职责,它直接决定了数据分析的质量和效率。ETL过程包括三个主要步骤:提取(Extract)、转换(Transform)和加载(Load),是企业数据仓库(DW)建设和维护的核心。提取步骤负责从多个数据源收集信息、转换步骤将原始数据清洗并转换为统一格式以便......
  • 《保卫萝卜》客户端缺失pthreadvce2.dll 文件?详解《保卫萝卜》Luobo.exe 加载 pthread
    在享受《保卫萝卜》这款趣味横生的塔防游戏时,部分玩家可能会遇到游戏无法启动的问题,屏幕上弹出错误提示:“由于找不到pthreadvce2.dll,无法继续执行代码。”这一错误通常意味着你的电脑系统中缺失了pthreadvce2.dll这个关键的动态链接库(DLL)文件。别担心,本文将为你提供详细的修......
  • PostgreSQL技术大讲堂 - 第70讲:PG数据库数据加载调优案例
     PostgreSQL技术大讲堂-第70讲,主题:postgresq数据库数据加载调优案例讲课内容:  1、数据库参数调整  2、后台进程cpu绑定调整  3、数据库并行操作调整  数据加载是每个DBA经常需要完成的工作,如何让数据加载变得更快,本期视频跟大家一起分享调优带来的乐趣......