httpclient版本与Apache Spark之间的冲突

我正在使用Apache Spark开发Java应用程序。 我用这个版本:

 org.apache.spark spark-core_2.10 1.2.2  

在我的代码中,有一个过渡依赖:

  org.apache.httpcomponents httpclient 4.5.2  

我将我的应用程序打包到一个JAR文件中。 当使用spark-submit在EC2实例上部署它时,我收到此错误。

 Caused by: java.lang.NoSuchFieldError: INSTANCE at org.apache.http.conn.ssl.SSLConnectionSocketFactory.(SSLConnectionSocketFactory.java:144) at com.amazonaws.http.apache.client.impl.ApacheConnectionManagerFactory.getPreferredSocketFactory(ApacheConnectionManagerFactory.java:87) at com.amazonaws.http.apache.client.impl.ApacheConnectionManagerFactory.create(ApacheConnectionManagerFactory.java:65) at com.amazonaws.http.apache.client.impl.ApacheConnectionManagerFactory.create(ApacheConnectionManagerFactory.java:58) at com.amazonaws.http.apache.client.impl.ApacheHttpClientFactory.create(ApacheHttpClientFactory.java:50) at com.amazonaws.http.apache.client.impl.ApacheHttpClientFactory.create(ApacheHttpClientFactory.java:38) 

此错误清楚地表明SparkSubmit已加载相同Apache httpclient库的旧版本,因此发生此冲突。

解决这个问题的好方法是什么?

出于某种原因,我不能在我的Java代码上升级Spark。 但是,我可以轻松地使用EC2群集。 是否可以在具有更高版本的1.6.1版本的集群上部署我的Java代码?

正如你在post中所说,Spark正在加载一个旧版本的httpclient 。 解决方案是使用Maven的relocation设施来生成一个整洁的无冲突项目。

以下是如何在pom.xml文件中使用它的示例:

      org.apache.maven.plugins maven-shade-plugin 2.4.3   package  shade     org.apache.http.client shaded.org.apache.http.client          

这会将所有文件从org.apache.http.client移动到shaded.org.apache.http.client ,解决冲突。


原帖:

如果这只是传递依赖的问题,你可以将它添加到你的spark-core依赖项中,以排除Spark使用的HttpClient:

  org.apache.spark spark-core_2.10 1.2.2 provided   org.apache.httpcomponents httpclient    

我还添加了依赖项中providedscope ,因为它将由您的群集提供。

然而,这可能会破坏Spark的内部行为。 如果在执行此操作后仍然出现错误,您可以尝试使用Maven的relocation工具,该工具可以生成一个整洁的无冲突项目。

关于你无法升级Spark版本的事实,你是否使用了mvnrepository的这个依赖声明?

Spark向后兼容,在具有更高版本的群集上部署作业应该没有任何问题。