【问题标题】:Spark application with Jackson version 2.8 is incompatible with Apache Spark 1.6使用 Jackson 2.8 版的 Spark 应用程序与 Apache Spark 1.6 不兼容
【发布时间】:2019-05-10 10:39:19
【问题描述】:

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

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

我将最新的 Jackson jar 放在同一位置的所有 Spark 工作节点中,并将路径添加到 executor classpath 选项 - 只有在此选项中,才会选择最新的 Jackson 版本。在这个解决方案中,每次我向我的应用程序添加一个新的工作节点时,我都必须放置最新的 Jackson,我认为这是一个劣势。如果有人有更好的解决方案,请告诉我。

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    你可以试着遮住杰克逊。例如在 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>
    

    这个想法是它基本上会重命名杰克逊包,并会改变你的内部访问来使用它。然后提交新的胖罐子。

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

    【讨论】:

    • 谢谢阿萨夫!这个对我有用。在 Shade 插件中使用重定位功能时是否有任何缺点/问题?
    • 发布了一个不同的问题来了解重定位功能的缺点,因为我觉得它超出了这个话题。stackoverflow.com/questions/53710931/…
    • @PrabuSoundarRajan 我知道的最重要的一点是,如果您使用反射,它可能会中断(例如,我在 Spring 中就发生了这种情况)。如果您的清单依赖于包名称,则可能会出现类似问题。此外,这意味着基本上有两个不同的包副本(例如包括两个静态元素实例),这可能会导致问题。这只是意味着你必须小心
    猜你喜欢
    • 2017-05-18
    • 2019-01-02
    • 2017-06-04
    • 2016-02-20
    • 2017-12-08
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多