用最新的版本,蹦最野的迪~~~IDE寫大數據程序避坑指南

文章更新於: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

一、下載安裝配置IDE

1.1、下載(scala-SDK-4.7.0)

推薦去官網 http://scala-ide.org/download/sdk.html 下載。
下載IDE

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
  1. 調用啓動命令以後,會出現如下啓動界面

安裝eclipse

  1. 設置工作目錄

設定工作目錄

  1. eclipse工作界面

工作界面

1.3、配置(創建桌面快捷方式)

如果你說,每次啓動還要輸入命令,終端還不能關掉,關掉終端程序也關掉了,太麻煩了。

  1. 不要慌,咱給它弄個快捷方式先~
# 通俗的來說,這兩行代碼的作用就是發送快捷方式到桌面
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 安裝路徑,你需要換成你的。

  1. 完成以上步驟以後你的桌面應該就有了 eclipse 的圖標,雙擊即可運行:

雙擊運行

注:圖標帶鎖是因爲 eclipse 的文件夾所有者不是當前用戶,你可以使用 sudo chown -R 用戶名:用戶組 /usr/local/eclipse 以後再創建快捷方式,就也不會有這個鎖了。

  1. 如果你雙擊以後是這樣的:

雙擊不能運行

這就說明你的 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 老家執行此命令也沒有問題~

在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

  1. scala 目錄上右鍵,new,選擇其他

右鍵

  1. 在彈出來的窗口中,選擇 scala Object ,然後 next

選擇

  1. 輸入程序名 WordCount ,點擊 Finish

輸入文件名

  1. 然後你就可以在左邊的目錄結構中看到 WordCount.scala

創建文件

  1. 寫入程序內容

將以下內容粘貼到程序

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.1、在程序上右鍵,選擇 Run As ,然後選擇 Run Configurations...

Run as
1.2. 然後給它加上參數再運行:

# 報錯是 at least 471859200, 我給你481859200,多給你一千萬~
-Dspark.testing.memory=481859200

加上參數
或者:
在程序下面加上一行

conf.set("spark.testing.memory","481859200")

  1. 文件不存在錯誤

文件不存在


  1. NoClassDefFoundError 或者 找不到主類

NoClassDefFoundError

這個可能是你的 scalaLibrarycontainer 沒選對,但不一定,如果是請按以下方法解決:

3.1 檢查你IDE裏面顯示的版本是否與你實際的相符。
如果不符,右鍵,選擇 Properties

檢查版本
3.2 在彈出來的窗口中,選擇合適的,點擊右下角確定(Apply and Close),然後在重新運行程序即可。

改變版本或者
在項目名上右鍵,選擇scala編譯器版本,然後更改。
在這裏插入圖片描述注意
有的時候可能更改之後,左側版本號並不更新,而且程序依然無法運行。
這時可以重啓 eclipse 重新更改。

如果有時改過了。依然報這個錯誤,
可以改成其他版本號運行一下,再重新改回來。


四、Enjoy!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章