Spark SQL失败,出现java.lang.NoClassDefFoundError:org / codehaus / commons / compiler / UncheckedCompileException

时间:2017-02-20 18:44:00

标签: apache-spark-sql

只要在数据帧上调用第一个操作,就会立即在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>

7 个答案:

答案 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 。这是冲突:

enter image description here

要解决此问题,请将以下内容添加到您的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 带来了所需的 janinocommons-compiler 版本。如果您遇到此错误,则说明您的 pom(或父 pom)中的其他内容会覆盖该版本。虽然您可以在 pom 中明确设置 janinocommons-compiler 版本以匹配其他答案中建议的 spark 带来的内容,但这将使长期维护变得更加困难,因为维护人员需要记住更新这些显式每次更新 spark 时的版本。相反,我推荐适合我的方法:

通过运行找出是什么导致了错误版本的 janino:

mvn dependency:tree #-Dverbose may be helpful

从有问题的依赖项中排除 janinocommons-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 版本的任何其他依赖项重复上述过程,直到您的 janinocommons-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 版本不能容忍 janinocommons-compiler 版本的任何变化。它必须正是给补丁带来的火花(假设 codehaus 遵循 semver)。

答案 6 :(得分:0)

从CDH Parcel 2.2.0.cloudera1迁移到2.3.0.cloudera4的

我们已经简单地覆盖了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>

排除功能对于以前的版本是必需的,可能不再需要