文章更新於:2020-05-06
注:本次實驗使用的操作系統及各個程序版本號
類別 | 版本號 | 說明 |
---|---|---|
操作系統 |
Ubuntu 16.04.6 LTS |
代號 xenial |
jdk |
java version 1.8.0_241 |
|
spark |
spark version 2.4.5 |
|
scala |
Scala version 2.11.12 |
spark 自帶 |
sbt |
sbtVersion 1.3.8 |
|
scala-SDK |
scala-SDK-4.7.0 |
Scala IDE for eclipse |
使用Eclipse編寫Spark應用程序
一、下載安裝配置IDE
1.1、下載(scala-SDK-4.7.0)
推薦去官網 http://scala-ide.org/download/sdk.html 下載。
1.2、安裝
# 解壓安裝包到 /usr/local
sudo tar -zxvf scala-SDK-4.7.0-vfinal-2.12-linux.gtk.x86_64.tar.gz -C /usr/local/ | tail -n 10
# 然後就可以調用命令啓動了
/usr/local/eclipse/eclipse
# 可以在 ~/.bashrc 文件中配置一下環境命令,這樣在任何位置都可以直接輸入 eclipse 啓動
export PATH=/usr/local/eclipse:$PATH
- 調用啓動命令以後,會出現如下啓動界面
- 設置工作目錄
- eclipse工作界面
1.3、配置(創建桌面快捷方式)
如果你說,每次啓動還要輸入命令,終端還不能關掉,關掉終端程序也關掉了,太麻煩了。
- 不要慌,咱給它弄個快捷方式先~
# 通俗的來說,這兩行代碼的作用就是發送快捷方式到桌面
ln -s /usr/local/eclipse/eclipse ~/Desktop/
sudo ln -s /usr/local/jdk1.8/jre/ /usr/local/eclipse/
注1:上述第二行代碼的意思是將 eclipse
需要的 jre
創建一個符號鏈接放在它的啓動目錄下,防止它找不到。
注2:上述第二行代碼的 /usr/local/jdk1.8
是我 Ubuntu 的 jdk
安裝路徑,你需要換成你的。
- 完成以上步驟以後你的桌面應該就有了
eclipse
的圖標,雙擊即可運行:
注:圖標帶鎖是因爲 eclipse
的文件夾所有者不是當前用戶,你可以使用 sudo chown -R 用戶名:用戶組 /usr/local/eclipse
以後再創建快捷方式,就也不會有這個鎖了。
- 如果你雙擊以後是這樣的:
這就說明你的 jre
符號鏈接沒有創建成功,或者你的 java
環境壓根沒配置好。
此時你需要檢查你的 java
環境,以及你爲 eclipse
創建的 jre
符號鏈接是否正常可用。
二、安裝 Eclipse-sbt 插件
2.1、局部安裝
什麼是拒不安裝? 哦哦,不好意思,是`局部安裝`。
說唄了,局部安裝就是爲你寫的一個程序安裝,而不是同時爲所有程序安裝。
你安裝以後,只對當前項目目錄下的程序起作用。
那有的人就該說了,我是不是腦子有坑,我這樣安。
未必哈,不同的安裝方式適用於不同的場景。
好,進入正題: 如果是局部安裝,你需要在你項目目錄文件夾下創建一個 `plugins.sbt` 文件,並在裏面寫入:
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")
該語句表示安裝sbteclipse插件,版本爲4.0.0。等後續運行/usr/local/sbt/sbt eclipse命令時會自動安裝插件
當然,具體版本是多少是要根據你的各個程序的版本確定的。
具體參見林子雨教授博客:使用Eclipse編寫Spark應用程序
2.2、全局安裝
全局安裝方便多了嘛。
其實安裝方法也類似,就是寫好配置文件,讓其運行的時候自動去下載安裝。
只不過這次的配置文件寫在了全局範圍內。
那哪個地方是全局範圍?
來,對面的女孩往下看
# 這個文件是sbt的全局配置文件
~/.sbt
# 那麼我們需要在這裏,建立我們需要的插件的存放目錄
# 如果你的sbt之前已經使用過,你會發現在這個目錄下已經有文件
# 比如我的 sbt 版本是 1.3.8 ,它就有一個 ~/.sbt/1.0 的文件夾
# 如果你的 sbt 版本是 0.13.xx ,它可能就有一個 ~/.sbt/0.13 的文件夾
# 這裏以我的版本做演示,在 1.0 目錄下創建一個 plugins 文件夾
mkdir -p ~/.sbt/1.0/plugins
# 然後在 plugins 文件夾裏面創建一個 build.sbt 文件
vim ~/.sbt/1.0/plugins/build.sbt
# 接着在裏面寫入:
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")
# 最後,就可以使用 `/usr/local/sbt/sbt` 也就是 `sbt` 命令安裝插件
然後,就…
2.2.1、請選擇正確的版本號
嘖嘖嘖,滿屏 ERROR
,看輸出:
[info] Loading settings for project global-plugins from build.sbt ...
[info] Loading global plugins from /home/bigdata/.sbt/1.0/plugins
[warn]
[warn] Note: Some unresolved dependencies have extra attributes. Check that these dependencies exist with the requested attributes.
[warn] com.typesafe.sbteclipse:sbteclipse-plugin:4.0.0 (sbtVersion=1.0, scalaVersion=2.12)
[warn]
[warn] Note: Unresolved dependencies path:
[error] sbt.librarymanagement.ResolveException: Error downloading com.typesafe.sbteclipse:sbteclipse-plugin;sbtVersion=1.0;scalaVersion=2.12:4.0.0
[error] Not found
[error] Not found
[error] not found: https://repo1.maven.org/maven2/com/typesafe/sbteclipse/sbteclipse-plugin_2.12_1.0/4.0.0/sbteclipse-plugin-4.0.0.pom
[error] not found: https://maven.aliyun.com/repository/public/com/typesafe/sbteclipse/sbteclipse-plugin_2.12_1.0/4.0.0/sbteclipse-plugin-4.0.0.pom
[error] not found: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/com.typesafe.sbteclipse/sbteclipse-plugin/scala_2.12/sbt_1.0/4.0.0/ivys/ivy.xml
[error] not found: https://repo.typesafe.com/typesafe/ivy-releases/com.typesafe.sbteclipse/sbteclipse-plugin/scala_2.12/sbt_1.0/4.0.0/ivys/ivy.xml
[error] at lmcoursier.CoursierDependencyResolution.unresolvedWarningOrThrow(CoursierDependencyResolution.scala:246)
[error] at lmcoursier.CoursierDependencyResolution.$anonfun$update$34(CoursierDependencyResolution.scala:215)
[error] at scala.util.Either$LeftProjection.map(Either.scala:573)
[error] at lmcoursier.CoursierDependencyResolution.update(CoursierDependencyResolution.scala:215)
[error] at sbt.librarymanagement.DependencyResolution.update(DependencyResolution.scala:60)
[error] at sbt.internal.LibraryManagement$.resolve$1(LibraryManagement.scala:52)
[error] at sbt.internal.LibraryManagement$.$anonfun$cachedUpdate$12(LibraryManagement.scala:102)
[error] at sbt.util.Tracked$.$anonfun$lastOutput$1(Tracked.scala:69)
[error] at sbt.internal.LibraryManagement$.$anonfun$cachedUpdate$20(LibraryManagement.scala:115)
[error] at scala.util.control.Exception$Catch.apply(Exception.scala:228)
[error] at sbt.internal.LibraryManagement$.$anonfun$cachedUpdate$11(LibraryManagement.scala:115)
[error] at sbt.internal.LibraryManagement$.$anonfun$cachedUpdate$11$adapted(LibraryManagement.scala:96)
[error] at sbt.util.Tracked$.$anonfun$inputChanged$1(Tracked.scala:150)
[error] at sbt.internal.LibraryManagement$.cachedUpdate(LibraryManagement.scala:129)
[error] at sbt.Classpaths$.$anonfun$updateTask0$5(Defaults.scala:2947)
[error] at scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62)
[error] at sbt.std.Transform$$anon$4.work(Transform.scala:67)
[error] at sbt.Execute.$anonfun$submit$2(Execute.scala:281)
[error] at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:19)
[error] at sbt.Execute.work(Execute.scala:290)
[error] at sbt.Execute.$anonfun$submit$1(Execute.scala:281)
[error] at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[error] at sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error] at java.lang.Thread.run(Thread.java:748)
[error] (update) sbt.librarymanagement.ResolveException: Error downloading com.typesafe.sbteclipse:sbteclipse-plugin;sbtVersion=1.0;scalaVersion=2.12:4.0.0
[error] Not found
[error] Not found
[error] not found: https://repo1.maven.org/maven2/com/typesafe/sbteclipse/sbteclipse-plugin_2.12_1.0/4.0.0/sbteclipse-plugin-4.0.0.pom
[error] not found: https://maven.aliyun.com/repository/public/com/typesafe/sbteclipse/sbteclipse-plugin_2.12_1.0/4.0.0/sbteclipse-plugin-4.0.0.pom
[error] not found: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/com.typesafe.sbteclipse/sbteclipse-plugin/scala_2.12/sbt_1.0/4.0.0/ivys/ivy.xml
[error] not found: https://repo.typesafe.com/typesafe/ivy-releases/com.typesafe.sbteclipse/sbteclipse-plugin/scala_2.12/sbt_1.0/4.0.0/ivys/ivy.xml
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? q
那麼,我總結了一下,上面說的是啥呢? 沒找到!
沒找到啥?
沒找到我們指定的文件!
那咋弄?
那就不指定那一個了唄~
問題所在:我們指定了插件版本爲 4.0.0
。可是,就怕可是…它沒找到啊!!
我們可以看一下上面報錯輸出,其中有一行(倒數第三行)是:
[error] not found: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/com.typesafe.sbteclipse/sbteclipse-plugin/scala_2.12/sbt_1.0/4.0.0/ivys/ivy.xml
然後我猜你的槍裏沒有子彈,不是,我猜這個地址裏沒有 4.0.0
來一起看看:
果然!你的槍裏沒有子彈~
插件腳本該說了,你扯什麼犢子,沒有還指定 4.0.0
笑臉.jpg
我改
我們在剛纔設置的腳本里面將 4.0.0
改爲 5.2.0
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "5.2.0")
爲什麼是 5.2.0
?
我看它比較有感覺行不行~
然後再次執行 sbt
命令,行不行我不知道,但是我已經等了好久好久好久了…
到底有多久你執行一下就知道了~
兄嘚,…
2.2.2、請選擇正確的目錄執行命令
這裏應該是個坑!!!!
當我在家目錄執行 sbt
的時候,它會出現刷屏信息。但是會卡在
Loading project definition from xxxx
然後就不動了,我以爲他是在後臺下載東西之類的,
可是當我等的時間不對勁的時候,我就不這麼認爲了。
元芳,你怎麼看?
當我在一個曾經用 sbt
打包過的項目目錄下執行此命令的時候,不會卡
都可順利執行:
當我在 /usr/local/sbt/
目錄也就是 sbt
老家執行此命令也沒有問題~
不要做無畏/無味的等待,選一個正確的目錄執行命令吧!
三、創建eclipse應用程序
3.1、創建項目目錄樹
# ~/workspace/wordcount/ 目錄下應該有以下結構
./src/main/scala/
./project/build.properties
./build.sbt
# 其中 ./project/build.properties 文件的內容如下:
sbt.version=1.3.8
# 其中 ./build.sbt 文件的內容如下:
name := "Simple Project"
version := "1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.5"
我創建這些目錄結構時執行的命令如下圖:
然後,在 wordcount
目錄下執行 sbt eclipse
命令創建eclipse應用程序:
那個啥,這個。。。
失敗了。。
刷屏信息卡住不動 ~ ~
努力解決問題中。。。
這個版本可能不適合,
有可能是版本太新了,可能。
元芳,你怎麼看??
ok,續更
問題已經解決~~
3.2、遇到的問題
說實話中間嘗試的操作比較多,
我也不確定到底是那個或哪幾個操作起了作用,
主要操作列舉如下:
1、我把上面提到的那個 4.0.0
的版本改成了 5.2.4
你若問我爲什麼?
我會告訴你因爲 5.2.4
是最高的版本,我想蹦最野的迪!
2、重新配置了鏡像地址:
[repositories]
local
repo:https://maven.aliyun.com/repository/public
huaweicloud-ivy: https://mirrors.huaweicloud.com/repository/ivy/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
huaweicloud-maven: https://mirrors.huaweicloud.com/repository/maven/
之前也嘗試了網上一些其他亂七八糟的鏡像,後來吧…
嗯,確實亂七八糟,
倒不如只使用阿里和華爲的鏡像。
3、刪除緩存,重新加載 sbt
刪除了 ~/.sbt
、~/.ivy2
,以及項目目錄下打包命令產生的所有文件。
然後執行 sbt sbtVersion
重新加載 sbt
。
4、重新執行 sbt eclipse
命令。
執行結果如下圖:
3.3、打開 eclipse,導入程序
這裏不禁要說一下,你說你這個命令標題欄設計這麼隱蔽幹啥。。讓我一番好找。在程序最上方的黑色條框,鼠標劃過是會顯示命令欄的!!!
選中,然後下一步:
點擊瀏覽,選擇 wordcount
文件夾:
然後點擊 finish
即可。
3.4、創建 WordCount.scala
- 在
scala
目錄上右鍵,new,選擇其他
- 在彈出來的窗口中,選擇
scala Object
,然後next
- 輸入程序名
WordCount
,點擊Finish
- 然後你就可以在左邊的目錄結構中看到
WordCount.scala
了
- 寫入程序內容
將以下內容粘貼到程序
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
object WordCount {
def main(args: Array[String]) {
val inputFile = "file:///usr/local/spark/README.md"
val conf = new SparkConf().setAppName("WordCount").setMaster("local[2]")
val sc = new SparkContext(conf)
val textFile = sc.textFile(inputFile)
val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)
wordCount.foreach(println)
}
}
3.5、運行程序
在程序上右鍵,Run As
,選擇 Scala Application
即可。
3.6、查看程序運行結果
在軟件下方控制檯 Console
裏面可以查看程序運行結果:
3.7、運行程序你可能會遇到的問題
- 內存不夠用的問題
解決辦法:
加內存,或者
1.1、在程序上右鍵,選擇 Run As
,然後選擇 Run Configurations...
1.2. 然後給它加上參數再運行:
# 報錯是 at least 471859200, 我給你481859200,多給你一千萬~
-Dspark.testing.memory=481859200
或者:
在程序下面加上一行
conf.set("spark.testing.memory","481859200")
- 文件不存在錯誤
NoClassDefFoundError
或者找不到主類
這個可能是你的 scalaLibrarycontainer
沒選對,但不一定,如果是請按以下方法解決:
3.1 檢查你IDE裏面顯示的版本是否與你實際的相符。
如果不符,右鍵,選擇 Properties
3.2 在彈出來的窗口中,選擇合適的,點擊右下角確定(Apply and Close
),然後在重新運行程序即可。
或者
在項目名上右鍵,選擇scala編譯器版本,然後更改。
注意
有的時候可能更改之後,左側版本號並不更新,而且程序依然無法運行。
這時可以重啓 eclipse 重新更改。
如果有時改過了。依然報這個錯誤,
可以改成其他版本號運行一下,再重新改回來。