我有一个Spark应用程序,该应用程序使用Jackson 2.8 API,并且我使用spark 1.6作为应用程序pom.xml中提供的(作用域)依赖项。当我尝试以集群模式部署Spark应用程序时,会选择Spark 1.6构建中的Jackson旧版本,从而导致应用程序失败。
我厌倦了通过“ --jars”选项提供2.8 Jackson jar,用最新的Jackson依赖关系构建了Uber应用jar,并在执行程序/驱动程序上使用了userClasspathFirst选项-这些选项都无济于事。
我将最新的Jackson罐子放置在同一位置的所有Spark工作者节点中,并将路径添加到executor classpath选项-仅在此选项中,才选择最新的Jackson版本。在此解决方案中,每次我向应用程序添加新的工作程序节点时,都必须放置最新的Jackson,这是我的缺点。如果有人有更好的解决方案,请告诉我。
答案 0 :(得分:2)
您可以尝试遮蔽Jackson。例如,在maven中,您将执行以下操作:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<relocations>
<relocation>
<pattern>com.fastxml.jackson</pattern>
<shadedPattern>com.mycompany.shaded.com.fastxml.jackson</shadedPattern>
</relocation>
</relocations>
<finalName>FatJarName</finalName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
这个想法是,它将基本上重命名jackson软件包,并将更改您的内部访问权限以使用它。然后提交新的胖子罐。
注意:这并不总是有效的(特别是如果您使用反射来访问杰克逊,它可能指向错误的版本)。