Janino版本不匹配Spark问题分析及解决方案
- 出错过程如下:
- 那么janino是什么呢?
- Janino 概述
- Spark2.4版本错误解决方案如下
- Janino的其他一些介绍
- 补充一些内容
出错过程如下:
通过Springboot + Mybatis-plus框架,通过实体类+ Mapper和配置SQL语句的方式读取数据后传递给Spark进行数据分析,一直没有出现问题。
后来需求的不断变化,特别是进行数据分析的时候。数据库的要分析的表字段不断变化,测试表与真实线上表结构也不一样,主要是在字段上。表名还可传参,但字段可就变化多了,后来觉得这种方式不如直接让Spark直接读取数据方便。
可是当采用sparkSession直接读取数据的时候,就出现问题了,执行语句如下:
import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SparkSession; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class MySQLDataModel { @Value("${mysql.url}") private String mysqlUrl; @Value("${mysql.user}") private String mysqlUser; @Value("${mysql.password}") private String mysqlPassword; public void loadDataFromMySQL() { SparkSession spark = SparkSession .builder() .appName("MySQLDataLoader") .config("spark.master", "local") // 本地测试时需要指定master .getOrCreate(); // 读取MySQL数据 Dataset
jdbcDF = spark.read() .format("jdbc") .option("url", mysqlUrl) .option("dbtable", "your_table_name") .option("user", mysqlUser) .option("password", mysqlPassword) .load(); // 显示数据集中的内容,一般调试时用。 //jdbcDF.show(); //算法代码 ....... // 关闭SparkSession spark.close(); } }
通过框架执行上术代码问题就来了,提示如下:
ERROR i.c.c.e.GlobalExceptionHandler - org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/codehaus/janino/InternalCompilerException at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1082) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
先解决这个错误吧:
org/codehaus/janino/InternalCompilerException
那么janino是什么呢?
官网如下:
Janino 概述
Jan 是一个开源的 编译器库,它的主要功能是在运行时动态地将 Java 源编译为 Java 字节码,并加载到 JVM 中执行。Janino 可以被用来动态生成和编译 Java 类、接口、枚举和注解,同时可以在运行时加载和执行这些动态生成的类。
Janino 主要用途包括但不限于以下几个方面:
动态代码生成:Janino 可以在运行时根据程序需要动态地生成 Java 类和方法,这在一些动态代理、模板引擎、动态代码解释执行等场景下非常有用。
运行时编译:Janino 可以将 Java 源代码在运行时动态地编译为 Java 字节码,然后加载到 JVM 中执行,这使得程序可以根据需要动态地扩展和修改代码逻辑。
表达式计算:Janino 支持在运行时编译和执行表达式,这对于动态计算表达式、动态规则引擎等应用有很大的帮助。
优化类加载:Janino 可以在某些情况下优化类加载过程,通过动态生成和编译类来提高程序的灵活性和性能。
Janino 的强大功能包括但不限于动态代码生成、运行时编译、表达式计算等,使得它在诸如动态代理、模板引擎、动态规则引擎、动态代码执行等领域有着广泛的应用。在如今的 Java 开发中,Janino 经常被用于需要动态生成和执行代码的场景,为开发者提供了更加灵活的编程手段。
后来在阅读spark2的源码的时候发现了 gencode的方法,发现内部是动态生成代码,然后 通过jannio 去生成class。
http://janino-compiler.github.io/janino/apidocs/
总得来说:Janino是一种Java编译器,它可以在运行时动态地将Java源代码编译成Java字节码,然后执行该字节码。Janino可以在不需要预先编译Java源代码的情况下,动态地生成和加载类,从而使得Java程序具有更强的灵活性和可扩展性。
Janino的主要特点还可表达如下:
动态编译:Janino可以在运行时动态地将Java源代码编译成Java字节码,从而避免了预先编译的步骤。
轻量级:Janino编译器非常轻量级,只有几百KB大小,可以很容易地集成到Java应用程序中。
易于使用:Janino提供了简单易用的API,可以很容易地将Java源代码编译成Java字节码,并且可以加载和执行该字节码。
支持动态类加载:Janino能够支持动态类加载,可以在运行时动态地加载编译后的类,并且可以随时卸载已加载的类。
Janino的使用方法如下:
创建Janino编译器:可以通过以下方式创建Janino编译器:
需要注意的是,Janino编译器支持动态编译Java源代码,但是在编译过程中会生成Java字节码,并将其保存到磁盘文件或内存中,因此也不是完全的动态。此外,Janino编译器不支持所有的Java特性,如内部类、枚举类型、注解等,在使用Janino编译器时需要进行测试和调试。
Spark 的job 运行 都是 执行spark-submit命令 执行 的。因此需要将自己 编写的代码 打成jar包 放在平台上运行。然而如果版本不兼容的话会出现上述错误:
org.codehaus.janino janino 3.1.16 Spark2.4版本错误解决方案如下
就是变更了版本号,降版本就解决问题了。3.1.16 修改为 3.0.11
org.codehaus.janino janino 3.0.11 Janino的其他一些介绍
Janino的使用场景
Janino的使用场景如下:
动态类加载和执行:Janino可以在运行时动态地加载和执行Java字节码,从而实现动态类加载和执行的功能,例如插件系统、动态脚本等。
运行时代码生成:Janino可以在运行时动态地生成Java源代码,并将其编译成Java字节码,并可随时卸载已加载的类,从而实现运行时代码生成的功能,例如动态SQL查询、动态查询条件等。
脚本语言支持:Janino可以支持一些脚本语言,例如Java脚本语言(JSR 223)、Groovy、JRuby等,从而提供灵活的脚本语言支持。
编译器插件:Janino可以作为编译器插件使用,为编译器提供动态编译和加载类的能力,例如Eclipse Java编译器插件就使用了Janino编译器。
需要注意的是,Janino并不是一个完整的编译器,它只是提供动态编译和加载Java类的功能,因此在实际应用中,需要根据具体的需求选择合适的Java编译器和类加载器。
————————————————
原文链接:https://blog.csdn.net/Soul_Programmer_Swh/article/details/131773058
当然还可能有以下错误:
:Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object; at org.apache.spark.sql.SparkSession$Builder.config(SparkSession.scala:804) at SparkPi$.main(SparkPi.scala:15) at SparkPi.main(SparkPi.scala)
你遇到的错误是由于版本不匹配导致的。java.lang.NoSuchMethodError通常是因为编译时使用的Scala版本与运行时使用的版本不匹配导致的。
为了解决这个问题,可以尝试以下几种解决方案:
-
检查Scala版本:首先确保你的项目中使用的Scala版本是与Spark兼容的。你可以查看Spark官方文档或者Spark依赖库的要求来确认你的Scala版本是否匹配。
-
更新依赖库:如果你确定Scala版本匹配,那么可能是因为依赖库版本不兼容。尝试更新你的Spark和相关依赖库的版本,确保它们能够相互兼容。
-
排除冲突的依赖:如果你的项目中引入了多个版本的Scala或者相关库,可能会导致冲突。你可以尝试使用Maven或者Gradle等构建工具来排除冲突的依赖,确保只有兼容的版本被引入。
-
清理编译缓存:有时候编译的缓存可能会导致问题,你可以尝试清理项目的编译缓存,然后重新编译和运行项目。
希望这些解决方案能够帮助你解决这个问题。如果还有问题,继续搜索或者用智能回答模型吧。
补充一些内容
关于如何正确配置 Janino 以及解决类似问题的更多信息,还可以参考以下官方文档和链接:
-
Apache Spark 官方文档:https://spark.apache.org/documentation.html
在官方文档中,您可以找到有关 Spark 配置和依赖项的详细信息,以及与第三方库集成的指导。
-
Janino 官方文档:https://janino-compiler.github.io/janino/
Janino 的官方文档提供了关于该库的详细信息,包括版本兼容性、配置指南等。
-
Stack Overflow:https://stackoverflow.com/
Stack Overflow 是一个常用的开发者问答社区,您可以在这里搜索与 Spark、Janino 及相关错误信息相关的问题,并查看其他开发者的解决方案。
-
Apache Spark 官方邮件列表和论坛:https://spark.apache.org/community.html
Apache Spark 提供了邮件列表和论坛等社区支持平台,您可以在这里向更多专业人士咨询,寻求帮助。
-
应用这个的牛人Spark 代码线上维护 实现【janino】
-
比JDK最高快170倍,高性能多语言序列化框架Fury中,用到的Janino编译器
-
猜你喜欢
- 4天前(希尔顿2021活动)希尔顿集团618盛夏大促开启
- 4天前(安徽民宿发展报告)首届安徽省乡村民宿创意设计大赛启动
- 4天前(香港航空三亚航线复航了吗)香港航空三亚航线复航
- 4天前(哥伦比亚号邮轮)爱达邮轮与哥仑比亚船舶管理集团达成合作
- 4天前(天气预报 华为)2025HDC华为天气上新系统级天气智能体,引领更智能的气象服务
- 4天前(花王伴你乐享五一好“趣”处)花王伴你乐享五一好“趣”处
- 4天前(曼谷丽思卡尔顿公寓价格)在曼谷丽思卡尔顿酒店CALEŌ 邂逅鸡尾酒的浪漫艺术
- 4天前(中国最好的避暑山庄)2025中国十大避暑山庄评选揭晓,澳涞山庄夺魁
- 4天前(苏梅岛普吉岛哪个好玩)苏梅岛金普顿基塔蕾度假酒店推出家庭度假套餐
- 4天前(阿斯塔纳航空属于哪个联盟)阿斯塔纳航空荣获Skytrax世界航空公司大奖,将继续助力中哈交流往来
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章