首页 文章

使用Jackson 2.8版的Spark应用程序与Apache Spark 1.6不兼容

提问于
浏览
0

我有一个使用Jackson 2.8 API的Spark应用程序,我在应用程序pom.xml中使用spark 1.6作为提供(范围)依赖 . 当我尝试在群集模式下部署Spark应用程序时,将挑选Spark 1.6版本的Jackson旧版本,导致应用程序失败 .

我厌倦了通过“--jars”选项提供2.8 Jackson jar,构建包含最新Jackson依赖项的Uber应用程序jar和执行程序/驱动程序上的userClasspathFirst选项 - 这些选项都没有帮助 .

我将最新的Jackson jar放在同一位置的所有Spark工作节点中,并添加了执行程序类路径选项的路径 - 仅在此选项中,选择最新的Jackson版本 . 在这个解决方案中,每次我向我的应用程序添加一个新的工作节点时,我必须放置最新的Jackson,我认为这是一个缺点 . 如果有人有更好的解决方案,请告诉我 .

1 回答

  • 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包,并将更改您的内部访问权限以使用它 . 然后提交新的胖 jar .

    注意:这并不总是有效(特别是如果你使用反射访问 Jackson 它可能指向错误的版本) .

相关问题