使用Scala语言编写的Spark程序,需要使用sbt进行编译打包。Spark中没有自带sbt,需要单独安装。可以到“http://www.scala-sbt.org”下载sbt安装文件sbt-1.3.8.tgz。
当前(2020年2月26日)笔者在写这篇文章的时候,sbt最新版是1.3.8版本。
一、SBT安装方法
假设下载后的安装包sbt-1.3.8.tgz保存在了“~/Downloads”目录下。
这里我们把sbt安装到“/usr/local/sbt”目录下,请使用hadoop用户登录Linux系统,新建一个终端,在终端中执行如下命令:
sudo mkdir /usr/local/sbt # 创建安装目录
cd ~/Downloads
sudo tar -zxvf ./sbt-1.3.8.tgz -C /usr/local
cd /usr/local/sbt
sudo chown -R hadoop /usr/local/sbt # 此处的hadoop为系统当前用户名
cp ./bin/sbt-launch.jar ./ #把bin目录下的sbt-launch.jar复制到sbt安装目录下
接着在安装目录中使用下面命令创建一个Shell脚本文件,用于启动sbt:
vim /usr/local/sbt/sbt
该脚本文件中的代码如下:
#!/bin/bash
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
保存后,还需要为该Shell脚本文件增加可执行权限:
chmod u+x /usr/local/sbt/sbt
然后,可以使用如下命令查看sbt版本信息:
cd /usr/local/sbt
./sbt sbtVersion
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
[warn] No sbt.version set in project/build.properties, base directory: /usr/local/sbt
[info] Set current project to sbt (in build file:/usr/local/sbt/)
[info] 1.3.8
如果能够返回上述信息,就说明安装成功了。但是,这个过程会很漫长,甚至很坎坷,会花很长时间(为了减少时间,可以看下面的第二部分内容:如何更换仓库地址)。
但是,只要安装成功,第2次开始运行“./sbt sbtVersion”和编译打包命令,速度就比较快了。
二、如何更换仓库地址,加快编译速度
(备注:下面的方法,有很多人都成功了,但是,也有人无法成功,但是,仍然建议尝试一下下面的方法)
默认情况下,sbt使用的是国外的仓库地址,打包编译的时候非常慢。为了加快打包编译速度,可以更换仓库地址。
首先,执行如下命令:
cd ~
mkdir .sbt #如果该目录已经存在,就不用创建了
cd .sbt
vim repositories #使用vim编辑器创建repositories文件
然后,在文件repositories中输入如下内容:
[repositories]
local
huaweicloud-maven: https://repo.huaweicloud.com/repository/maven/
maven-central: https://repo1.maven.org/maven2/
sbt-plugin-repo: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
保存该文件。
然后,修改SBT配置文件。打开/usr/local/sbt/conf/sbtopts 文件,在末尾新增一行,内容如下:
-Dsbt.override.build.repos=true
通过上述设置以后,再去运行sbt编译打包,就会快很多。
三、安装过程体会(困扰1个月的故事)
也就是说,如果安装过程顺利,执行“./sbt sbtVersion”这个命令以后,应该可以看到上述的版本信息”1.3.8”。但是,问题恰恰在于,执行“./sbt sbtVersion”这个命令以后,屏幕会长时间停止在如下状态:
$ ./sbt sbtVersion
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
[info] [launcher] getting org.scala-sbt sbt 1.3.8 (this may take some time)...
显示上述信息以后,屏幕就会一动不动。原因是,这个时候SBT需要连接国外网站,下载相关文件,但是,下载速度非常慢,老半天没有任何进展,所以,就一直停止不动。笔者就去百度搜索如何加快这个进程,不要这么慢。网络上介绍了很多更换软件源(仓库地址)的方法(包括上面第二部分内容我们介绍的更换仓库地址的方法,也可能不行),比如使用阿里云的软件源,我就按照网络文章去修改相关配置文件,可是,尝试了很多次以后,依然没有任何反应,还是会显示“(this may take some time......”,然后就停止不动了。
这个问题困扰了我很久,从大年初一(2020年1月25日,新冠肺炎疫情暴发)开始,我就安装失败,此后多次尝试,都以失败告终。
然后,我开始怀疑是否是我电脑的问题。我自己在阿里云购买了一台云端的服务器,安装了Ubuntu14.04,我就跑到阿里云服务器里面去安装sbt1.3.8版本,然后运行“./sbt sbtVersion”命令,居然等几分钟以后就开始显示滚动的下载进度信息了,然后,下载了1个多小时,安装成功了,成功地显示了版本信息。
这个时候,我就怀疑,是不是我的本地电脑系统的问题,我本地电脑是Ubuntu16.04,我就在大年初八初九这几天继续尝试运行“ ./sbt sbtVersion”命令,但是,依然很多分钟都没有任何进展,我只好放弃了。
到了2020年2月24日,我有些闲暇时间,决定再次去尝试。我又安装了一个新的Ubuntu16.04虚拟机,全部重新做实验,把sbt又重新安装了一次,而且,不修改任何配置,不修改软件源,就是使用默认的外国软件源。2月24日这天晚上7点多,我开始运行“ ./sbt sbtVersion”命令,然后一直等,奇迹出现了,在等待了10分钟左右时间,终于开始出现下载进度的滚动文字信息了,我就让它下载。1个小时过去了,2个小时过去了,3个小时过去了,一直在下载。我决定去睡觉,让它通宵下载。第2天早晨起来,我看了一下屏幕,居然还在下载,但是,没有任何进展,好像死机不动了的状态,我就果断暂停掉。然后,再次执行" ./sbt sbtVersion"命令,很快出现了下载进度滚动文字,几分钟以后,就成功了,显示了版本信息。大功告成了。
既然在这台新的虚拟机上可以安装成功,那么,在原来安装失败的虚拟机上,应该也可以安装成功,于是,我又回到原来安装失败那台虚拟机(也是Ubuntu16.04),把SBT删除了,重新安装了一遍,没有修改任何配置,直接运行“ ./sbt sbtVersion”命令。等了大约10分钟以后,屏幕上开始显示滚动文字信息,说明正在下载文件。但是,过了1个多小时,安装过程遇到错误,停止并退出了。我再次运行“ ./sbt sbtVersion”命令,还是马上报错,并停止退出。我就到网络上去调研问题原因,把错误信息拷贝到百度搜索引擎,找到了一些解决方案,但是,我尝试了以后,都无法解决我的问题。最后,看到一篇文章说,要删除“~/.sbt”和“~/.ivy2”和"~/.ivy"这些目录。我就把这些目录都删除了,然后,再次去运行“ ./sbt sbtVersion”,等了几分钟,终于出现下载进展滚动信息了,然后,等了半个多小时,终于显示版本信息了,安装成功了。
从2020年1月25日到2月25日,我断断续续,大概摸索了1个月,才把SBT弄成功了,心里无限感慨。