文章更新于:2020-04-05
注:本次实验使用的操作系统及各个程序版本号
类别 | 版本号 | 说明 |
---|---|---|
操作系统 |
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、运行程序你可能会遇到的问题
- 内存不够用的问题
你看,都说了是内存不够用。
买,买16G的,
两个够不够?
够,内存真好~~
吼吼哈哈…
解决办法:
1.1、在程序上右键,选择 Run As
,然后选择 Run Configurations...
1.2. 然后给它加上参数再运行:
# 报错是 at least 471859200, 我给你481859200,多给你一千万~
-Dspark.testing.memory=481859200
- 文件不存在错误
- NoClassDefFoundError:
这个可能是你的 scalaLibrarycontainer
没选对,但不一定,如果是请按以下方法解决:
3.1 检查你IDE里面显示的版本是否与你实际的相符。
如果不符,右键,选择 Properties
3.2 在弹出来的窗口中,选择合适的,点击右下角确定(Apply and Close
),然后在重新运行程序即可。