【问题标题】:Spark SQL fails with java.lang.NoClassDefFoundError: org/codehaus/commons/compiler/UncheckedCompileExceptionSpark SQL 因 java.lang.NoClassDefFoundError 失败:org/codehaus/commons/compiler/UncheckedCompileException
【发布时间】:2017-02-20 18:43:59
【问题描述】:

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

【问题讨论】:

    标签: apache-spark-sql


    【解决方案1】:

    罪魁祸首是图书馆commons-compiler。这是冲突:

    要解决此问题,请将以下内容添加到您的 pom.xml:

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.codehaus.janino</groupId>
                <artifactId>commons-compiler</artifactId>
                <version>2.7.8</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

    【讨论】:

    • 也许有人偶然发现...当我从 Spark 2.1 升级到 2.3 时。上述解决方法停止为我工作。所以我将org.codehaus.janino:janino的版本固定为3.0.8。这有帮助。
    • 您好,现在是 2019-12-17,在明确添加对 org.codehaus.janino:commons-compiler:3.1.0 的依赖后,我仍然看到错误。我的 Spark 现在位于 2.4.3,SparkSQL 位于 2.12。我这里有gradle dependency 的完整输出gist.github.com/leeyuiwah-sl/cc9e2f36ebccea0d875a995551abe3ad 你能帮忙吗!谢谢!
    • 好的,我找到了解决方案——我必须使用 Janino 3.0.8 而不是更新版本(例如 3.1.0)。此外,我必须对org.codehaus.janino:janinoorg.codehaus.janino:commons-compiler: 都有明确的依赖关系。谢谢!
    【解决方案2】:

    在将 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>
    

    【讨论】:

    • 完美,谢谢!在添加与这些 Spark 依赖项冲突的 spring boot 插件后,我实际上得到了这个。但是这个解决方案解决了这个问题。
    • 接受的解决方案在 Spark 2.3 中不起作用,但这个解决方案完美。
    【解决方案3】:

    如果您使用的是Spark 3.0.1 版本,这是我撰写此答案时的最新版本,您必须为两个janino 依赖项选择版本3.0.16,以使@Maksym 解决方案运行良好。

    【讨论】:

      【解决方案4】:

      我的实现需求是 Spring-boot + Scala + Spark(2.4.5)

      对于这个问题,解决方案是排除 'spark-sql_2.12' 版本 2.4.5 附带的 artifactID 'janino' 和 'commons-compiler'。
      原因是 artifactID 'janino' 和 'commons-compiler' 的更新版本 3.1.2 与 'spark-sql_2.12' 版本 2.4.5 一起提供。

      排除后,为 artifactID '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>
      

      【讨论】:

      • 为我工作。但无法理解它为什么起作用。能不能解释的详细一点?
      • @AnnaKlein 都链接到 commons-compiler 版本,应该和 Scala 版本一致。
      • @abhijitcaps 你怎么知道的?在哪里可以找到 Scala 版本和 commons-compiler 版本之间的关联?
      • @abhijitcaps 我认为这与 Scala 版本无关。解释见issues.apache.org/jira/browse/…
      【解决方案5】:

      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'
      

      【讨论】:

        【解决方案6】:

        在我们从 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>
        

        以前的版本需要排除项,现在可能不再需要了

        【讨论】:

          【解决方案7】:

          Apache spark-sql 带来了janinocommons-compiler 所需的版本。如果您遇到此错误,则说明您的 pom(或父 pom)中的其他内容覆盖了该版本。虽然您可以在 pom 中显式设置 janinocommons-compiler 版本以匹配其他答案中建议的 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 版本的任何变化。它必须正是 spark 带来的补丁(假设 codehaus 遵循 semver)。

          【讨论】:

            【解决方案8】:

            选择的答案对我不起作用,这样做:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-03-10
              • 1970-01-01
              • 2019-06-07
              • 1970-01-01
              相关资源
              最近更新 更多