簡體   English   中英

httpclient版本與Apache Spark之間的沖突

[英]Conflict between httpclient version and Apache Spark

我正在使用Apache Spark開發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文件中。 使用spark-submit在EC2實例上部署它時,我收到此錯誤。

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>

我還添加了依賴項中providedscope ,因為它將由您的群集提供。

然而,這可能會破壞Spark的內部行為。 如果在執行此操作后仍然出現錯誤,您可以嘗試使用Maven的relocation工具來生成一個整潔的無沖突項目。

關於無法升級Spark版本的事實,你是否使用了mvnrepository中的這個依賴聲明?

Spark向后兼容,在具有更高版本的群集上部署作業應該沒有任何問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM