当前位置: 首页 > 面试题库 >

httpclient版本和Apache Spark之间的冲突

籍兴文
2023-03-14
问题内容

我正在使用Apache Shtml" target="_blank">park开发Java应用程序。我使用这个版本:

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.10</artifactId>
    <version>1.2.2</version>
</dependency>

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

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.2</version>
</dependency>

我将应用程序打包到一个JAR文件中。使用将其部署到EC2实例上时spark-submit,出现此错误。

Caused by: java.lang.NoSuchFieldError: INSTANCE
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<clinit>(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代码?


问题答案:

如您的帖子所述,Spark正在加载的旧版本httpclient。解决方案是使用Maven的relocation工具来生成一个简洁的无冲突项目。

这是一个如何在pom.xml文件中使用它的示例:

<project>
  <!-- Your project definition here, with the groupId, artifactId, and it's dependencies --> 
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.4.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <relocations>
                <relocation>
                  <pattern>org.apache.http.client</pattern>
                  <shadedPattern>shaded.org.apache.http.client</shadedPattern>
                </relocation>
              </relocations>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

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

原始帖子:

如果这仅仅是传递依赖关系的问题,则可以将其添加到spark-core依赖关系中以排除Spark使用的HttpClient:

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.10</artifactId>
    <version>1.2.2</version>
    <scope>provided</scope>
    <exclusions>
        <exclusion>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </exclusion>
    </exclusions>
</dependency>

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

但是,这可能与Spark的内部行为混为一谈。如果执行此操作后仍然出现错误,则可以尝试使用Maven的relocation工具,该工具应生成一个整洁的,无冲突的项目。

关于您不能升级Spark版本的事实,您是否使用了mvnrepository中的此依赖项声明?

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



 类似资料:
  • 问题内容: 作为测试项目,我使用wsdl和jax- ws创建了一个非常简单的WebService。如果客户端作为GlassFish中的Web应用程序部署,则客户端运行得很好,但是如果我直接在Eclipse中启动相同的(WebService-)代码,则会收到以下错误: 经过研究,我发现它与某些版本的库文件有一定关系。所以现在我的问题是,如何才能“修复” Eclipse Java执行以正确运行我的We

  • 在将OpenSAML从1.1升级到2.6.1(需要xerces-impl依赖项)之后,启动时会出现以下堆栈: xerces-impl重新定义了一些jre类,并附带了重新定义一些jre接口的XML-API。DataType.DataTypeFactoryImpl来自xerces-impl。 我读过用Java/Maven处理“Xerces地狱”?并尝试排除XML-API,但xerces-impl抛出N

  • null JDBC URL:jdbc:ucanaccess://f://workspaceNetbeans/msaccessdb/data/datenbank2.accdb “用户名”和“密码”留空 “测试连接”-按钮会导致错误消息: 无法使用 net.ucanaccess.jdbc.ucanaccessDriver建立到jdbc:ucanaccess://f:\workspaceNetBeans

  • 我们在您的服务器(最大5.3.5)和开发机器(最大5.5.9)上混合运行不同的PHP版本。 现在我们遇到了一个问题,我们做了一个“作曲家更新”来获取一些外部捆绑包的最新版本。因为你的composer.json看起来像 我们得到了一些需要PHP 5.5的捆绑包。在我们的开发机器上没有问题,但在服务器上:( 有没有可能告诉composer需要5.3.3到5.3.5之间的PHP版本?还是最大可用版本?

  • 在OSGi bundles中,用一个版本号导出和导入包。包仍然定义了一个版本。这在我看来是多余的。