用最新的版本,蹦最野的迪~~~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!

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