0

我想構建一個Spark應用程序Jar。我的期望是:當我通過./spark-submit執行jar時,應用程序將利用我自己構建的mllib(例如:spark-mllib_2.11-2.2.0-SNAPSHOT.jar)。如何使用修改後的Spark MLlib模塊作爲依賴關係?

這是我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

任何人都可以幫助我解決這個問題。提前致謝!

回答

1

答案取決於你如何做​​。你必須「說服」(又名修改)​​才能看到修改的jar(不是SPARK_HOME中的那個)。

在你的uberjar(又名胖罐子)中,最快(不一定是最簡單的方法)就是將Spark罐子,包括你修改過的罐子。您似乎在您的sbt項目中使用sbt-assembly插件,因此它只是publishLocal依賴項(或將其放入lib目錄)並將其添加到項目中的libraryDependencies。其餘的將由assemble完成。

然而,這會給你一個非常巨大而且很胖的jar,雖然在大量的編譯,測試和部署的繁重的開發週期中,可能會使這個過程非常緩慢。

另一種方法是使用您的自定義Apache Spark(包含Spark MLlib的修改庫)。在您mvn install之後,您將擁有自定義的Spark即可使用。從定製版本使用​​,它應該工作。你不必將jar包括在你的fat jar中,也許你不需要使用sbt-assembly插件(只需要sbt package就可以工作)。

該方法具有使可部署的Spark應用程序包更小並且自定義Spark獨立於開發過程的好處。使用內部庫存儲庫來發布和依賴。