java.lang.ClassNotFoundException: org.codehaus.janino.InternalCompilerException
错误通常与运行环境缺少所需的依赖库有关,特别是与编译或运行时代码生成相关的库。Janino 是一个嵌入式 Java 编译器,Spark 使用它来动态编译生成的代码。Spark 对 Janino 库的依赖可能与其他库发生了冲突(可能是spring版本),或者 Janino 库没有被正确地包含在运行时的类路径中。
java.lang.NoClassDefFoundError: org/codehaus/janino/InternalCompilerException at org.apache.spark.sql.catalyst.expressions.objects.GetExternalRowField.<init>(objects.scala:1835) ~[spark-catalyst_2.13-3.2.1.jar:3.2.1] at org.apache.spark.sql.catalyst.encoders.RowEncoder$.$anonfun$serializerFor$3(RowEncoder.scala:186) ~[spark-catalyst_2.13-3.2.1.jar:3.2.1] at scala.collection.ArrayOps$.flatMap$extension(ArrayOps.scala:959) ~[scala-library-2.13.5.jar:na] at org.apache.spark.sql.catalyst.encoders.RowEncoder$.serializerFor(RowEncoder.scala:183) ~[spark-catalyst_2.13-3.2.1.jar:3.2.1] at org.apache.spark.sql.catalyst.encoders.RowEncoder$.apply(RowEncoder.scala:72) ~[spark-catalyst_2.13-3.2.1.jar:3.2.1] at org.apache.spark.sql.Dataset$.$anonfun$ofRows$1(Dataset.scala:91) ~[spark-sql_2.13-3.2.1.jar:3.2.1] at org.apache.spark.sql.SparkSession.withActive(SparkSession.scala:775) ~[spark-sql_2.13-3.2.1.jar:3.2.1] at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:88) ~[spark-sql_2.13-3.2.1.jar:3.2.1] at org.apache.spark.sql.SparkSession.baseRelationToDataFrame(SparkSession.scala:440) ~[spark-sql_2.13-3.2.1.jar:3.2.1] at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:274) ~[spark-sql_2.13-3.2.1.jar:3.2.1] at org.apache.spark.sql.DataFrameReader.$anonfun$load$3(DataFrameReader.scala:245) ~[spark-sql_2.13-3.2.1.jar:3.2.1] at scala.Option.getOrElse(Option.scala:201) ~[scala-library-2.13.5.jar:na] at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:245) ~[spark-sql_2.13-3.2.1.jar:3.2.1] at org.apache.spark.sql.DataFrameReader.orc(DataFrameReader.scala:622) ~[spark-sql_2.13-3.2.1.jar:3.2.1] at org.apache.spark.sql.DataFrameReader.orc(DataFrameReader.scala:607) ~[spark-sql_2.13-3.2.1.jar:3.2.1]这是我控制台弹出的报错信息,Caused by: java.lang.ClassNotFoundException: org.codehaus.janino.InternalCompilerException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na] ... 39 common frames omitted
在遇到这个报错时可能是由于spark版本和jinion的版本不一致或由于你没有手动引入:
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.1.2</version> <!-- 根据需要调整版本号 -->
</dependency>
注意,如果您通过添加janino后,代码执行时,报错依然没有解决,那么可能是你的spark版本过旧,并不支持janino的最新特性,那么就在spark版本不变的情况下回退janino的版本:如图
这一套属于黄金搭档,不会出现版本问题,但是使用这一套搭档一定让spring版本处于3以下,否则会出现spring slf4j日志实现类和spark冲突的现象。尽量选择使用spring2.7.5稳定靠谱
我写一个方法让sparkSession实例去加载hdfs分布式文件系统中的数据信息,并且简单的执行过滤和读取信息,已经不会出现报错,下一步我们就可以使用mllib等机器学习库或自定义的权重算法实现大数据分析,生成用户个性化内容了