Spark2.X通过SparkSession读取JDBC数据时遇到Janino库的版本不兼容的错误 org/codehaus/janino/InternalCompilerException

这篇具有很好参考价值的文章主要介绍了Spark2.X通过SparkSession读取JDBC数据时遇到Janino库的版本不兼容的错误 org/codehaus/janino/InternalCompilerException。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

出错过程如下:

通过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<Row> 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是什么呢?

官网如下:
org.codehaus.janino.compileexception: org/bouncycastle/asn1/asn1integer,机器学习,大数据,java,spark,spring boot

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包 放在平台上运行。然而如果版本不兼容的话会出现上述错误:

<dependency>
     <groupId>org.codehaus.janino</groupId>
     <artifactId>janino</artifactId>
     <version>3.1.16</version>
</dependency>

Spark2.4版本错误解决方案如下

就是变更了版本号,降版本就解决问题了。3.1.16 修改为 3.0.11

<dependency>
     <groupId>org.codehaus.janino</groupId>
     <artifactId>janino</artifactId>
     <version>3.0.11</version>
</dependency>

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版本与运行时使用的版本不匹配导致的。

为了解决这个问题,可以尝试以下几种解决方案:

  1. 检查Scala版本:首先确保你的项目中使用的Scala版本是与Spark兼容的。你可以查看Spark官方文档或者Spark依赖库的要求来确认你的Scala版本是否匹配。

  2. 更新依赖库:如果你确定Scala版本匹配,那么可能是因为依赖库版本不兼容。尝试更新你的Spark和相关依赖库的版本,确保它们能够相互兼容。

  3. 排除冲突的依赖:如果你的项目中引入了多个版本的Scala或者相关库,可能会导致冲突。你可以尝试使用Maven或者Gradle等构建工具来排除冲突的依赖,确保只有兼容的版本被引入。

  4. 清理编译缓存:有时候编译的缓存可能会导致问题,你可以尝试清理项目的编译缓存,然后重新编译和运行项目。

希望这些解决方案能够帮助你解决这个问题。如果还有问题,继续搜索或者用智能回答模型吧。

补充一些内容

关于如何正确配置 Janino 以及解决类似问题的更多信息,还可以参考以下官方文档和链接:

  1. Apache Spark 官方文档:https://spark.apache.org/documentation.html
    在官方文档中,您可以找到有关 Spark 配置和依赖项的详细信息,以及与第三方库集成的指导。

  2. Janino 官方文档:https://janino-compiler.github.io/janino/
    Janino 的官方文档提供了关于该库的详细信息,包括版本兼容性、配置指南等。

  3. Stack Overflow:https://stackoverflow.com/
    Stack Overflow 是一个常用的开发者问答社区,您可以在这里搜索与 Spark、Janino 及相关错误信息相关的问题,并查看其他开发者的解决方案。

  4. Apache Spark 官方邮件列表和论坛:https://spark.apache.org/community.html
    Apache Spark 提供了邮件列表和论坛等社区支持平台,您可以在这里向更多专业人士咨询,寻求帮助。

  5. 应用这个的牛人Spark 代码线上维护 实现【janino】

  6. 比JDK最高快170倍,高性能多语言序列化框架Fury中,用到的Janino编译器文章来源地址https://www.toymoban.com/news/detail-802741.html

到了这里,关于Spark2.X通过SparkSession读取JDBC数据时遇到Janino库的版本不兼容的错误 org/codehaus/janino/InternalCompilerException的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spark Doris Connector 可以支持通过 Spark 读取 Doris 数据类型不兼容报错解决

    doris版本: 1.2.8 Spark Connector for Apache Doris 版本: spark-doris-connector-3.3_2.12-1.3.0.jar:1.3.0-SNAPSHOT spark版本:spark-3.3.1 Spark Doris Connector - Apache Doris 目前最新发布版本: Release Apache Doris Spark Connector 1.3.0 Release · apache/doris-spark-connector · GitHub 2.1、Spark Doris Connector概述 Spark Doris Connector 可

    2024年01月23日
    浏览(49)
  • spark读取、写入Clickhouse以及遇到的问题

    最近需要处理Clickhouse里面的数据,经过上网查找总结一下spark读写Clickhouse的工具类已经遇到的问题点。具体Clickhouse的讲解本篇不做讲解,后面专门讲解这个。 话不多说直接看代码 1.引入依赖: 0.2.4  这个版本用的比较多一点 2.spark对象创建  3.spark读取clickhouse数据:

    2024年02月03日
    浏览(45)
  • Spark2x原理剖析(二)

    基于社区已有的JDBCServer基础上,采用多主实例模式实现了其高可用性方案。集群中支持同时共存多个JDBCServer服务,通过客户端可以随机连接其中的任意一个服务进行业务操作。即使集群中一个或多个JDBCServer服务停止工作,也不影响用户通过同一个客户端接口连接其他正常的

    2024年02月09日
    浏览(42)
  • 【Spark实战】Windows环境下编译Spark2 Linux上部署Spark On Yarn

    环境准备 git-2.14.1 maven-3.9.2 jdk-1.8 scala-2.11.8 zinc-0.3.15 主下载地址 spark-2.3.4 github官方地址 编译准备 maven远程仓库使用的是阿里云的 解压源码包 spark-2.3.4.zip ,修改根模块的pom文件。主要目的是为了变更hadoop的版本号,默认是 2.6.5 。 修改 spark-2.3.4devmake-distribution.sh 文件 主要是

    2024年02月13日
    浏览(56)
  • Spark2.2出现异常:ERROR SparkUI: Failed to bind SparkUI

    详细错误信息如下: 复制代码 19/03/19 11:04:18 INFO util.log: Logging initialized @5402ms 19/03/19 11:04:18 INFO server.Server: jetty-9.3.z-SNAPSHOT 19/03/19 11:04:18 INFO server.Server: Started @5604ms 19/03/19 11:04:18 WARN util.Utils: Service ‘SparkUI’ could not bind on port 4040. Attempting port 4041. 19/03/19 11:04:18 WARN util.Utils: Se

    2024年02月13日
    浏览(35)
  • Spark SQL数据源:JDBC

    Spark SQL还可以使用JDBC API从其他关系型数据库读取数据,返回的结果仍然是一个DataFrame,可以很容易地在Spark SQL中处理,或者与其他数据源进行连接查询。 在使用JDBC连接数据库时可以指定相应的连接属性 属性 介绍 url 连接的JDBC URL driver JDBC驱动的类名 user 数据库用户名 pass

    2024年02月09日
    浏览(41)
  • 记录JDBC连接MySQL数据库时遇到的问题

    记录使用 JDBC连接数据库的时候遇到的问题 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 可以参考这篇 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 博主总结的很全,就不赘述了~ com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the

    2024年02月10日
    浏览(58)
  • Spark流式读取文件数据

    流式读取文件数据 from pyspark.sql import SparkSession ss = SparkSession.builder.getOrCreate() df_csv = ss.readStream.csv(‘hdfs://node1:8020/目录’) df_json = ss.readStream.json(‘hdfs://node1:8020/目录’) options2 ={ ‘host’:‘192.168.88.100’, ‘port’:9999 } options={ # 每个批次读取1个文件 ‘maxFilesPerTrigger’:1, ‘lat

    2024年01月21日
    浏览(63)
  • Spark 数据读取保存

    Spark 的数据读取及数据保存可以从两个维度来作区分:文件格式以及文件系统: 文件格式: Text 文件、 Json 文件、 csv 文件、 Sequence 文件以及 Object 文件 文件系统:本地文件系统、 HDFS、Hbase 以及数据库 text/hdfs 类型的文件读都可以用 textFile(path) ,保存使用 saveAsTextFile(path)

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包