Spark从搭建到运行

本文最后更新于:8 个月前

记录在CentOS7虚拟机下,搭建Spark运行环境、安装Spark的过程。
以及介绍如何使用Spark Shell运行代码,如何编写Spark程序、并提交到Spark上运行

Spark从搭建到运行

一、Spark运行环境

二、安装Spark

在宿主机(Windows10)下,访问http://spark.apache.org/downloads.html,下载

image-20221203160635324

(Apache官网下载速度极慢,这里使用清华大学镜像源代替Index of /apache/spark/spark-3.3.1 (tsinghua.edu.cn)

image-20221203163030820

由于我们已经自己安装了Hadoop,所以选择下载*-without-hadoop.tgz包,它属于“Hadoop free”版,这样,下载到的Spark,可应用到任意Hadoop 版本。

Spark部署模式主要有四种:Local模式(单机模式)、Standalone模式(使用Spark自带的简单集群管理器)、YARN模式(使用YARN作为集群管理器)和Mesos模式(使用Mesos作为集群管理器)。
这里介绍Local模式(单机模式)的 Spark安装。

首先通过XFtp,将tgz包传输到虚拟机上。然后进行安装:

1
2
3
tar -zxf ~/spark-3.3.1-bin-without-hadoop.tgz -C /usr/local
cd /usr/local
mv ./spark-3.3.1-bin-without-hadoop ./spark

安装后,还需要修改Spark的配置文件spark-env.sh

1
2
3
4
5
6
cd /usr/local/spark
cp ./conf/spark-env.sh.template ./conf/spark-env.sh

vi ./conf/spark-env.sh
#在第一行添加以下配置信息
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)

有了上面的配置信息以后,Spark就可以把数据存储到Hadoop分布式文件系统HDFS中,也可以从HDFS中读取数据。如果没有配置上面信息,Spark就只能读写本地数据,无法读写HDFS数据。

配置完成后就可以直接使用,不需要像Hadoop运行启动命令。

1
2
3
4
5
6
7
#通过运行Spark自带的示例,验证Spark是否安装成功
cd /usr/local/spark
bin/run-example SparkPi

#执行时会输出非常多的运行信息,输出结果不容易找到,可以通过 grep 命令进行过滤
#2>&1 可以将所有的信息都输出到 stdout 中,否则由于输出日志的性质,还是会输出到屏幕中
./bin/run-example SparkPi 2>&1 | grep "Pi is"
image-20221203165357241

三、用Sprak Shell运行代码

学习Spark程序开发,建议首先通过spark-shell交互式学习,加深Spark程序开发的理解

Spark shell 提供了简单的方式来学习 API,并且提供了交互的方式来分析数据。你可以输入一条语句,Spark shell会立即执行语句并返回结果,这就是我们所说的REPL(Read-Eval-Print Loop,交互式解释器),为我们提供了交互式执行环境,表达式计算完成就会输出结果,而不必等到整个程序运行完毕,因此可即时查看中间结果,并对程序进行修改,这样可以在很大程度上提升开发效率。

Spark Shell 支持 Scala 和 Python,这里使用 Scala 来进行介绍。

前面已经安装了Hadoop和Spark,如果Spark不使用HDFS和YARN,那么就不用启动Hadoop也可以正常使用Spark。如果在使用Spark的过程中需要用到 HDFS,就要首先启动 Hadoop(启动命令见:Hadoop安装教程 - timegogo

这里假设不需要用到HDFS,因此,就没有启动Hadoop。现在我们直接开始使用Spark。

3.1、spark-shell命令

spark-shell命令及其常用的参数如下:

1
./bin/spark-shell --master <master-url>

<master-url>的可选项如下:

  • local 使用一个Worker线程本地化运行SPARK(完全不并行)
  • local[*] 使用逻辑CPU个数数量的线程来本地化运行Spark
  • local[K] 使用K个Worker线程本地化运行Spark(理想情况下,K应该根据运行机器的CPU核数设定)
  • spark://HOST:PORT 连接到指定的Spark standalone master。默认端口是7077.
  • yarn-client 以客户端模式连接YARN集群。集群的位置可以在HADOOP_CONF_DIR 环境变量中找到
  • yarn-cluster 以集群模式连接YARN集群

下面启动spark-shell环境

1
./bin/spark-shell

该命令省略了参数,这时,系统默认是“bin/spark-shell –master local[*]”

image-20221203203633387
1
scala>:quit		#推出spark-shell的命令是:quit

四、编写Spark程序

下面通过一个简单的应用程序 SimpleApp 来演示如何通过 Spark API 编写一个独立应用程序。使用 Scala 编写的程序需要使用 sbt 进行编译打包,相应的,Java 程序使用 Maven 编译打包,而 Python 程序通过 spark-submit 直接提交。

4.1、安装sbt

sbt(Simple Build Tool)是对Scala或Java语言进行编译的一个工具,类似于Maven或Ant,需要JDK1.8或更高版本的支持,并且可以在Windows和Linux两种环境下安装使用。

参照sbt - Download (scala-sbt.org)中的指引进行安装

image-20221203205054919

按照指引安装好后,输入命令查看sbt版本信息

1
sbt sbtVersion	#需要执行几分钟的时间
image-20221203210134830

4.2、编写Scala程序

创建一个文件夹 sparkapp 作为应用程序根目录

1
2
3
cd ~           # 进入用户主文件夹
mkdir ./sparkapp # 创建应用程序根目录
mkdir -p ./sparkapp/src/main/scala # 创建所需的文件夹结构

在 ./sparkapp/src/main/scala 下建立一个名为 SimpleApp.scala 的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
vi ./sparkapp/src/main/scala/SimpleApp.scala

#添加如下代码
/* SimpleApp.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object SimpleApp {
def main(args: Array[String]) {
val logFile = "file:///usr/local/spark/README.md" // Should be some file on your system
val conf = new SparkConf().setAppName("Simple Application")
val sc = new SparkContext(conf)
val logData = sc.textFile(logFile, 2).cache()
val numAs = logData.filter(line => line.contains("a")).count()
val numBs = logData.filter(line => line.contains("b")).count()
println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))
}
}

#以下注释部分,不用添加,解释代码含义
该程序计算 /usr/local/spark/README 文件中包含 "a" 的行数 和包含 "b" 的行数。代码第8行的 /usr/local/spark 为 Spark 的安装目录,如果不是该目录请自行修改。不同于 Spark shell,独立应用程序需要通过 `val sc = new SparkContext(conf)` 初始化 SparkContext,SparkContext 的参数 SparkConf 包含了应用程序的信息。

这种编写方式,只适合编写简单的程序,如果需要编写更复杂的逻辑,就需要使用到IDEA。

这里一并介绍IDEA如何进行远程开发,IDEA远程开发 - timegogo

4.3、使用sbt打包程序

请在./sparkapp 中新建文件 simple.sbt

1
2
3
4
5
6
7
8
9
10
11
vi ./sparkapp/simple.sbt

#添加内容如下,声明该独立应用程序的信息以及与 Spark 的依赖关系:
name := "Simple Project"
version := "1.0"
scalaVersion := "2.12.15"
libraryDependencies += "org.apache.spark" %% "spark-core" % "3.3.1"

#以下部分不用添加
#这里我们使用的Spark版本是3.3.1,对应的Scala版本是2.12.15
#在上面的配置信息中,scalaVersion用来指定scala的版本,sparkcore用来指定spark的版本,这两个版本信息都可以在之前的启动 Spark shell 的过程中,从屏幕的显示信息中找到
image-20221203203633387

接着,我们就可以通过如下代码将整个应用程序打包成 JAR(首次运行同样需要下载依赖包 ):

1
2
cd ./sparkapp
sbt package

对于刚安装好的Spark和sbt而言,第一次运行上面的打包命令时,会需要几分钟的运行时间,因为系统会自动从网络上下载各种文件。后面再次运行上面命令,就会很快,因为不再需要下载相关文件。

打包完成后会输出如下信息

image-20221203212734844

生成的 jar 包的位置为 ~/sparkapp/target/scala-2.12/simple-project_2.12-1.0.jar

4.4、通过spark-submit运行程序

最后,我们就可以将生成的 jar 包通过 spark-submit 提交到 Spark 中运行了,命令如下

1
2
3
4
/usr/local/spark/bin/spark-submit --class "SimpleApp" ~/sparkapp/target/scala-2.12/simple-project_2.12-1.0.jar
#上面命令执行后会输出太多信息,可以不使用上面命令,而使用下面命令查看想要的结果

/usr/local/spark/bin/spark-submit --class "SimpleApp" ~/sparkapp/target/scala-2.12/simple-project_2.12-1.0.jar 2>&1 | grep "Lines with a:"
image-20221203213211821

五、使用IDEA+SBT编写Spark程序

5.1、搭建IDEA远程开发

由于虚拟机上的CentOS7没有GUI,所以无法使用IDEA。解决办法是在宿主机Windows10的IDEA上使用IDEA的远程开发服务。

IDEA会在Windows10本地安装一个JetBrain GateWay。在CentOS7(远程服务器)上安装一个IDEA Backend。

打开远程界面如下:

image-20221204112314657

同时,还需要在CentOS7的IDEA服务端上安装Scala插件,安装Scala SDK。

具体搭建过程见这篇:IDEA远程开发 - timegogo

5.2、安装Scala SDK

直接使用IDEA提示安装Scala SDK速度极慢(访问国外服务器的原因,速度只有几kb、几十kb)。所以我们先在[镜像网站](Index of /scala2.12 (macports.org))上下载好Scala SDK,然后在CentOS 7上手动安装。

我在Windows10的浏览器中下载,需要XFtp传输到CentOS7虚拟机上(也可以在Linux中通过wgetcurl命令直接下载.tgz文件)

然后,进行解压,

1
2
cd ~		#我的.tgz文件放在了/root目录下
tar -zxvf scala-2.12.15.tgz -C /usr/local #解压到/usr/local/目录下

添加环境变量,(无论是哪种内核(版本)的系统,都可以通过修改profile或者bashrc的配置信息来达到设置环境变量的目的)

1
2
3
4
5
6
7
8
9
10
vi ~/.bashrc	

#在末尾加入以下内容:
# Scala Environment Variables
export SCALA_HOME=/usr/local/scala-2.12.15
export PATH=$PATH:$SCALA_HOME/bin

source ~/.bashrc #重新加载配置文件,让新增的环境变量生效

scala -version #测试环境变量是否生效
image-20221204111924761

在CentOS7安装好Scala后,打开IDEA时,会自动提示你安装Scala SDK,并提供系统上的Scala供你选择

5.3、创建项目

由于IDEA不支持远程新建项目,所以只能”曲线救国“。在Windows下新建出项目,但是依赖的版本按照远程CentOS7的来配置。本地创建出项目后,再用XFtp传输到远程CentOS7上。

吐槽一波,这样的操作实在是太麻烦了。对于Spark开发来说,运行环境在服务器上,但是现在哪有工业服务器带GUI的。所以也就不可能直接在服务器上使用IDE创建项目。但是如果本地创建项目,需要运行测试的时候又没有运行环境。所以就很麻烦!

image-20221204114400461

这里还需要解决一下【项目根目录】的问题,见:IDEA远程开发 - timegogo-设置项目根目录

经过一系列”曲线操作“,发现还是无法正常使用(心态崩了)。如下图,BackEnd上没有Scala Class的选项。

image-20221204134200082

即使通过File类型去添加.scala后缀也不管用

image-20221204134637052

因此决定还是安装GUI,在CentOS7上安装IDEA。参考:CentOS7安装GUI界面及远程连接的实现 - 腾讯云开发者社区-腾讯云 (tencent.com)

参考链接

[1].Spark2.1.0入门:Spark的安装和使用_厦大数据库实验室博客 (xmu.edu.cn)

[2].http://spark.apache.org/downloads.html

[3].Index of /apache/spark/spark-3.3.1 (tsinghua.edu.cn)

[4].sbt - Download (scala-sbt.org)

[5.CentOS7安装GUI界面及远程连接的实现 - 腾讯云开发者社区-腾讯云 (tencent.com)]


Spark从搭建到运行
http://timegogo.top/2022/12/02/大数据/Spark从搭建到运行/
作者
丘智聪
发布于
2022年12月2日
更新于
2023年7月16日
许可协议