如何使用修改后的Spark MLlib模块作为依赖?

时间:2017-03-06 03:34:36

标签: apache-spark amazon-ec2 sbt apache-spark-mllib sbt-assembly

我想构建一个Spark应用程序Jar。我的期望是:当我按./spark-submit执行jar时,应用程序将使用我自己构建的mllib(例如:spark-mllib_2.11-2.2.0-SNAPSHOT.jar

这是我的build.sbt

name:="SoftmaxMNIST"
version := "1.0"
scalaVersion := "2.11.4"
unmanagedJars in Compile += file("lib/spark-mllib_2.11-2.2.0-SNAPSHOT.jar")

libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.1.0",
"org.apache.spark" %% "spark-sql" % "2.1.0 
)

// META-INF discarding
mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
{
  case PathList("META-INF", xs @ _*) => MergeStrategy.discard
  case x => MergeStrategy.first
}
}

我已将自己构建的spark-mllib_2.11-2.2.0-SNAPSHOT.jar放入/My-Project-Path/lib/目录。但它不起作用。 似乎应用程序仍在使用Spark的默认mllib jar,在我的情况下它位于PATH/spark-2.1.0-bin-hadoop2.7/jars/目录

PS:最终目的是当我在AWS EC2上运行我的应用程序时,我的应用程序总是使用我自己构建的mllib而不是默认的mllib。我可以经常修改自己的Console.log

任何人都可以帮我解决这个问题。提前谢谢!

1 个答案:

答案 0 :(得分:1)

答案取决于你的行为spark-submit。你必须“说服”(又名修改)spark-submit才能看到修改过的jar(不是SPARK_HOME中的那个)。

最快(从长远来看不一定最容易)的方法是在你的uberjar(又名胖罐)中加入Spark罐子,包括你修改过的罐子。您似乎在sbt项目中使用sbt-assembly插件,因此只需publishLocal依赖项(或放入lib目录)并将其添加到项目中的libraryDependenciesassemble将完成剩下的工作。

然而,这会给你一个非常庞大而又肥胖的jar,虽然在繁重的开发周期中进行大量的编译,测试和部署可能会使这个过程非常缓慢。

另一种方法是使用您的自定义Apache Spark(包含Spark MLlib的修改库)。在您mvn install之后,您将准备好自定义Spark。使用自定义版本中的spark-submit,它应该可以正常工作。您不必将jar包含在胖罐中,也许您不必使用sbt-assembly插件(只需sbt package就可以了)。

这种方法的好处是可以使可部署的Spark应用程序包更小,并且自定义Spark与开发过程分开。使用内部库存储库来发布和依赖。