Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hadoop depends on two different versions of beanutils

Hadoop 2.4.0 depends on two different versions of beanutils, causing the following error with sbt-assembly:

[error] (*:assembly) deduplicate: different file contents found in the following:
[error] .ivy2/cache/commons-beanutils/commons-beanutils/jars/commons-beanutils-1.7.0.jar:org/apache/commons/beanutils/BasicDynaBean.class
[error] .ivy2/cache/commons-beanutils/commons-beanutils-core/jars/commons-beanutils-core-1.8.0.jar:org/apache/commons/beanutils/BasicDynaBean.class

Both of these dependencies are transitive from Hadoop 2.4.0, as confirmed using How to access Ivy directly, i.e. access dependency reports or execute Ivy commands?

How can I make an sbt-assembly including Hadoop 2.4.0?

UPDATE: As requested, here is the build.sbt dependencies:

libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "2.4.0"

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.0.0"  % "provided" exclude("org.apache.hadoop", "hadoop-client")

resolvers += "Akka Repository" at "http://repo.akka.io/releases/"

libraryDependencies += "com.amazonaws" % "aws-java-sdk" % "1.7.8"

libraryDependencies += "commons-io" % "commons-io" % "2.4"

libraryDependencies += "javax.servlet" % "javax.servlet-api" % "3.0.1" % "provided"

libraryDependencies += "com.sksamuel.elastic4s" %% "elastic4s" % "1.1.1.0"

The exclude hadoop is needed because, out of the box, Spark includes Hadoop 1, which conflicts with Hadoop 2.

like image 653
SRobertJames Avatar asked Nov 01 '22 21:11

SRobertJames


1 Answers

Try to add merge strategy to build.sbt

Like below

val meta = """META.INF(.)*""".r

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
  {
    case PathList("javax", "servlet", xs @ _*) => MergeStrategy.last
    case PathList("javax", "activation", xs @ _*) => MergeStrategy.last
    case PathList("org", "apache", xs @ _*) => MergeStrategy.last
    case PathList("com", "esotericsoftware", xs @ _*) => MergeStrategy.last
    case PathList("plugin.properties") => MergeStrategy.last
    case meta(_) => MergeStrategy.discard
    case x => old(x)
  }
}
like image 101
Artem N. Avatar answered Nov 15 '22 08:11

Artem N.