如何使用修改后的 Spark MLlib 模块作为依赖项?
How to use modified Spark MLlib module as dependency?
我想构建一个 Spark 应用程序 Jar。我的期望是:当我通过 ./spark-submit
执行 jar 时,应用程序将利用 我自己构建的 mllib(ex: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
。
谁能帮我解决这个问题。提前致谢!
答案取决于您的做法 spark-submit
。您必须 "convince"(又名修改)spark-submit
才能看到修改后的 jar(不是 SPARK_HOME
中的那个)。
最快的(在长 运行 中不一定是最简单的)方法是将 Spark 罐子(包括您修改过的罐子)包含在您的 uberjar(又名胖罐子)中。您似乎在 sbt 项目中使用了 sbt-assembly 插件,所以这只是 publishLocal
依赖项(或放入 lib
目录)并将其添加到项目中的 libraryDependencies
的问题. assemble
会完成剩下的工作。
然而,这会给你一个非常大和胖的 jar,而在繁重的开发周期中有大量的编译、测试和部署可能会使过程非常缓慢。
另一种方法是使用您的自定义 Apache Spark(包括 Spark MLlib 的修改库)。在 mvn install
之后,您将可以使用自定义 Spark。使用自定义版本中的 spark-submit
,它应该可以工作。您不必将 jar 包含在您的 fat jar 中,也许您不必使用任何 sbt-assembly 插件(只需 sbt package
就可以了)。
这种方法的好处是可以使可部署的 Spark 应用程序包更小,并且自定义 Spark 与开发过程保持分离。使用内部库存储库发布和依赖。
我想构建一个 Spark 应用程序 Jar。我的期望是:当我通过 ./spark-submit
执行 jar 时,应用程序将利用 我自己构建的 mllib(ex: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
。
谁能帮我解决这个问题。提前致谢!
答案取决于您的做法 spark-submit
。您必须 "convince"(又名修改)spark-submit
才能看到修改后的 jar(不是 SPARK_HOME
中的那个)。
最快的(在长 运行 中不一定是最简单的)方法是将 Spark 罐子(包括您修改过的罐子)包含在您的 uberjar(又名胖罐子)中。您似乎在 sbt 项目中使用了 sbt-assembly 插件,所以这只是 publishLocal
依赖项(或放入 lib
目录)并将其添加到项目中的 libraryDependencies
的问题. assemble
会完成剩下的工作。
然而,这会给你一个非常大和胖的 jar,而在繁重的开发周期中有大量的编译、测试和部署可能会使过程非常缓慢。
另一种方法是使用您的自定义 Apache Spark(包括 Spark MLlib 的修改库)。在 mvn install
之后,您将可以使用自定义 Spark。使用自定义版本中的 spark-submit
,它应该可以工作。您不必将 jar 包含在您的 fat jar 中,也许您不必使用任何 sbt-assembly 插件(只需 sbt package
就可以了)。
这种方法的好处是可以使可部署的 Spark 应用程序包更小,并且自定义 Spark 与开发过程保持分离。使用内部库存储库发布和依赖。