只要在数据帧上调用第一个操作,就会立即在Java中运行Spark SQL(v2.1.0_2.11)程序,但会出现以下异常:
java.lang.ClassNotFoundException: org.codehaus.commons.compiler.UncheckedCompileException
我在spark-submit
环境之外的Eclipse中运行它。我使用以下Spark SQL Maven依赖项:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.1.0</version>
<scope>provided</scope>
</dependency>
答案 0 :(得分:24)
罪魁祸首是图书馆# Define a source, a channel, and a sink
hwdgteam01.sources = src1
hwdgteam01.channels = chan1
hwdgteam01.sinks = sink1
# Set the source type to Spooling Directory and set the directory
# location to /home/flume/ingestion/
hwdgteam01.sources.src1.type = spooldir
hwdgteam01.sources.src1.spoolDir = /home/hwdgteam01/nandan/input-data
hwdgteam01.sources.src1.basenameHeader = true
# Configure the channel as simple in-memory queue
hwdgteam01.channels.chan1.type = memory
# Define the HDFS sink and set its path to your target HDFS directory
hwdgteam01.sinks.sink1.type = hdfs
hwdgteam01.sinks.sink1.hdfs.path = /home/datalanding
hwdgteam01.sinks.sink1.hdfs.fileType = DataStream
# Disable rollover functionallity as we want to keep the original files
hwdgteam01.sinks.sink1.rollCount = 0
hwdgteam01.sinks.sink1.rollInterval = 0
hwdgteam01.sinks.sink1.rollSize = 0
hwdgteam01.sinks.sink1.idleTimeout = 0
# Set the files to their original name
hwdgteam01.sinks.sink1.hdfs.filePrefix = %{basename}
# Connect source and sink
hwdgteam01.sources.src1.channels = chan1
hwdgteam01.sinks.sink1.channel = chan1
。这是冲突:
要解决此问题,请将以下内容添加到您的pom.xml:
commons-compiler
答案 1 :(得分:11)
我有类似的问题,当更新spark-2.2.1到spark-2.3.0时。
就我而言,我必须修复commons-compiler和janino
Spark 2.3解决方案:
<dependencyManagement>
<dependencies>
<!--Spark java.lang.NoClassDefFoundError: org/codehaus/janino/InternalCompilerException-->
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>commons-compiler</artifactId>
<version>3.0.8</version>
</dependency>
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.0.8</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>commons-compiler</artifactId>
<version>3.0.8</version>
</dependency>
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.0.8</version>
</dependency>
</dependencies>
答案 2 :(得分:2)
如果您使用的是 Spark 3.0.1
版本,则在我撰写此答案时的最新版本,您必须为 @Maksym 的两个 3.0.16
依赖项选择版本 janino
非常有效的解决方案。
答案 3 :(得分:1)
我的实现要求是Spring-boot + Scala + Spark(2.4.5)
对于此问题,解决方案是排除2.4.5版“ spark-sql_2.12”随附的工件ID“ janino”和“ commons-compiler”。
原因是工件ID“ janino”和“ commons-compiler”的更新版本3.1.2,随附“ spark-sql_2.12”版本2.4.5。
排除后,为工件ID“ janino”和“ commons-compiler”添加3.0.8版,作为单独的依赖项。
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>2.4.5</version>
<exclusions>
<exclusion>
<artifactId>janino</artifactId>
<groupId>org.codehaus.janino</groupId>
</exclusion>
<exclusion>
<artifactId>commons-compiler</artifactId>
<groupId>org.codehaus.janino</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<artifactId>janino</artifactId>
<groupId>org.codehaus.janino</groupId>
<version>3.0.8</version>
</dependency>
<dependency>
<artifactId>commons-compiler</artifactId>
<groupId>org.codehaus.janino</groupId>
<version>3.0.8</version>
</dependency>
...............
...............
...............
...............
...............
</dependencies>
答案 4 :(得分:1)
此错误仍然出现在org.apache.spark:spark-sql_2.12: 2.4.6 上,但是必须使用的Janino版本是 3.0.16 使用Gradle:
implementation 'org.codehaus.janino:commons-compiler:3.0.16'
implementation 'org.codehaus.janino:janino:3.0.16'
答案 5 :(得分:1)
Apache spark-sql 带来了所需的 janino
和 commons-compiler
版本。如果您遇到此错误,则说明您的 pom(或父 pom)中的其他内容会覆盖该版本。虽然您可以在 pom 中明确设置 janino
和 commons-compiler
版本以匹配其他答案中建议的 spark 带来的内容,但这将使长期维护变得更加困难,因为维护人员需要记住更新这些显式每次更新 spark 时的版本。相反,我推荐适合我的方法:
通过运行找出是什么导致了错误版本的 janino:
mvn dependency:tree #-Dverbose may be helpful
从有问题的依赖项中排除 janino
和 commons-compiler
。就我而言,它是一个内部 hadoop 测试框架:
<dependency>
<groupId>org.my.client.pkg</groupId>
<artifactId>hadoop-testing-framework</artifactId>
<version>${some.version}</version>
<exclusions>
<!-- We want only and exactly Spark's janino version -->
<exclusion>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
</exclusion>
<exclusion>
<groupId>org.codehaus.janino</groupId>
<artifactId>commons-compiler</artifactId>
</exclusion>
</exclusions>
</dependency>
重新运行 mvn dependency:tree
并对覆盖 spark janino 版本的任何其他依赖项重复上述过程,直到您的 janino
和 commons-compiler
版本来自您的 spark-sql 依赖项显示在我的(缩写)mvn dependency:tree
下面的输出中:
[INFO] +- org.apache.spark:spark-sql_2.11:jar:2.4.0.cloudera1:provided
[INFO] | +- org.apache.spark:spark-catalyst_2.11:jar:2.4.0.cloudera1:provided
[INFO] | | +- org.codehaus.janino:janino:jar:3.0.9:compile
[INFO] | | +- org.codehaus.janino:commons-compiler:jar:3.0.9:compile
请注意,如果您看到类似:
[INFO] +- org.apache.spark:spark-sql_2.11:jar:2.4.0.cloudera1:provided
[INFO] | +- org.apache.spark:spark-catalyst_2.11:jar:2.4.0.cloudera1:provided
[INFO] | | +- org.codehaus.janino:janino:jar:2.6.1:compile <-- Note old version
[INFO] | | +- org.codehaus.janino:commons-compiler:jar:3.0.9:compile
那么其他人仍然凌驾于 spark 的 janino
版本。就我而言,父 pom 明确引入了 v2.6.1。从父 pom 中删除该依赖块解决了我的问题。这就是 -Dverbose
标志可能有用的地方。
最后一点,至少我的 spark 版本不能容忍 janino
或 commons-compiler
版本的任何变化。它必须正是给补丁带来的火花(假设 codehaus 遵循 semver)。
答案 6 :(得分:0)
我们已经简单地覆盖了maven属性:
<janino.version>3.0.8</janino.version>
此外,我们在依赖项管理部分定义了hive依赖项的正确版本:
<hive.version>1.1.0-cdh5.13.3</hive.version>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>${hive.version}</version>
<scope>runtime</scope>
<exclusions>
<exclusion>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>parquet-hadoop-bundle</artifactId>
<groupId>com.twitter</groupId>
</exclusion>
</exclusions>
</dependency>
排除功能对于以前的版本是必需的,可能不再需要