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)
......