之所以写这个博客,是因为用idea搭建spark开发环境实在是耗了我太多精力了,真的是神烦。首先强调一下我的版本,idea 2019.1.3(别问为什么,问就是强力破解),scala 2.13.1,sbt 1.3.3, spark 2.4.4,Hadoop 2.8.1,java 8。那些什么个下载啊环境配置啊这些我就不说了,说些我费了好大劲都找不到的内容。
1.sbt不能下载包
根据网上说的,应该是默认的下载地址被墙,总之就是下不了。大家也很贴心地复制粘贴了解决方法。反正就是在sbt/bin/路径下的sbt-launch.jar内的/sbt/sbt.boot.properties中修改为国内镜像源。不过我觉得大家也很贴心地告诉你只需要添加repositories下的一些配置就好(呵呵),这里我将整个文件的内容贴出来,只要无脑Ctrl C就好
[scala]
version: ${sbt.scala.version-auto}
[app]
org: ${sbt.organization-org.scala-sbt}
name: sbt
version: ${sbt.version-read(sbt.version)[1.3.3]}
class: ${sbt.main.class-sbt.xMain}
components: xsbti,extra
cross-versioned: ${sbt.cross.versioned-false}
resources: ${sbt.extraClasspath-}
[repositories]
local
local-preloaded-ivy: file:///${sbt.preloaded-${sbt.global.base-${user.home}/.sbt}/preloaded/}, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]
local-preloaded: file:///${sbt.preloaded-${sbt.global.base-${user.home}/.sbt}/preloaded/}
maven-central
sbt-maven-releases: http://repo.scala-sbt.org/scalasbt/maven-releases/, bootOnly
sbt-maven-snapshots: http://repo.scala-sbt.org/scalasbt/maven-snapshots/, bootOnly
typesafe-ivy-releases: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
sbt-ivy-snapshots: http://repo.scala-sbt.org/scalasbt/ivy-snapshots/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
[boot]
directory: ${sbt.boot.directory-${sbt.global.base-${user.home}/.sbt}/boot/}
lock: ${sbt.boot.lock-true}
[ivy]
ivy-home: ${sbt.ivy.home-${user.home}/.ivy2/}
checksums: ${sbt.checksums-sha1,md5}
override-build-repos: ${sbt.override.build.repos-false}
repository-config: ${sbt.repository.config-${sbt.global.base-${user.home}/.sbt}/repositories}
可以看到我这里用的是阿里云的镜像,如果大家细心的话会发现,很多其他人用的是OSChina的镜像源,这里我不得不说一句了,麻烦大家在引用之前先看看人家的镜像是不是存活的,反正开源中国的镜像源已经死了,大家别再引用了。
然后就是将解压出来的文件打包成jar包,有很多压缩软件都不支持打成jar包,所以分享一条命令行,只要在待压缩的文件夹的父目录下用cmd运行即可。
jar cvfm sbt-launch.jar sbt-launch\META-INF\MANIFEST.MF -C sbt-launch/ .
2.在build.sbt中添加依赖后sbt表示找不到文件
正常情况下,sbt生成的build.sbt应该有一些基础的东西,比如项目名称、项目版本号、scala版本号。如果你要添加依赖,一般就是添加一个libraryDependencies语句,但是你会发现sbt下载的文件和你预想的文件有点不一样,特别是spark的依赖。如果你仔细对比sbt.boot.properties的配置和libraryDependencies下载的URL你就会发现,libraryDependencies下载的URL是根据typesafe-ivy-releases来拼接然后去下载的。这就有问题了,spark的依赖上面可没有依赖的scala的版本号,于是sbt就会表示我下不来。目前我的解决方法是将scala版本号改成所需spark的版本号,虽然好像会有未知的风险,但目前就先这样吧
对了需要强调一下,我现在创建sbt项目不知道为什么不会给我添加Scala的SDK,这时候需要手动添加SDK,不然的话sbt还是不能下载这些依赖
3.provided的坑
当你完成这些事情之后,你的项目终于可以愉快添加依赖了,这时候你就会迫不及待地跑一下Scala项目,然后你有可能发现,普通的Scala程序能跑,可是为什么我import进来的Spark的API用不了,一个ClassNotFound呼你脸上,明明我用idea可以找到对应的文件吖。
这时候你需要看看,你添加的依赖最后面有没有添加provided字段,如果有,恭喜你,你会深刻明白什么是编译时不添加该包。其实这个字段和Maven中是一样的,同样是告诉sbt在编译时不要编译这个jar包的内容。这是去掉就好去掉就好。
总结
将环境搭建好了就可以好好地开始学习如何使用spark了