Spark快速大数据分析——Spark安装(贰)
软件环境:
- Hadoop-3.3.2
- Spark-3.1.3/Spark-3.2.1(sbt pull)
- JDK 11
- Scala 2.13.8/SCala 2.12(搭配Spark3.1.3使用)
环境搭建:
首先下载Spark:Spark下载地址 推荐Spark 3.1.3作为Spark-shell应用稳定。Spark3.2.1的bug,详情点击此处。 如果你下载真的很慢也没有魔法下载,可以使用:配套环境下载( 记得给个star!) 点击下载Spark,如果你网速慢也该可以通过我的gitee来下载。 gitee地址:配套环境下载 下载后直接解压到自己的新建的目录即可:
然后添加系统环境变量(直接再path里面添加哦):
spark的运行需要Hadoop的支持,所以还需要下载Hadoop来支持运行:
Hadoop下载地址
也是压缩包需要注意的是解压需要提供管理员权限。
解压完后添加环境变量和系统变量。
新建一个系统变量:
到这里还没有完,如果你是win环境下开发打开命令行输入代码测试:
spark-shell
可能会遇到报错:
C:\spark-3.2.0-bin-hadoop3.2\bin>spark-shell
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
21/11/11 00:14:24 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
21/11/11 00:14:26 ERROR SparkContext: Error initializing SparkContext.
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.apache.spark.executor.Executor.addReplClassLoaderIfNeeded(Executor.scala:909)
at org.apache.spark.executor.Executor.<init>(Executor.scala:160)
at org.apache.spark.scheduler.local.LocalEndpoint.<init>(LocalSchedulerBackend.scala:64)
at org.apache.spark.scheduler.local.LocalSchedulerBackend.start(LocalSchedulerBackend.scala:132)
at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:220)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:581)
at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2690)
at org.apache.spark.sql.SparkSession$Builder.$anonfun$getOrCreate$2(SparkSession.scala:949)
at scala.Option.getOrElse(Option.scala:189)
at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:943)
at org.apache.spark.repl.Main$.createSparkSession(Main.scala:106)
at $line3.$read$$iw$$iw.<init>(<console>:15)
at $line3.$read$$iw.<init>(<console>:42)
at $line3.$read.<init>(<console>:44)
at $line3.$read$.<init>(<console>:48)
at $line3.$read$.<clinit>(<console>)
at $line3.$eval$.$print$lzycompute(<console>:7)
at $line3.$eval$.$print(<console>:6)
at $line3.$eval.$print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
但没关系,我帮你踩坑了~
只需要按照对应版本进行下载win的开发工具下载地址: 然后替换bin目录下的内容即可:配套环境下载
在任意地方打开cmd:
输入 spark-shell 。等待一会: 你可以看到下边有一行报错不过这个没问题,因为shell设计时是为了Linux,此时没办法再winshell李敏计算窗体大小,不影响使用可以看看原作者的回复:
引用一个库看一看:
如果正常恭喜你完成了80%,这些都是基于命令行的,可是我们要基于IDEA要怎么开发呢?
首先idea支持的构建方式首选的是SBT,如果你没有安装sbt可以参考上一篇文章:SBT安装。
注意!!也可以通过IDEA下载,这里选择NEXT就行啦!
打开IDEA新建一个项目:
系统会自动检测你的安装的SBT和SCALA 这里我已经提前 安装了2.13.8 推荐安装一个早期版本(2.12)能和Spark适配。 Spark 3.2.1 才和 Scala 2.13.8完美适配 这里没关系IDEA可以很方便切换版本不用担心。
在创建完成后在build.sbt中添加如下代码:
libraryDependencies += "org.apache.spark" % "spark-core_2.12" % "3.1.3"
如果你在MVN找到的sbt依赖添加代码是这样的:
libraryDependencies += "org.apache.spark" %% "spark-core" % "3.1.3"
或者是这样的:
libraryDependencies += "org.apache.spark" % "spark-core" % "3.1.3"
有可能会报错:
这个就是Scala版本无法和选择Spark所匹配造成的。没关系更改一下版本就可以:
libraryDependencies += "org.apache.spark" %% "spark-core" % "3.2.1"
如果更改版本还没办法的话可以指定一下版本:
libraryDependencies += "org.apache.spark" % "spark-core_2.12" % "3.1.3"
但是你如过不太清楚构建spark的scala和你本地的scala是否匹配的话建议还是用“%%”来自动匹配版本:
否则就会报错:
Exception in thread "main" java.lang.NoSuchMethodError: 'void scala.util.matching.Regex.<init>(java.lang.String, scala.collection.Seq)'
at scala.collection.immutable.StringLike.r(StringLike.scala:284)
at scala.collection.immutable.StringLike.r$(StringLike.scala:284)
at scala.collection.immutable.StringOps.r(StringOps.scala:33)
at scala.collection.immutable.StringLike.r(StringLike.scala:273)
at scala.collection.immutable.StringLike.r$(StringLike.scala:273)
at scala.collection.immutable.StringOps.r(StringOps.scala:33)
at org.apache.spark.util.Utils$.<init>(Utils.scala:105)
at org.apache.spark.util.Utils$.<clinit>(Utils.scala)
at org.apache.spark.SparkConf.loadFromSystemProperties(SparkConf.scala:75)
at org.apache.spark.SparkConf.<init>(SparkConf.scala:70)
at org.apache.spark.SparkConf.<init>(SparkConf.scala:59)
at com.demo.test$.main(test.scala:8)
at com.demo.test.main(test.scala)
这里给一段测试代码,如果报错了你就要更换spark版本:
package com.demo
import org.apache.spark.{SparkConf, SparkContext}
object test
{
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("HelloWorld")
val sc = new SparkContext(conf)
val helloWorld = sc.parallelize(List("Hello,World!","Hello,Spark!","Hello,BigData!"))
helloWorld.foreach(line => println(line))
}
}
如果没问题,环境就搭建好了!
但是你会有个疑问:
为什么我都本地下载了Spark,还需要下载托管的Spark?
这是我刚开始的疑问,SBT不能同时管理本地的jar包吗?必须重新下载后才能管理本地内容吗?
通过SBT手动添加JAR包是可以的,但是有点复杂 而且需要添加多个才能使用,所以这里推荐另一个模式来构建项目:
我们来利用IDEA本身的管理来构建Scala项目,在创建栏选择IDEA:
后面都是一样的,这里主要讲解一下如何导入本地Spark实现项目构建:
选择对应选项卡:
在Golobal Libraries用+添加Spark:
选择java选项:
找到自己Spark安装的:
点击OK:
如果出现Problems点击一下Fix,选择添加到依赖修复即可:
在外部库中可以看见jars,并且可以引用Spark:
|