1. 程式人生 > >部署jar到spark上執行

部署jar到spark上執行

初次接觸spark,還沒有入門,能夠成功將jar部署到spark平臺上並且執行,必須感謝博主Fang20160214

1.環境及工具

系統:ubuntu14.04
spark:2.1.0 (單機環境)
scala: 2.12.1
開發工具:IntelliJ IDEA Community
構建工具:sbt
新增SDK
File——Project Structure——SDKs,然後”+“選擇”JDK”
構建jar包
File——Project Structure——Artifacts,然後有個“+”,設定好了之後點選“OK”;
選單欄上面Build——Build Artifacts…,然後可以選擇Build,ReBuild,Clean,Edit
如果intellij下載的是沒帶jdk的版本,同樣的類似步驟在SDKs中新增,可以配置jdk。

然後就可以將生成的jar部署到spark環境中執行啦,命令:
首先進入到spark安裝目錄下,然後執行

./bin/spark-submit --name "nlp run on spark" --master spark://localhost:8080 --executor-memory 2G --class com.sjtu.spark.testNLP /home/username/Documents/spark-nlp.jar /home/username/Documents/spark-nlp/out/ /home/username/Documents/spark-nlp/out/output

2.遇到的問題及解決辦法

(1)必須新增SDK,否則intellij將不會對scala檔案進行編譯,產生的jar部署到spark環境中,執行時候將會報錯:找不到將要執行的類(的確這樣,都沒有編譯產生,就肯定找不到)
(2)scala版本問題
報錯:
Exception in thread “main” java.lang.NoSuchMethodError: scala.reflect.api.JavaUniverse.runtimeMirror(Ljava/lang/ClassLoader;)Lscala/reflect/api/JavaMirrors$JavaMirror;
[這一步驟是錯誤的,不用這樣做,只需要在build.sbt中對scalaVersion進行設定]嘗試在libraries中添加了一個scala-reflect.jar,於是從scala2.12.1的lib目錄下找到了,新增到工程的libraries中,依然報錯。
後來發現應該是spark2.1.0所需要的scala版本與系統安裝的scala版本2.12.1可能不對應,於是將scala2.12.1安裝目錄下的jar全部新增到工程的libraries中,還是不對,報錯:
java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: scala/runtime/SymbolLiteral
最終參照網頁

http://www.scala-sbt.org/0.12.4/docs/Howto/scala.html
設定scala的版本,在sbt.build檔案中新增scalaVersion := "2.11.8"
這時候,intellij會自動下載2.11.8的scala的相關檔案。最後,將jar部署到spark中,執行正常。
這裡寫圖片描述
sbt或者maven,都是類似的,注意scala的版本即可。涉及到的jar也就是這幾個:
這裡寫圖片描述
備註:另外的設定

sparkVersion := "2.1.0"

(3)新增依賴的jar包
命令中還需要新增–jars **.jar

./bin/spark-submit --name "nlp run on spark" --master spark://localhost:8080 --jars /home/username/Documents/stanford-english-corenlp-models-current.jar --executor-memory 2G --class com.sjtu.spark.testNLP /home/username/Documents/spark-nlp.jar /home/username/Documents/spark-nlp/out/ /home/username/Documents/spark-nlp/out/output

如果有多個jar,jar之間用逗號分隔。或者使用其他辦法:對spark.executor.extraClassPath進行設值;或者sbt-assembly的方式。[參考網頁3]