当前位置: 首页 > news >正文

flink 作业报日志类冲突的解决方案

文章目录

    • 背景
    • 思考
    • 初步解决方案
    • 深入思考下
    • 终极解决方案
    • 总结

背景

实时作业在页面提交任务后,报NoSuchMethodException 方法,看了下是关于log4j的,首先是作业升级了很多依赖的版本,其次flink 也升级 到了1.19版本

思考

  • 打的Jar有bug?
    先想了一下是不是打的Jar有问题,后面想了下如果Jar有问题是类找不到才对
  • 类冲突才对?
    观察了一下

业务代码
在这里插入图片描述
flink 自带的日志类

在这里插入图片描述

结论,很明显版本不一样

初步解决方案

  • 实时作业代码日志jar 降级
    我先想到的解决方案是实时作业代码日志jar 降级,细看了一些实时里有很多依赖,而且是升级到java 21的,不好处理

  • flink 本身 日志jar 升级
    尝试了下把报冲突的jar类升到了2.20的版本,服务启动不了,直接报错
    然后尝试了下把其它日志类都升到了2.20的版本,服务可以启动,作业也可以正常提交,好像这里事情已经解决,但是我再看了一下,发现flink 自身的日志打印有总是,所有日志都没能正常打印

  • 插件的方法把类重新命名?
    这个方法不行,太多地方引用这个类了

似乎陷入了死胡同 ? 好像没招了,常用的这些方法都不行

深入思考下

回到问题本身,从第一性原理的角度出来想一下

  • 为啥相同的类是加载的flink lib 目录下的jar,而不是实时作业的呢?
    flink 本身实现了ChildFirstClassLoader ,默认是先加载用户代码里的class,如果没有加载到,再从其它地方加载,那理论上不应该有这个问题

打开源码看下

 @Overrideprotected Class<?> loadClassWithoutExceptionHandling(String name, boolean resolve)throws ClassNotFoundException {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {// check whether the class should go parent-firstfor (String alwaysParentFirstPattern : alwaysParentFirstPatterns) {if (name.startsWith(alwaysParentFirstPattern)) {return super.loadClassWithoutExceptionHandling(name, resolve);}}try {// check the URLsc = findClass(name);} catch (ClassNotFoundException e) {// let URLClassLoader do it, which will eventually call the parentc = super.loadClassWithoutExceptionHandling(name, resolve);}} else if (resolve) {resolveClass(c);}return c;}
 if (name.startsWith(alwaysParentFirstPattern)) {

上面这段引起了我的注意,有一些类是由AppClassLoader 加载的,顺藤摸瓜
发现了有这些类,发现也没有log4j的呀,差点看漏了,
在这里插入图片描述
还有这个变量的,终于发现了,原来在这,那看来找到了问题所在的地方

   @Internalpublic static final String[] PARENT_FIRST_LOGGING_PATTERNS =new String[] {"org.slf4j","org.apache.log4j","org.apache.logging","org.apache.commons.logging","ch.qos.logback"};

终极解决方案

既然问题找到了,那最简单的是就是把这个配置的默认值修改下,修改config.yaml,服务启动,作业提交成功。 各方法都正常,问题解决
在这里插入图片描述

总结

  • 可以想下为啥flink 要把那些类让AppClassLoader去加载
  • 为啥要设计ChildFirstClassLoader

相关文章:

  • java第二十一课 —— 快捷键,包,访问修饰符
  • BubbleML: A Multiphase Multiphysics Dataset and Benchmarks for Machine Learning
  • 数字科技如何助力博物馆设计,强化文物故事表现力?
  • Python私有成员变量:深入解析与实用指南
  • 直播商城源码-PC+APP+H5+小程序现成源码
  • MongoDB CRUD操作:可重试写入
  • WebSocket首次使用踩坑记录
  • 苹果将推出“Apple Intelligence”AI系统,专注于隐私和广泛应用|TodayAI
  • KafkaStream Local Store和Global Store区别和用法
  • docker pull image 报错 dial tcp 31.13.88.169:443: i/o timeout
  • Python 识别图片形式pdf的尝试(未解决)
  • 【JSP】如何在IDEA上部署JSP WEB开发项目
  • 贪心算法-加油站
  • c#与汇川plc通信
  • STM32 HAL库开发——入门篇(3):OLED、LCD
  • hexo+github搭建个人博客
  • 30天自制操作系统-2
  • DOM的那些事
  • gcc介绍及安装
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Java应用性能调优
  • Js基础知识(一) - 变量
  • Laravel 菜鸟晋级之路
  • Python 反序列化安全问题(二)
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • yii2权限控制rbac之rule详细讲解
  • 飞驰在Mesos的涡轮引擎上
  • 记录一下第一次使用npm
  • 简析gRPC client 连接管理
  • 嵌入式文件系统
  • 使用SAX解析XML
  • 突破自己的技术思维
  • 微信开源mars源码分析1—上层samples分析
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #单片机(TB6600驱动42步进电机)
  • (1)Android开发优化---------UI优化
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (四)鸿鹄云架构一服务注册中心
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)原始图像数据和PDF中的图像数据
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .Net 基于MiniExcel的导入功能接口示例
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成