2017-07-26 16 views
0

私のアプリケーションはcommons-configuration2とcommons-beanutils1.9を使用していますが、sparkストリーミングジョブ用のアプリケーションjarを使用しようとすると、Apache spark 1.6でcommons-configuration2とcommons-beanutils-1.9を使用する

java.lang.NoSuchMethodErrorの:org.apache.commons.beanutils.PropertyUtilsBean.addBeanIntrospector(Lorg /アパッチ/コモンズ/々BeanUtils/BeanIntrospector;)org.apache.commons.configuration2.beanutils.BeanHelper.initBeanUtilsBeanにおけるV ( (ネイティブメソッド) at java.lang.Class.forName(BeanHelper.java:631) at org.apache.commons.configuration2.beanutils com.sun.proxyでClass.java:264) 。$ Proxy23。(不明なソース) sun.reflect.NativeConstructorAccessorImpl.newInstanceでsun.reflect.NativeConstructorAccessorImpl.newInstance0(ネイティブメソッド) で(NativeConstructorAccessorImpl.java:62)(Proxy.java:Proxy.java:4230)の の のsun.reflect.DelegatingConstructorAccessorImpl.newInstanceの3210 739) at org.apache.commons.configuration2.builder.fluent.Parameters.createParametersProxy(Parameters.java:294) at org.apache.commons.configuration2.builder.fluent.Parameters.fileBased(Parameters.java:185)

そして、ここでは、私はそれが使用されていることを確認するにはどうすればよい私のbuild.sbt

libraryDependencies ++= Seq(
     "org.apache.commons" % "commons-configuration2" % "2.0", 
     "commons-beanutils" % "commons-beanutils" % "1.9.2", 
     "com.databricks" % "spark-avro_2.10" % "2.0.1", 
     "com.databricks" % "spark-csv_2.10" % "1.4.0", 
     "org.apache.spark" % "spark-sql_2.10" % "1.5.0" % "provided", 
     "org.apache.spark" % "spark-hive_2.10" % "1.4.1" % "provided", 
     "org.apache.spark" % "spark-core_2.10" % "1.4.1" % "provided", 
     "com.amazonaws" % "aws-java-sdk" % "1.10.61", 
     "org.apache.logging.log4j" % "log4j-api" % "2.6.2", 
     "org.jasypt" % "jasypt" % "1.9.2", 
     "commons-codec" % "commons-codec" % "1.8", 
     "org.apache.kafka" % "kafka-clients" % "0.10.0.0", 
     "org.apache.spark" % "spark-streaming-kafka_2.10" % "1.6.3", 
     "org.apache.spark" % "spark-streaming_2.10" % "1.6.3" excludeAll(ExclusionRule(organization = "commons-beanutils")) 

    ) 

    dependencyOverrides ++= Set(
     "com.fasterxml.jackson.core" % "jackson-databind" % "2.4.4", 
     "org.apache.logging.log4j" % "log4j-api" % "2.6.2", 
     "org.apache.logging.log4j" % "log4j-core" % "2.6.2", 
     "org.apache.commons" % "commons-configuration2" % "2.0", 
     "commons-beanutils" % "commons-beanutils" % "1.9.2" 
    ) 

assemblyMergeStrategy in assembly := { 
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard 
    case x => MergeStrategy.first 
} 

ですコモンズ-々BeanUtilsを-1.9.2 inste commons-beanutils-1.7の広告、またはhadoop-commonの一部であるcommons-beanutils-core-1.8?プロジェクトの設定で不要なjarを除く

答えて

0

は私の作品:

... 
.settings(assemblyExcludedJars in assembly := { 
    val cp = (fullClasspath in assembly).value 

    val excludes = Set(
     "commons-beanutils-core-1.8.0.jar", 
     "commons-beanutils-1.7.0.jar", 
     "commons-beanutils-1.8.0.jar" 
    ) 
    cp.filter{jar => excludes.contains(jar.data.getName)} 
    }) 
+0

こんにちはデニス、 応答のための おかげで、私にとって、それはまだ実行時に例外を与えています。私はPropertyUtilsBeanクラスをアセンブリから生成されたuber jarからチェックします。これはcommons-beanutils-1.9.2.jarにのみ対応していますが、実行時にspark-submitを実行するとaddBeanIntrospectorメソッドについて不平を言います。実行時にspark環境が付属するのではなく、クラスファイルを使用するようにsparkに指示するにはどうすればよいですか? – kallam

+0

シェーディングを試しましたか(つまり、アセンブリの作成時に基本的にパッケージの名前を変更し、すべての参照を修正して代替パッケージ名を使用しましたか?この場合にはうまくいくかもしれません。詳細についてはhttps://github.com/sbt/sbt-assembly#shadingをご覧ください。残念ながら、それはいつもうまくいくわけではありません。 jarに元のパッケージ名に依存するコードが含まれている場合特に、同じプロジェクトで2つの異なるAWS SDKバージョンを使用した場合、私の役に立ちませんでした。私はこれを、同じライブラリの別々のバージョンにある同じシンボルを別々に保つために私のライブラリ用のカスタムクラスローダを書くことで解決しました。 –

+0

ありがとうDenisさん、シェーディングを使用するよう提案していますが、指定したjar /パッケージにシェーディングを適用した後にうまくいきます。私はもう1つ質問があります。sbtプロジェクトのlibフォルダのjarファイルに含まれるパッケージに陰影を適用できますか?これらのjarファイルにシェーディングを適用するには、アプリケーションjarを内部Mavenリポジトリにアップロードする必要があります。 libフォルダに置かれたjarファイルに適用することができれば、nexusリポジトリにアップロードしなくても問題は解決します。 – kallam

関連する問題