12-Spark的环境搭建

星期一, 4月 7, 2025 | 11分钟阅读

MyraZ
12-Spark的环境搭建

关于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:// )进行标识。

image-20250407191448226

​ 访问:http://node01:4040/ 历史服务器结果如下。

image-20250407191506866

​ 退出命令。

: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

目标环境

image-20250407192426412

上传解压

将 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_HOSTMaster节点的 IP 或主机名
  • SPARK_MASTER_PORTMaster 节点的 PORT ,也就是提交任务的端口,默认是 7077
  • SPARK_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/

image-20250407193309320

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

提示: --masterspark://node01:7077 --executor-cores :每个 Executor 使用的 core 个数,Spark on YARN 默认为 1,Standalone 默认为 Worker 上所有可用的 core。

Standalone-HA

image-20250407193602610

​ 因为 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。

目标环境

image-20250407193752564

提示:本文 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/

image-20250407194213981

​ 访问:http://node02:6066/

image-20250407194235659

测试

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

注意: --masterspark://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/

image-20250407195214050

image-20250407195225479

image-20250407195236590

关闭

​ 先关闭历史服务。

[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 历史服务查看日志。

image-20250407200743251

image-20250407200754505

image-20250407200807258

​ 如果想要通过 YARN 历史服务查看日志(首先要启动)点击进入提交应用的详情页,然后点击 Logs ,如下。

image-20250407200832947

image-20250407200848204

image-20250407200905769

​ 通过 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 关机拍摄快照。

© 2024 - 2025 雪中烛

 

在线工具资源网站

在线工具官网

ProcessOn:👉ProcessOn在线作图

腾讯文档:👉腾讯文档

FlowUs 息流:👉FlowUs 息流

Mermaid Live Editor:👉在线流程图和图表编辑器 - 美人鱼实时编辑器

ME2在线工具(加密工具):👉ME2在线工具-在线开发学习生活工具箱

Textln:👉Textln文本智能云平台-通用文本解析

MinerU:👉MinerU数据提取工具

Crontab:👉Cron Expression Examples - Crontab.guru

正则表达式测试网站:👉regex101: build, test, and debug regex

技术资源网站

技术资源官网

Spring:👉Spring官网

MyBatis中文网 :👉MyBatis 中文网

Redis中文网:👉Redis中文网

Zookeeper:👉Apache ZooKeeper官网

Raft算法:👉Raft Consensus Algorithm官网

Hadoop:👉Apache Hadoop官网

Hive:👉Apache Hive官网

Phoenix:👉Apache Phoenix官网

Bootstrap中文网:👉Bootstrap中文网

Element:👉组件 | Element

Layui :👉Layui - 极简模块化前端 UI 组件库(官方文档)

FreeMarker :👉FreeMarker 中文官方参考手册

ztree树插件: 👉zTree – jQuery 树插件官网

x File Storage:👉x File Storage官网