杰克逊2.8版的Spark应用程序与Apache Spark 1.6不兼容

时间:2018-12-09 07:24:59

标签: apache-spark

我有一个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,这是我的缺点。如果有人有更好的解决方案,请告诉我。

1 个答案:

答案 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软件包,并将更改您的内部访问权限以使用它。然后提交新的胖子罐。

注意:这并不总是有效的(特别是如果您使用反射来访问杰克逊,它可能指向错误的版本)。