【问题标题】:How to use modified Spark MLlib module as dependency?如何使用修改后的 Spark MLlib 模块作为依赖项?
【发布时间】:2017-07-25 19:42:00
【问题描述】:

我想构建一个 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

谁能帮我解决这个问题。提前致谢!

【问题讨论】:

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


    【解决方案1】:

    答案取决于您如何处理spark-submit。您必须“说服”(又名修改)spark-submit 才能看到修改后的 jar(不是 SPARK_HOME 中的那个)。

    最快(从长远来看不一定是最简单的)方法是将 Spark jar 包括您修改过的那个包含在您的 uberjar(又名 fat jar)中。您似乎在您的 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 与开发过程保持分离。使用内部库存储库来发布和依赖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 2011-07-31
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多