2017-07-26 114 views
0

我的应用程序使用的是commons-configuration2和commons-beanutils1.9,但是当我尝试使用我的应用程序罐进行火花流作业时,它抛出以下异常。使用commons-configuration2和commons-beanutils-1.9和Apache spark 1.6

java.lang.NoSuchMethodError:org.apache.commons.beanutils.PropertyUtilsBean.addBeanIntrospector(Lorg /阿帕奇/公地/ BeanUtils的/ BeanIntrospector)在org.apache.commons.configuration2.beanutils.BeanHelper.initBeanUtilsBean V ( BeanHelper.java:631) 在org.apache.commons.configuration2.beanutils.BeanHelper。(BeanHelper.java:89) 在java.lang.Class.forName0(本机方法) 在java.lang.Class.forName( Class.java:264) 在com.sun.proxy。$ Proxy23。(来源不明) 在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at java.lang.reflect.Proxy.newProxyInstance(Proxy.java: 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 
} 

如何确保它使用的commons-BeanUtils的-1.9.2 inste commons-beanutils-1.7或commons-beanutils-core-1.8是hadoop-common的一部分吗?

回答

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

嗨丹尼斯, 感谢您的答复,但对我来说仍是给予在运行时异常。我从程序集生成的uber jar中检查PropertyUtilsBean类,它只对应于commons-beanutils-1.9.2.jar,但是在运行时我做了spark-submit,然后它在抱怨addBeanIntrospector方法。我们如何告诉spark使用来自uber jar的类文件,而不是在运行时带有spark环境? – kallam

+0

您是否尝试着色(即在组件创建过程中基本上重命名包并修复所有引用以使用备用包名称)?它可能在这种情况下工作。查看https://github.com/sbt/sbt-assembly#shading了解更多详情。 不幸的是它并不总是有效的,例如如果jar包含依赖于原始软件包名称的代码。特别是,它并没有帮助我在同一个项目中使用两个不同的AWS SDK版本。我通过为我的库编写自定义类加载器来解决此问题,以将相同库的不同版本中的相同符号分开。 –

+0

非常感谢Denis,因为你建议使用阴影,所以在我为指定的罐子/包装应用阴影后它工作正常。我还有一个问题,我们可以在sbt项目的lib文件夹中的罐子上包含的包装上应用阴影吗?我必须将应用程序jar上传到内部maven存储库以在这些jar上应用阴影。如果可以应用于放置在lib文件夹中的罐子,那么它将解决我的问题,而无需上传到nexus存储库。 – kallam