Scala 如何在Spark 2.3.3中使用orc-core-1.5.5?

Scala 如何在Spark 2.3.3中使用orc-core-1.5.5?,scala,maven,apache-spark,jar,orc,Scala,Maven,Apache Spark,Jar,Orc,我的代码依赖于orc-core-1.5.5,我需要它在Spark-2.3.3环境下运行。但是Spark-2.3.3只有orc-core-1.4.4 由于某种原因,“--jars”不允许用于我的案例。所以我尝试使用Maven Shade插件将orc-core-1.5.5添加到我的最终jar中。但是当我将这个jar提交给Spark-2.3.3时,它仍然显示java.lang.NoSuchMethodError:org.apache.orc.OrcFile$ReaderOptions.getUseUc

我的代码依赖于
orc-core-1.5.5
,我需要它在
Spark-2.3.3
环境下运行。但是Spark-2.3.3只有
orc-core-1.4.4

由于某种原因,“--jars”不允许用于我的案例。所以我尝试使用Maven Shade插件将orc-core-1.5.5添加到我的最终jar中。但是当我将这个jar提交给Spark-2.3.3时,它仍然显示
java.lang.NoSuchMethodError:org.apache.orc.OrcFile$ReaderOptions.getUseUctimestamp()Z
(它只存在于1.5.5版本中)。我的应用程序似乎没有在我的jar中使用orc-core-1.5.5,而是在Spark环境中的1.4.4中搜索此方法

我的pom中的着色部分:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                  <execution>
                    <phase>package</phase>
                    <goals>
                      <goal>shade</goal>
                    </goals>
                    <configuration>
                      <shadedArtifactAttached>true</shadedArtifactAttached>
                      <shadedClassifierName>cuda10</shadedClassifierName>
                      <artifactSet>
                        <includes>
                          <include>org.apache.orc:orc-core:nohive</include>
                        </includes>
                      </artifactSet>

                    </configuration>

                  </execution>
                </executions>
            </plugin>
但我得到了一个新的错误:

java.lang.NoClassDefFoundError: Could not initialize class org.shaded.apache.orc.impl.SnappyCodec
    at org.shaded.apache.orc.impl.WriterImpl.createCodec(WriterImpl.java:244)
    at org.shaded.apache.orc.impl.OrcCodecPool.getCodec(OrcCodecPool.java:55)
    at org.shaded.apache.orc.impl.ReaderImpl.extractFileTail(ReaderImpl.java:606)
......

我可以在我的jar中看到
org/shade/apache/orc

您需要使用maven shade插件的指令。这将更改依赖项的“位置”,以避免与spark版本冲突


shade插件有效地将您的依赖项移动到不同的包位置,并重写项目其余部分的字节码以使用更改后的完全限定类名,这样它就不会与spark的依赖项重叠,并允许这两个版本同时存在于JVM中。

您确定orc 1.55版本的类文件位于着色jar中吗?我也做过类似的事情,这对我很有效。你能为shade插件发布你的maven配置吗?@MikePone我已经添加了部分pom。orc core是我的jar中附加的唯一依赖项。请仔细检查orc 1.5中的类文件是否在spark中使用的jar文件中。是的,在获得jar后,我深入研究并反编译了OrcFile.class。我可以看到方法“getUseUTCTimestamp()”就在那里。真让人困惑@我已经在我的pom中添加了这个配置,并将它附加到我的jar中。我的应用程序似乎正在使用重新定位的orc内核,但我遇到了一个新错误,如
java.lang.NoClassDefFoundError:无法初始化类org.shade.apache.orc.impl.SnappyCodec
我遗漏了什么吗?看起来您版本的orc依赖项中可能没有包含
SnappyCodec
类,因此,不包括在您的jar中作为阴影名称。一个解决方案是
从您重新定位的类中选择spark版本。另一种可能性是确保依赖项的依赖项也被嵌入。当然,返回spark版本可能会导致其他依赖项问题,因此我建议尝试后一种解决方案。
java.lang.NoClassDefFoundError: Could not initialize class org.shaded.apache.orc.impl.SnappyCodec
    at org.shaded.apache.orc.impl.WriterImpl.createCodec(WriterImpl.java:244)
    at org.shaded.apache.orc.impl.OrcCodecPool.getCodec(OrcCodecPool.java:55)
    at org.shaded.apache.orc.impl.ReaderImpl.extractFileTail(ReaderImpl.java:606)
......