我有一个使用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 回答
你可以尝试遮蔽 Jackson . 例如,在maven中你会做这样的事情:
这个想法是它将基本上重命名jackson包,并将更改您的内部访问权限以使用它 . 然后提交新的胖 jar .
注意:这并不总是有效(特别是如果你使用反射访问 Jackson 它可能指向错误的版本) .