12-Spark的环境搭建
星期一, 4月 7, 2025 | 11分钟阅读

关于Linux系统大数据环境搭建——12-Spark的环境搭建。
12-Spark的环境搭建
Spark版本:Spark3.3.2
检查环境
搭建之前先确认 Java(8) 和 Scala(2.12.x) 环境。因为 Java 环境之前我们已经安装过,所以这里只需要安装 Scala即可(三台服务器都需要安装)。
rpm -ivh scala-2.12.17.rpm
然后通过 whereis scala
命令查询 Scala 的安装目录。
[root@node01 ~]# whereis scala
scala: /usr/bin/scala /usr/share/scala /usr/share/man/man1/scala.1.gz
三个节点修改环境变量 vim /etc/profile ,在文件末尾添加以下内容:
export SCALA_HOME=/usr/share/scala
export PATH=$SCALA_HOME/bin:$PATH
修改完成后 source /etc/profile
重新加载环境变量。
配置完成后检查环境。
[root@node01 ~]# java -version
java version "1.8.0_351"
Java(TM) SE Runtime Environment (build 1.8.0_351-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.351-b10, mixed mode)
[root@node01 ~]# scala -version
Scala code runner version 2.12.17 -- Copyright 2002-2022, LAMP/EPFL and Lightbend, Inc.
Local 本地模式
所谓的 Local 模式,就是不需要其他任何节点资源就可以在本地执行 Spark 代码的环境,一般用于教学,调试,演示等。本地模式就是一个独立的进程,通过其内部的多个线程来模拟整个 Spark 运行时环境,每个线程代表一个 Worker。
上传解压
将 Spark 安装包上传至服务器,解压后重命名为 spark-local
。
[root@node01 ~]# tar -zxvf spark-3.3.2-bin-hadoop3.tgz -C /opt/yjx/
[root@node01 ~]# mv /opt/yjx/spark-3.3.2-bin-hadoop3/ /opt/yjx/spark-local
解压目录说明:
bin 可执行脚本
conf 配置文件
data 示例程序使用数据
examples 示例程序
jars 依赖 jar 包
kubernetes K8s 容器相关文件
python Python API
R R API
sbin 集群管理命令
yarn 整合 yarn 需要的文件
修改配置文件
注意:本地模式下,如果学习 Spark 时不需要从自己的 HDFS 读取数据,那么就不需要修改任何配置信息,直接运行
bin/spark-shell
即可开始 Spark 学习之旅。
如果需要从之前已经搭建好的 HDFS 中读取数据,需要修改 spark-env.sh 环境配置脚本文件。
[root@node01 ~]# cd /opt/yjx/spark-local/conf/
[root@node01 conf]# cp spark-env.sh.template spark-env.sh
[root@node01 conf]# vim spark-env.sh
在文件末尾添加以下内容:
export JAVA_HOME=/usr/java/jdk1.8.0_351-amd64
export HADOOP_HOME=/opt/yjx/hadoop-3.3.4
HADOOP_CONF_DIR=/opt/yjx/hadoop-3.3.4/etc/hadoop
SPARK_DIST_CLASSPATH=$(/opt/yjx/hadoop-3.3.4/bin/hadoop classpath)
准备数据
在 spark-local/data
目录下创建 wordcount
目录, wordcount
目录下创建以下两文件。
[root@node01 ~]# mkdir -p /opt/yjx/spark-local/data/wordcount
wd1.txt
Hello Hadoop
Hello ZooKeeper
Hello Hadoop Hive
wd2.txt
Hello Hadoop HBase
Hive Scala Spark
基本使用
运行本地模式
[root@node01 ~]# cd /opt/yjx/spark-local/
[root@node01 spark-local]# bin/spark-shell
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
23/02/26 10:27:01 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform...
using builtin-java classes where applicable
Spark context Web UI available at http://node01:4040
Spark context available as 'sc' (master = local[*], app id = local-1677378422976).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 3.3.2
/_/
Using Scala version 2.12.15 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_351)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
测试 WordCount 程序。
注意:加载 HDFS 文件和本地文件都是使用 textFile,区别是通过前缀(
hdfs://
和file://
)进行标识。
访问:http://node01:4040/ 历史服务器结果如下。
退出命令。
:quit
提交应用
Spark 还支持直接运行已打成 Jar 包的应用程序,通过 spark-submit
来实现。
以下命令为执行 Spark 自带的测试程序,计算 π 值。
bin/spark-submit \
--master local[*] \
--executor-memory 1G \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.12-3.3.2.jar \
10
bin/spark-submit \
--master local-cluster[2,1,1024] \
--executor-memory 1G \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.12-3.3.2.jar \
10
--master local[*]
:部署模式,默认为本地模式,数字
或*
表示分配的虚拟 CPU 数量;local
:本地运行,只有一个工作进程,无并行计算能力;local[N]
:本地运行,有 N 个工作进程,通常设置 N 为机器的 CPU 数量;local[*]
:本地运行,工作进程数量等于机器的 CPU 核心数量。
--master local-cluster[2,1,1024]
:本地伪分布式模式,三个参数分别为:numSlaves
:模拟集群的 Worker 节点个数;coresPerSlave
:模拟集群的各个 Worker 节点上的内核数;memoryPerSlave
:模拟集群的各个 Worker 节点上的内存大小,单位 M。
--executor-memory
:每个 Executor 内存大小(如:1000M,2G),默认 1G;--class
:要执行的程序的主类;spark-examples_2.12-3.3.2.jar
:要执行的程序的所在 Jar 包;10
:应用程序的入口参数。
修改WordCount程序代码如下:
package com.yjxxt.wordcount
import org.apache.spark.{SparkConf, SparkContext}
object WordCount04Demo {
def main(args: Array[String]): Unit = {
// ==================== 建立连接 ====================
// 初始化配置对象
val conf = new SparkConf()
// 设置运行模式与 AppName
conf.setMaster("local").setAppName("WordCount")
// 根据配置对象初始化上下文对象
val sc = new SparkContext(conf)
// ==================== 业务处理 ====================
sc.textFile("file:///opt/yjx/spark-local/data/wordcount")
.flatMap(_.split("\\s+"))
.map(_ -> 1)
.reduceByKey(_ + _)
.take(10)
.foreach(println)
// ==================== 关闭连接 ====================
if (!sc.isStopped) sc.stop()
}
}
打包上传至服务器 /root
目录,并执行以下命令。
bin/spark-submit \
--master local[*] \
--executor-memory 1G \
--class com.yjxxt.wordcount.WordCount04Demo \
/root/spark-quickstart-demo-1.0-SNAPSHOT.jar
读取 HDFS 文件
当 Spark 配置了 Hadoop 环境以后,在 spark-shell 中 sc.textFile(path)
默认就会读取 HDFS 文件(不配置时默认
读取本地文件系统),此时如果需要读取本地文件,需要添加 file://
前缀。在读取 HDFS 文件时,path 如果不加 /
,
默认读取 hdfs://hdfs-yjx/user/root
,如果加了 /
,从 HDFS 根路径开始读取,也就是 hdfs://hdfs-yjx
。
提示:
hdfs://hdfs-yjx
是 Hadoop 的core-site.xml
配置文件中fs.defaultFS
属性的值。
# path 如果不加`/`,默认读取`hdfs://hdfs-yjx/user/root`
sc.textFile("data/wordcount").flatMap(_.split("\\s+")).map(_ -> 1).reduceByKey(_ + _).take(10)
# path 如果加了`/`,从 HDFS 根路径开始读取,也就是`hdfs://hdfs-yjx`
sc.textFile("/data/wordcount").flatMap(_.split("\\s+")).map(_ -> 1).reduceByKey(_ + _).take(10)
# 使用 hdfs:// 前缀从指定位置读取
sc.textFile("hdfs://hdfs-yjx/data/wordcount").flatMap(_.split("\\s+")).map(_ -> 1).reduceByKey(_ +_).take(10)
Standalone 独立模式
Local 本地模式只是用来学习与演示的,真实工作中还是要将应用提交到对应的集群中去执行,这里先搭建 Spark 自身提供的集群模式,也就是所谓的 Standalone 独立模式。Spark 的独立模式体现了经典的 Master-Worker 模式。
独立模式属于自己独立一套集群(Client/Master/Worker),是 Spark 原生的集群管理器,自带完整的服务,可单独部署,无需依赖任何其他资源管理系统。使用 Standalone 可以很方便地搭建一个集群,一般在公司内部没有搭建其他资源管理框架的时候才会使用。缺点:资源不利于充分利用。
Standalone-Single
目标环境
上传解压
将 Spark 安装包上传至服务器,解压后重命名为 spark-standalone 。
[root@node01 ~]# tar -zxvf spark-3.3.2-bin-hadoop3.tgz -C /opt/yjx/
[root@node01 ~]# mv /opt/yjx/spark-3.3.2-bin-hadoop3/ /opt/yjx/spark-standalone
解压目录说明:
bin 可执行脚本
conf 配置文件
data 示例程序使用数据
examples 示例程序
jars 依赖 jar 包
kubernetes k8s 容器相关文件
python Python API
R R API
sbin 集群管理命令
yarn 整合 yarn 需要的文件
修改配置文件
修改 spark-env.sh
环境配置脚本文件。
[root@node01 ~]# cd /opt/yjx/spark-standalone/conf/
[root@node01 conf]# cp spark-env.sh.template spark-env.sh
[root@node01 conf]# vim spark-env.sh
在文件末尾添加以下内容:
export JAVA_HOME=/usr/java/jdk1.8.0_351-amd64
export HADOOP_HOME=/opt/yjx/hadoop-3.3.4
HADOOP_CONF_DIR=/opt/yjx/hadoop-3.3.4/etc/hadoop
SPARK_DIST_CLASSPATH=$(/opt/yjx/hadoop-3.3.4/bin/hadoop classpath)
SPARK_MASTER_HOST=node01
SPARK_MASTER_PORT=7077
SPARK_WORKER_CORES=1
SPARK_WORKER_MEMORY=1G
SPARK_MASTER_WEBUI_PORT=6066
SPARK_MASTER_HOST
:Master
节点的IP
或主机名SPARK_MASTER_PORT
:Master
节点的PORT
,也就是提交任务的端口,默认是 7077SPARK_WORKER_CORES
:每个Worker
从节点能够支配的 CPU 个数SPARK_WORKER_MEMORY
:每个Worker
从节点能够支配的内存数SPARK_MASTER_WEBUI_PORT
:Master WEBUI 默认访问端口为 8080,可能会和 ZooKeeper 冲突,所以改为 6066
配置工作节点
修改workers
配置文件
[root@node01 conf]# cp workers.template workers
[root@node01 conf]# vim workers
删除文件末尾的 localhost
,并在末尾添加以下内容:
node01
node02
node03
拷贝至其他节点
将 node01 的 Spark 拷贝至其他节点。
[root@node02 ~]# scp -r root@node01:/opt/yjx/spark-standalone/ /opt/yjx/
[root@node03 ~]# scp -r root@node01:/opt/yjx/spark-standalone/ /opt/yjx/
# 或者使用分发脚本
[root@node01 ~]# yjxrsync /opt/yjx/spark-standalone/
配置环境变量
三个节点修改环境变量 vim /etc/profile ,在文件末尾添加以下内容:
# 设置 Linux 共享库
# LD_LIBRARY_PATH 是 Linux 的环境变量,该环境变量主要用于指定除了默认路径之外的其他路径的共享库(动态链接库)
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native/:$LD_LIBRARY_PATH
设置共享库是为了解决运行 spark-shell
时的警告信息: WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
。
修改完成后source /etc/profile
重新加载环境变量。
启动
[root@node01 ~]# cd /opt/yjx/spark-standalone/
[root@node01 spark-standalone]# sbin/start-all.sh
访问
访问:http://node01:6066/
6066
是 Spark WebUI
界面的端口, 7077
是 Spark
任务提交的端口。
如需修改这两端口,修改 $SPARK_HOME/sbin/start-master.sh
中的SPARK_MASTER_WEBUI_PORT=8080
和SPARK_MASTER_PORT=7077
即可,或者在 $SPARK_HOME/conf/spark-env.sh
中添加对应配置进行修改。
测试
bin/spark-submit \
--master spark://node01:7077 \
--executor-memory 1G \
--executor-cores 1 \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.12-3.3.2.jar \
10
bin/spark-submit \
--master spark://node01:7077 \
--deploy-mode cluster \
--executor-memory 1G \
--executor-cores 1 \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.12-3.3.2.jar \
10
提示:
--master
为spark://node01:7077
。--executor-cores
:每个 Executor 使用的 core 个数,Spark on YARN 默认为 1,Standalone 默认为 Worker 上所有可用的 core。
Standalone-HA
因为 Standalone 集群只有一个 Master,如果 Master 挂了就无法提交应用程序,所以需要给 Master 进行高可用配置。Master 的高可用可以使用 FileSystem
(文件系统)或 ZooKeeper
(分布式协调服务)来实现。
Single-Node Recovery with Local File System
:基于文件系统的单点恢复。FileSystem 只有存储功能,存储Master 的元数据信息,用 FileSystem 搭建的 Master 高可用,在 Master 失败时,需要手动启动备用的 Master。这种方式不推荐使用,主要用于开发或测试环境。Standby Masters with ZooKeeper
:基于 ZooKeeper 的 Standby Masters。ZooKeeper 有选举和存储功能,可以存储 Master 的元数据信息,使用 ZooKeeper 搭建的 Master 高可用,当 Master 挂掉时,备用的 Master 会自动切换,推荐使用这种方式搭建 Master 的 HA。
目标环境
提示:本文 HA 环境基于 Single 环境继续搭建。首先停止 Standalone-Single 环境。
修改配置文件
修改 spark-env.sh
环境配置脚本文件。
[root@node01 ~]# cd /opt/yjx/spark-standalone/conf/
[root@node01 conf]# vim spark-env.sh
删除以下内容:
SPARK_MASTER_HOST=node01
SPARK_MASTER_PORT=7077
添加以下内容:
SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=node01:2181,node02:2181,node03:2181
-Dspark.deploy.zookeeper.dir=/spark-ha"
拷贝至其他节点
将 node01 的 spark-env.sh
拷贝至其他节点。
[root@node01 ~]# scp /opt/yjx/spark-standalone/conf/spark-env.sh root@node02:/opt/yjx/spark-
standalone/conf
[root@node01 ~]# scp /opt/yjx/spark-standalone/conf/spark-env.sh root@node03:/opt/yjx/spark-
standalone/conf
# 或者使用分发脚本
[root@node01 ~]# yjxrsync /opt/yjx/spark-standalone/conf/spark-env.sh
启动
启动 ZooKeeper(三台机器都需要执行)。
zkServer.sh start
zkServer.sh status
启动 Standalone(node01 的 Master 会被启动)。
[root@node01 ~]# cd /opt/yjx/spark-standalone/
[root@node01 spark-standalone]# sbin/start-all.sh
启动 node02 的 Master。
[root@node02 ~]# cd /opt/yjx/spark-standalone/
[root@node02 spark-standalone]# sbin/start-master.sh
访问
访问:http://node01:6066/
访问:http://node02:6066/
测试
bin/spark-submit \
--master spark://node01:7077,node02:7077 \
--executor-memory 1G \
--executor-cores 1 \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.12-3.3.2.jar \
10
bin/spark-submit \
--master spark://node01:7077,node02:7077 \
--deploy-mode cluster \
--executor-memory 1G \
--executor-cores 1 \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.12-3.3.2.jar \
10
注意:
--master
为spark://node01:7077,node02:7077
。
如果提交 SparkPi 程序时 kill 掉主 Master ,结果如下:
- 主备切换过程中不能提交
Application
。 - 主备切换过程中不影响已经在集群中运行的
Application
。因为Spark
是粗粒度资源调度。
配置历史服务器
由于 spark-shell
停止后,集群监控的 4040
页面就无法访问了,导致历史任务的运行情况也无法得知,所以开发时为了便于查看一般会配置历史服务器记录任务运行情况。
提示:请先停止 Standalone-HA 环境。
修改配置文件
修改 spark-defaults.conf
配置文件。
[root@node01 ~]# cd /opt/yjx/spark-standalone/conf
[root@node01 conf]# cp spark-defaults.conf.template spark-defaults.conf
[root@node01 conf]# vi spark-defaults.conf
在文件末尾添加以下内容:
# 开启记录事件日志的功能
spark.eventLog.enabled true
# 设置事件日志存储的目录。注意:配置的 HDFS 路径要存在
spark.eventLog.dir hdfs://hdfs-yjx/logs/spark-jobs
spark.history.fs.logDirectory hdfs://hdfs-yjx/logs/spark-jobs
# 日志优化选项,压缩日志
spark.eventLog.compress true
修改 spark-env.sh 环境配置脚本文件。
[root@node01 conf]# vim spark-env.sh
在文件末尾添加以下内容:
SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=16066
-Dspark.history.fs.logDirectory=hdfs://hdfs-yjx/logs/spark-jobs
-Dspark.history.retainedApplications=30"
-
-Dspark.history.ui.port
:历史服务器 WEBUI 访问端口 -
-Dspark.history.fs.logDirectory
:历史服务器日志存储路径 -
-Dspark.history.retainedApplications
:保存Application
历史记录的个数,超过该值时,旧的应用程序会被删除,这个是内存中的应用个数,不是页面上显示的应用个数。
拷贝至其他节点
将 node01 的 spark-defaults.conf
和 spark-env.sh
拷贝至其他节点。
[root@node01 ~]# scp /opt/yjx/spark-standalone/conf/spark-defaults.conf root@node02:/opt/yjx/spark-
standalone/conf
[root@node01 ~]# scp /opt/yjx/spark-standalone/conf/spark-defaults.conf root@node03:/opt/yjx/spark-
standalone/conf
[root@node01 ~]# scp /opt/yjx/spark-standalone/conf/spark-env.sh root@node02:/opt/yjx/spark-
standalone/conf
[root@node01 ~]# scp /opt/yjx/spark-standalone/conf/spark-env.sh root@node03:/opt/yjx/spark-
standalone/conf
# 或者使用分发脚本
[root@node01 ~]# yjxrsync /opt/yjx/spark-standalone/conf/spark-defaults.conf /opt/yjx/spark-
standalone/conf/spark-env.sh
启动
启动 ZooKeeper(三台机器都需要执行)。
zkServer.sh start
zkServer.sh status
启动 Hadoop 集群并在 HDFS 中创建 /logs/spark-jobs 目录。
[root@node01 ~]# start-all.sh
[root@node01 ~]# hdfs dfs -mkdir -p /logs/spark-jobs
启动 Standalone(node01 的 Master 会被启动)。
[root@node01 ~]# cd /opt/yjx/spark-standalone/
[root@node01 spark-standalone]# sbin/start-all.sh
启动 node02 的 Master。
[root@node02 ~]# cd /opt/yjx/spark-standalone/
[root@node02 spark-standalone]# sbin/start-master.sh
启动历史服务。
[root@node01 spark-standalone]# sbin/start-history-server.sh
测试
bin/spark-submit \
--master spark://node01:7077,node02:7077 \
--executor-memory 1G \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.12-3.3.2.jar \
10
访问:http://node01:16066/
关闭
先关闭历史服务。
[root@node01 spark-standalone]# pwd
/opt/yjx/spark-standalone
[root@node01 spark-standalone]# sbin/stop-history-server.sh
再关闭 node02 的 Master。
[root@node02 spark-standalone]# sbin/stop-master.sh
再关闭 Standalone-HA。
[root@node01 spark-standalone]# sbin/stop-all.sh
再关闭 Hadoop。
[root@node01 ~]# stop-all.sh
再关闭 ZooKeeper(三台机器都需要执行)。
zkServer.sh stop
环境搭建成功后删除安装包, shutdown -h now 关机拍摄快照。
提示:目前企业里用的最多的模式还是 Spark on YARN 模式,Standalone 模式了解即可。
YARN模式(国内常用)
独立部署(Standalone)模式由 Spark 自身提供计算资源,无需其他框架提供资源。这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但是 Spark 主要是计算框架,而不是资源调度框架,所以本身提供的资源调度并不是它的强项,所以还是和其他专业的资源调度框架集成会更靠谱一些。接下来我们学习在强大的 YARN 环境中 Spark 是如何工作的(其实是因为国内环境 YARN 使用比较多)。
上传解压
将 Spark 安装包上传至服务器,解压后重命名为 spark-3.3.2
。
[root@node01 ~]# tar -zxvf spark-3.3.2-bin-hadoop3.tgz -C /opt/yjx/
[root@node01 ~]# mv /opt/yjx/spark-3.3.2-bin-hadoop3/ /opt/yjx/spark-3.3.2
解压目录说明:
bin 可执行脚本
conf 配置文件
data 示例程序使用数据
examples 示例程序
jars 依赖 jar 包
kubernetes k8s 容器相关文件
python Python API
R R API
sbin 集群管理命令
yarn 整合 yarn 需要的文件
修改配置文件
修改 Hadoop 的 yarn-size.xml
文件(三台机器都需要修改)。
[root@node01 ~]# vim /opt/yjx/hadoop-3.3.4/etc/hadoop/yarn-site.xml
添加以下内容(搭建 Hadoop YARN 环境时已经配置):
<!-- 设置是否对容器强制执行物理内存限制 -->
<!-- 是否启动一个线程检查每个任务正在使用的物理内存量,如果任务超出分配值,则将其直接杀掉,默认为 true -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!-- 设置是否对容器强制执行虚拟内存限制 -->
<!-- 是否启动一个线程检查每个任务正在使用的虚拟内存量,如果任务超出分配值,则将其直接杀掉,默认为 true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
修改 spark-env.sh
环境配置脚本文件。
[root@node01 ~]# cd /opt/yjx/spark-3.3.2/conf/
[root@node01 conf]# cp spark-env.sh.template spark-env.sh
[root@node01 conf]# vim spark-env.sh
在文件末尾添加以下内容:
export JAVA_HOME=/usr/java/jdk1.8.0_351-amd64
export HADOOP_HOME=/opt/yjx/hadoop-3.3.4
HADOOP_CONF_DIR=/opt/yjx/hadoop-3.3.4/etc/hadoop
YARN_CONF_DIR=/opt/yjx/hadoop-3.3.4/etc/hadoop
SPARK_DIST_CLASSPATH=$(/opt/yjx/hadoop-3.3.4/bin/hadoop classpath)
配置历史服务器
由于 spark-shell
停止后,集群监控的 4040
页面就无法访问了,导致历史任务的运行情况也无法得知,所以开发时为了便于查看一般会配置历史服务器记录任务运行情况。
修改 spark-defaults.conf
配置文件。
[root@node01 conf]# cp spark-defaults.conf.template spark-defaults.conf
[root@node01 conf]# vi spark-defaults.conf
在文件末尾添加以下内容:
# 开启记录事件日志的功能
spark.eventLog.enabled true
# 设置事件日志存储的目录。注意:配置的 HDFS 路径要存在
spark.eventLog.dir hdfs://hdfs-yjx/logs/spark-jobs
spark.history.fs.logDirectory hdfs://hdfs-yjx/logs/spark-jobs
# 日志优化选项,压缩日志
spark.eventLog.compress true
# 历史服务器与 YARN 关联
spark.yarn.historyServer.address=node01:16066
# 历史服务器 WEBUI 访问端口
spark.history.ui.port=16066
修改 spark-env.sh 环境配置脚本文件。
[root@node01 conf]# vim spark-env.sh
在文件末尾添加以下内容:
SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=16066
-Dspark.history.fs.logDirectory=hdfs://hdfs-yjx/logs/spark-jobs
-Dspark.history.retainedApplications=30"
-
-Dspark.history.ui.port
:历史服务器 WEBUI 访问端口 -
-Dspark.history.fs.logDirectory
:历史服务器日志存储路径 -
-Dspark.history.retainedApplications
:保存Application
历史记录的个数,超过该值时,旧的应用程序会被删除,这个是内存中的应用个数,不是页面上显示的应用个数。
拷贝至其他节点
将 node01 配置好的 Spark 拷贝至 node02 和 node03。
[root@node02 ~]# scp -r root@node01:/opt/yjx/spark-3.3.2/ /opt/yjx/
[root@node03 ~]# scp -r root@node01:/opt/yjx/spark-3.3.2/ /opt/yjx/
# 或者使用分发脚本
[root@node01 ~]# yjxrsync /opt/yjx/spark-3.3.2/
提示:如果需要三个节点都能提交 Spark 任务则执行这一步。
启动
启动 ZooKeeper(三台机器都需要执行)。
zkServer.sh start
zkServer.sh status
启动 Hadoop 集群并在 HDFS 中创建 /logs/spark-jobs 目录。
[root@node01 ~]# start-all.sh
[root@node01 ~]# hdfs dfs -mkdir -p /logs/spark-jobs
启动 YARN 历史服务。
[root@node01 ~]# mapred --daemon start historyserver
启动 Spark 历史服务。
[root@node01 ~]# /opt/yjx/spark-3.3.2/sbin/start-history-server.sh
提交应用
# yarn-client 模式在当前运行节点控制台即可看到日志信息,方便测试调试程序
bin/spark-submit \
--master yarn \
--executor-memory 1G \
--executor-cores 1 \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.12-3.3.2.jar \
10
# yarn-cluster 模式需要通过 YARN 历史服务或者通过 Spark 历史服务查看日志
bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--executor-memory 1G \
--executor-cores 1 \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.12-3.3.2.jar \
10
# 或者(以下方式官方不推荐)
bin/spark-submit \
--master yarn-cluster \
--executor-memory 1G \
--executor-cores 1 \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.12-3.3.2.jar \
10
访问 YARN 集群结果如下,点击最后的 History
即可查看通过 Spark 历史服务查看日志。
如果想要通过 YARN 历史服务查看日志(首先要启动)点击进入提交应用的详情页,然后点击 Logs
,如下。
通过 YARN 命令查看日志如下:
[root@node01 ~]# yarn logs -applicationId application_1677381985835_0001 | grep "Pi is roughly"
Pi is roughly 3.141203141203141
关闭
先关闭历史服务。
[root@node01 ~]# mapred --daemon stop historyserver
[root@node01 ~]# /opt/yjx/spark-3.3.2/sbin/stop-history-server.sh
再关闭 Hadoop 集群。
[root@node01 ~]# stop-all.sh
再关闭 ZooKeeper(三台机器都需要执行)。
zkServer.sh stop
环境搭建成功后删除安装包, shutdown -h now 关机拍摄快照。