2016-06-15 7 views
2

Apache Sparkを使用してJavaアプリケーションを開発しています。私は、単一のJARファイルに自分のアプリケーションをパッケージ化httpclientバージョンとApache Sparkの間の競合

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

:過渡的依存性があり、私のコードで

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

:私は、このバージョンを使用しています。​​を使用して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クラスターでそれを簡単に行うことができました。私のJavaコードを、より高いバージョンの1.6.1バージョンのクラスターにデプロイすることは可能ですか?

答えて

5

あなたの投稿にあるように、Sparkはhttpclientの古いバージョンを読み込んでいます。解決方法は、Mavenのrelocation機能を使用して、コンフリクトのないきれいなプロジェクトを作成することです。これは、紛争の解決、shaded.org.apache.http.clientorg.apache.http.clientからすべてのファイルを移動します

<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> 

:ここ

は、あなたのpom.xmlファイルでそれを使用する方法の例です。


オリジナルのポスト:これは単純に推移依存関係の問題である場合

、あなただけのスパークによって使用されるのHttpClientを除外するために、あなたのspark-core依存関係にこれを追加することができます。

<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> 

をまた、scopeprovidedというように、クラスタによって提供されるように依存関係に追加しました。

しかし、それはスパークの内部的な振る舞いでうんざりするかもしれません。これを行った後でもまだエラーが発生した場合は、Mavenのrelocation機能を使用して、きちんとコンフリクトのないプロジェクトを作成することができます。

スパークのバージョンをアップグレードできないという事実については、正確にthis dependency mvnrepositoryの宣言を使用しましたか?

スパークは下位互換性があるため、上位バージョンのクラスタにジョブを展開する際に問題はありません。

+0

問題は実際に再配置によって解決されました。あなたが 'apache-shade-plugin'の使い方を詳しく説明したら、私はそれを答えとして受け入れます。 –

+0

@ M-T-Aそれは助けてくれてうれしい。自分の答えを更新しましたが、パターンタグの正しいパッケージを参照していることを確認できますか? –

+1

はい、正しい。ちょうど答えとして選んだ。 –

関連する問題