Skip to content

项目1 搭建Spark集群——Spark概述 学习笔记 ​

面向已掌握 Java / Scala / Hadoop / Hive 基础、大数据专业实习生。本笔记整理自课程配套 PPT、任务实操脚本与知识准备材料,并补充术语解释、排查要点与实习衔接建议,可直接作为复习与实操速查手册使用。


目录 ​


00 学习目标与知识地图 ​

目标内容
目标01 · 了解 Spark理解 Spark 的特点、生态圈组成与典型应用场景,能说清"为什么企业需要 Spark、它和 Hadoop MapReduce 的关系是什么"
目标02 · 理解运行原理掌握 Spark 的运行架构、作业运行流程、RDD 核心数据集及其转换/行动算子,理解宽窄依赖与 Stage 划分的底层逻辑
目标03 · 会搭集群能够独立完成单机版、单机伪分布式、完全分布式三种模式的 Spark 环境搭建,并能读懂、修改核心配置文件

知识地图:三个模块层层递进——"是什么"(模块一)→ "怎么跑"(模块二)→ "怎么搭"(模块三)。

01 · Spark 是什么  →  02 · 架构 / RDD / 原理  →  03 · 单机 → 伪分布式 → 完全分布式

建议按顺序学习——不理解 Standalone / YARN 模式下 Driver Program 的位置,直接上手搭集群容易"知其然不知其所以然",后续排错会很吃力。


01 Spark 简介 ​

项目背景:Spark 为什么会出现 ​

企业和研究机构的大数据处理平台大多基于 Hadoop 分布式框架,但 Hadoop MapReduce 有一个明显短板:计算过程中的中间结果要写回 HDFS(磁盘),涉及大量磁盘 I/O,导致计算延迟高,难以满足实时、快速计算的需求。

Spark 继承了 MapReduce"分而治之"的分布式计算思想,同时改进了这一缺陷:中间结果优先保存在内存中,大幅减少了读写 HDFS 的次数,因此在数据挖掘、机器学习这类需要多次迭代计算的场景中表现尤其突出。

类比理解:你已经熟悉 Hadoop MapReduce 的执行方式——每一轮 Map/Reduce 之间的中间数据都要落盘。可以把 Spark 理解成"把这套磁盘中转站尽量搬进内存里"的加强版计算引擎,两者的分布式调度思想(Master/Worker、任务切分)是相通的,这也是为什么你已有的 Hadoop 基础能直接迁移过来。

Spark 的五大特点 ​

1. 快速 Hadoop MapReduce 的中间数据存于 HDFS,涉及磁盘读写,效率较低;Spark 的中间数据存于内存,迭代效率高。同样运行逻辑回归算法,Spark 在内存中的运行速度约为 Hadoop MapReduce 的 100 多倍,在磁盘上约为 10 多倍。

2. 易用

  • 支持使用 Scala、Python、Java、R 等语言快速编写应用(你已掌握 Java、Scala,起步会很快)
  • 提供超过 80 个高阶算子,编写并行程序更容易
  • 提供 Scala、Python、R 的交互式界面(如 spark-shell),降低学习门槛

3. 通用 Spark 可以与 SQL 查询、实时计算及其他复杂分析计算良好结合,框架内多个组件紧密集成,支持在同一应用中混合使用。相比 Hadoop MapReduce 单一的批处理模式,Spark 的"全栈式统一方案"能显著降低平台部署、开发和维护的成本。

4. 随处运行 Spark 可通过自带的 Standalone 集群模式运行,也可以运行在 Amazon EC2、Hadoop YARN 或 Apache Mesos 之上。Spark 本身不提供存储能力,需要从 HDFS、Cassandra、HBase、Hive、Alluxio(Tachyon)等外部数据源读取数据——这正是它能与你已学的 Hadoop / Hive 无缝衔接的原因。

5. 代码简洁 用 MapReduce 实现单词计数(WordCount)可能需要 60 多行 Java 代码,而 Spark 用 Scala 一行即可完成:

scala
// 代码1-1  实现单词计数代码
sc.textFile("/user/root/test.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("/user/root/output")

对照阅读:textFile 读取文件 → flatMap 按空格切词 → map 转成 (word, 1) 键值对 → reduceByKey 按 key 聚合求和 → saveAsTextFile 写出结果。这一行代码几乎浓缩了本笔记第二部分讲的转换/行动算子的全部核心用法,建议学完 RDD 算子后回来重新读一遍。

Spark 生态圈 ​

Spark 生态圈以 Spark Core 为核心:向下可以从 HDFS、Amazon S3、HBase 等多种数据源读取数据,并支持 Mesos、YARN、EC2、本地模式或 Standalone 等多种调度方式;向上则衍生出多个组件,按需调用:

组件定位
Spark Streaming实时流处理
Spark SQL结构化数据的即席查询(类似 Hive 之于 Hadoop)
BlinkDB权衡查询(用精度换速度的近似查询)
MLBase / MLlib机器学习
GraphX图计算 / 图处理
SparkR面向 R 语言的数学计算接口

Spark 的应用场景 ​

应用领域说明示例应用
实时数据处理依托 Spark Streaming 模块,适合需要实时处理的场景实时日志分析、实时交易监控
机器学习 / 数据挖掘结合 MLlib 与内存迭代计算优势推荐系统、用户行为分析
图形数据处理依托 Spark GraphX 模块社交网络分析、网络优化
复杂 ETL 任务擅长大规模数据的清洗、转换、加载数据仓库 / 数据中台的 ETL 流程

02 Spark 运行架构与原理 ​

核心术语速览(补充知识,便于理解后文) ​

官方选择题解析中提到,Spark 架构的核心组件包括 Driver Program、SparkContext、Cluster Manager、Worker Node(注意与 Hadoop 的 ResourceManager 区分——那是 YARN 里的角色,不是 Spark 自身架构组件)。

组件作用
Driver Program运行 main() 函数并创建 SparkContext 的进程,负责把应用拆分为 Task 并调度
SparkContextSpark 应用与集群交互的入口,代表与集群管理器的一条连接
Cluster Manager集群资源管理器,可以是 Spark 自带的 Standalone,也可以是 YARN / Mesos / Kubernetes
Worker Node集群中运行 Executor 的工作节点
Executor在 Worker Node 上为某个 Application 启动的进程,负责执行 Task 并保存数据

四种部署模式 ​

Spark 支持 4 种运行模式:Standalone、YARN、Mesos、Kubernetes。目前企业里用得最多的是 Standalone 和 YARN 两种,本项目也重点讲这两种。

⚠️ 选择题易错点:HDFS 不是 Spark 的运行模式,它是 Hadoop 集群里的分布式文件系统,属于"存储层",不要和"计算调度模式"混淆。

Standalone 模式 ​

Standalone 是 Spark 自带的资源管理器。这种模式下,Driver Program 既可以运行在集群主节点上,也可以运行在本地客户端 Client 上,具体取决于提交方式:

方式一:spark-shell 交互式提交

  • 执行 spark-shell 脚本后进入交互式命令界面
  • Driver Program 运行在主节点上
  • 启动成功后访问 http://master:8080 可在监控界面看到对应应用信息

方式二:spark-submit / IDE 提交

  • 使用 spark-submit 工具,或在 Eclipse / IntelliJ IDEA 中通过 new SparkConf().setMaster("spark://master:7077") 方式运行
  • Driver Program 运行在本地客户端上

Standalone 模式下作业运行流程大致为:Client 提交应用 → Driver Program 向 Master 申请资源 → Master 在 Worker 上分配 Executor → Executor 执行 Task 并将结果返回给 Driver。

YARN 模式 ​

YARN 模式根据 Driver Program 在集群中的位置,又分为 YARN 客户端模式(client) 和 YARN 集群模式(cluster)。这一模式下不需要启动 Spark 自带的 Standalone 集群,因此 http://master:8080 是访问不了的(这是初学者最常见的困惑点之一)。

bash
# 代码1-4  启动 YARN 客户端模式的 spark-shell(正常可用)
./bin/spark-shell --master yarn --deploy-mode client

# 代码1-5  启动 YARN 集群模式的 spark-shell(无法成功)
./bin/spark-shell --master yarn --deploy-mode cluster

⚠️ 为什么 cluster 模式下 spark-shell 启动不了:cluster 模式的 Driver Program 运行在 YARN 的 Application Master 中,而 spark-shell 本质是一个需要持续交互、实时回显结果的本地终端会话——Driver 一旦被"甩"进集群内部,就无法把交互式的输入输出实时传回本地终端。因此 spark-shell 只能用 client 模式,cluster 模式仅适用于 spark-submit 提交的、不需要人工交互的生产作业。

client 模式 vs cluster 模式

YARN Cluster 模式YARN Client 模式
Driver 位置运行在 Application Master 内Application Master 只申请资源并转交 NodeManager
通信方式AM 负责向 YARN 申请资源,并监督作业运行状况客户端直接与 NodeManager 通信进行作业调度
客户端依赖提交后可直接关闭客户端,作业继续在 YARN 上运行客户端需保持运行,可快速看到输出信息
适用场景不适合交互性强的作业,更适用于生产环境适用于交互和调试场景

Spark 核心数据集 RDD ​

弹性分布式数据集(Resilient Distributed Dataset,RDD)是 Spark 中最重要的概念,可以简单理解为"一个提供了许多操作接口的数据集合"。与普通数据集不同的是,RDD 会被划分为一到多个分区(Partition),各分区的数据实际分布存储在不同机器的内存或磁盘中。

直观理解:把一个 Array 转化为一个名为 myRDD 的 RDD 后,这份数据在逻辑上仍是一个整体,但物理上已被切成多份,分散存放在集群不同节点的内存/磁盘里——这正是 RDD 能够"弹性"并行处理的基础。

RDD 算子:转换操作 vs 行动操作 ​

RDD 支持两类操作,也称转换算子和行动算子:

  • 转换操作(Transformation):将原始数据集转换为 RDD,或将一个 RDD 转换为另一个 RDD
  • 行动操作(Action):将 RDD 存储至硬盘,或触发前面转换操作真正执行的操作

常用转换算子

算子说明
map(func)对 RDD 中每个元素使用 func,返回一个新的 RDD
filter(func)对每个元素使用 func,返回使 func 为 true 的元素构成的新 RDD
flatMap(func)与 map() 类似,但 func 对每个输入元素可生成多个输出结果
union(otherDataset)接收另一个 RDD 作为参数,返回二者元素合并后的新 RDD
groupByKey(numTasks)作用于键值 RDD,按相同 key 分组,返回 (K, Seq[V]) 数据集;默认 8 个并行任务,可用 numTasks 调整
reduceByKey(func,[numTasks])将 func 作用在 groupByKey() 产生的 (K,Seq[V]) 上(如求和),并行任务数同样可配置

常用行动算子

算子说明
reduce(func)通过 func 聚集数据集中所有元素(接收两个参数,返回一个值)
collect()返回数据集中所有的元素
count()返回数据集中所有元素的个数
first()返回数据集中的第一个元素
take(n)返回前 n 个元素
saveAsTextFile(path)将数据集以文本形式保存到本地文件系统 / HDFS 等;会调用每个元素的 toString() 并写为一行
foreach(func)对数据集中每个元素执行 func

惰性求值(Lazy Evaluation) ​

所有的转换操作都是懒惰(Lazy)操作:它们只会记录"需要进行哪些转换",并不会立即执行,只有遇到行动操作时才会真正触发计算并执行。

为什么要这样设计:惰性求值让 Spark 有机会在真正执行前,把一长串的转换操作合并、优化、划分成更高效的执行计划(这也是下文 Stage 划分的前提),而不是像"来一条命令就跑一次"那样低效。这也是很多初学者以为"代码写完就该有结果"、结果发现"什么都没输出"的常见困惑来源——因为还没触发行动算子。

宽依赖、窄依赖与 Stage 划分 ​

窄依赖(Narrow)宽依赖(Wide)
子 RDD 的一个分区,只依赖于父 RDD 中的一个分区子 RDD 的每一个分区,都依赖于父 RDD 中一个以上的分区

Spark 中一个作业会被拆分为多组任务,每组任务构成一个 Stage。任务分为两类:ShuffleMapTask(输出 Shuffle 所需数据)和 ResultTask(输出最终结果)。

  • Stage 的划分依据是任务类型:Shuffle 之前的操作属于一个 Stage,Shuffle 之后的操作属于另一个 Stage
  • 如果一个作业包含多个 Shuffle 过程,则每个 Shuffle 之前的操作都是一个独立 Stage
  • Spark 遇到宽依赖时划分一个新 Stage,遇到窄依赖则把该 RDD 的操作并入当前 Stage
  • 因为宽依赖通常涉及 Shuffle,所以 Spark 直接把 Shuffle 操作定义为 Stage 划分的边界
RDD(窄依赖)→ 并入当前 Stage → ... → Shuffle(宽依赖)→ 划分新 Stage → ... → 下一个 Stage

类比理解:如果你熟悉 Hadoop MapReduce 的 Shuffle 过程(Map 端输出经过分区、排序后传给 Reduce 端),Spark 中"宽依赖 = 需要 Shuffle = Stage 边界"和 MapReduce 里 Map 阶段与 Reduce 阶段的分界是同一种思想的延伸,只是 Spark 把它推广到了任意多个 Stage 的 DAG(有向无环图)上,而不局限于两阶段。


03 环境搭建实战 ​

基础环境软件清单 ​

在正式搭建 Spark 环境前,需要准备好基础虚拟机环境:

相关软件安装包
操作系统Rocky-9.6-x86_64-dvd.iso
虚拟化工具VMware-workstation-full-17.6.0-24238078.exe
SSH 连接工具MobaXterm_Portable_v22.1.zip
JDKjdk-8u461-linux-x64.tar.gz
Hadoophadoop-3.3.6.tar.gz
MySQLmysql-8.0.30-1.el9.x86_64.rpm-bundle.tar
Hiveapache-hive-3.1.3-bin.tar.gz

💡 Spark 安装包为 spark-3.5.1-bin-hadoop3-scala2.13.tgz,需自行下载并上传至虚拟机的 /opt/apps/ 目录(三种搭建方式均以此为起点)。

Step 1 · 搭建单机版环境 ​

流程:下载安装包 → 上传至虚拟机 → 解压 → 配置环境变量 → 功能测试。

bash
# 代码1-6  解压Spark安装包
tar -zxf /opt/apps/spark-3.5.1-bin-hadoop3-scala2.13.tgz -C /usr/local/

# 代码1-7  配置环境变量(编辑 /etc/profile,追加以下内容)
# SPARK_HOME
export SPARK_HOME=/usr/local/spark-3.5.1-bin-hadoop3-scala2.13
export PATH=$PATH:$SPARK_HOME/bin

# 刷新环境变量
source /etc/profile

# 代码1-8  功能测试:使用 SparkPi 计算 Pi 值
cd $SPARK_HOME/bin/
./run-example SparkPi 2

✅ 验证是否成功:命令执行后终端会打印出类似 Pi is roughly 3.1415... 的结果,看到这行说明 Spark 单机版本地模式(local mode)已经可以正常运行任务。

spark-shell 的几种启动方式 ​

spark-shell 是 Spark 提供的交互式命令行工具,几种典型启动方式如下,建议对照上文"Standalone / YARN 模式"一起理解:

bash
# 代码1-2  最基础启动(本地模式)
cd /usr/local/spark-3.5.1-bin-hadoop3-scala2.13/
./bin/spark-shell

# 代码1-3  启动时手动指定资源(每个 Executor 512m 内存,总共 3 个核)
./bin/spark-shell --executor-memory 512m --total-executor-cores 3

# 代码1-4  以 YARN 客户端模式启动(可正常交互)
./bin/spark-shell --master yarn --deploy-mode client

# 代码1-5  以 YARN 集群模式启动(无法成功——原因见上文"YARN模式"小节)
./bin/spark-shell --master yarn --deploy-mode cluster

Step 2 · 搭建单机伪分布式集群 ​

流程:解压安装包 → 修改 spark-env.sh → 配置环境变量 → 启动集群 → 查看进程 → 功能测试。

bash
# 代码1-6  解压Spark安装包
tar -zxf /opt/apps/spark-3.5.1-bin-hadoop3-scala2.13.tgz -C /usr/local/

# 代码1-7  配置环境变量(/etc/profile)
export SPARK_HOME=/usr/local/spark-3.5.1-bin-hadoop3-scala2.13
export PATH=$PATH:$SPARK_HOME/bin

# 代码1-9  复制模板并重命名为 spark-env.sh
cd /usr/local/spark-3.5.1-bin-hadoop3-scala2.13/conf/
cp spark-env.sh.template spark-env.sh

📄 spark-env.sh(伪分布式)

bash
# 代码1-10  配置spark-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_461
export HADOOP_HOME=/usr/local/hadoop-3.3.6
export HADOOP_CONF_DIR=/usr/local/hadoop-3.3.6/etc/hadoop
export SPARK_MASTER_IP=master
export SPARK_LOCAL_IP=master
bash
# 代码1-11  启动Spark集群
cd $SPARK_HOME/sbin/
./start-all.sh

# 代码1-12  功能测试
cd $SPARK_HOME/bin/
./run-example SparkPi 2

spark-env.sh 参数说明(伪分布式)

参数描述
JAVA_HOMEJava 的安装路径
HADOOP_HOMEHadoop 的安装路径
HADOOP_CONF_DIRHadoop 配置文件的路径
SPARK_MASTER_IPSpark 主节点的 IP 地址或机器名
SPARK_LOCAL_IPSpark 本地的 IP 地址或机器名

Step 3 · 搭建完全分布式集群 ​

完全分布式集群采用主从模式:一台机器作为主节点(Master),其他机器作为工作节点(Worker)。本项目使用 3 个节点——1 个主节点 + 2 个工作节点,且主节点同时承担部分工作节点的任务(即 master 自身也在 workers 名单中)。

流程:解压安装包 → 修改配置文件(spark-env.sh / workers / spark-defaults.conf)→ 将 Spark 目录远程复制到子节点 → 配置并刷新环境变量 → 启动 Hadoop 集群并查看进程 → 启动 Spark 集群并查看进程 → 浏览器访问 Web 监控端口。

bash
# 代码1-6  解压Spark安装包(master节点执行)
tar -zxf /opt/apps/spark-3.5.1-bin-hadoop3-scala2.13.tgz -C /usr/local/

# 代码1-9  复制模板并重命名为 spark-env.sh
cd /usr/local/spark-3.5.1-bin-hadoop3-scala2.13/conf/
cp spark-env.sh.template spark-env.sh

📄 spark-env.sh(完全分布式)

bash
# 代码1-13  spark-env.sh配置内容
export JAVA_HOME=/usr/local/jdk1.8.0_461
export HADOOP_HOME=/usr/local/hadoop-3.3.6
export HADOOP_CONF_DIR=/usr/local/hadoop-3.3.6/etc/hadoop
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
export SPARK_MASTER_IP=master
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_MEMORY=512m
export SPARK_WORKER_CORES=1
export SPARK_EXECUTOR_MEMORY=512m
export SPARK_EXECUTOR_CORES=1
export SPARK_WORKER_INSTANCES=1

📄 workers

# 代码1-14  workers文件配置内容
master
slave1
slave2

📄 spark-defaults.conf

# 代码1-15  spark-defaults.conf文件配置内容
spark.master                    spark://master:7077
spark.eventLog.enabled          true
spark.eventLog.dir              hdfs://master:8020/spark-logs
spark.history.fs.logDirectory   hdfs://master:8020/spark-logs
bash
# 代码1-16  将Spark安装目录远程复制至其他节点
scp -r /usr/local/spark-3.5.1-bin-hadoop3-scala2.13/ slave1:/usr/local/
scp -r /usr/local/spark-3.5.1-bin-hadoop3-scala2.13/ slave2:/usr/local/

# 代码1-17  启动Hadoop集群并创建/spark-logs目录
$HADOOP_HOME/sbin/start-all.sh
$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver
hdfs dfs -mkdir /spark-logs

# 代码1-18  启动Spark集群
$SPARK_HOME/sbin/start-all.sh
$SPARK_HOME/sbin/start-history-server.sh

监控入口

地址用途
http://master:8080Spark Master 的 Web UI,监控集群实时状态、Worker 节点,以及正在运行/已完成的作业信息
http://master:18080Spark History Server 端口,记录已完成和正在运行的作业信息及具体日志链接,便于事后排查

配置参数速查表 ​

spark-env.sh(新增参数,相对伪分布式)

参数描述
LD_LIBRARY_PATHHadoop 动态链接库的路径
SPARK_MASTER_PORTSpark 主节点的端口号
SPARK_WORKER_MEMORYWorker 节点能给予 Executor 的内存大小
SPARK_WORKER_CORES每个节点可以使用的内核数
SPARK_EXECUTOR_MEMORY每个 Executor 的内存大小
SPARK_EXECUTOR_CORES每个 Executor 的内核数
SPARK_WORKER_INSTANCES每个节点的 Worker 进程数

spark-defaults.conf

参数解释
spark.masterSpark 主节点所在机器及端口,默认写法为 spark://host:port
spark.eventLog.enabled是否启动任务日志功能,默认为 true
spark.eventLog.dir任务日志默认存放位置,一般配置为 HDFS 路径
spark.history.fs.logDirectory存放历史应用日志文件的目录

⚠️ 选择题易错点:/etc/profile 配置的是本地系统环境变量;spark-env.sh 配置 Spark 集群运行时环境变量;workers 配置 Spark 集群的工作节点;spark-defaults.conf 配置 Spark 应用程序的默认参数——四个文件职责不同,不要混淆。

常见问题排查(补充经验,非教材原文) ​

问题排查建议
start-all.sh 后 Worker 进程未起来优先检查 workers 文件内容是否正确、各节点间是否已配置 SSH 免密登录,以及子节点上的 Spark 目录是否与 scp 分发的内容一致
Web UI(8080/18080)打不开确认防火墙 / 安全组是否放行对应端口,以及是否用了正确的模式(YARN 模式下 8080 本就不可用,属于正常现象而非故障)
spark-env.sh 修改未生效修改配置文件后需要重启 Spark 集群(stop-all.sh 再 start-all.sh)才能生效,不会像 /etc/profile 那样 source 一下就够
spark-logs 目录相关报错确认 Hadoop 集群已启动且 hdfs dfs -mkdir /spark-logs 成功执行,History Server 依赖该目录读取历史日志

04 自测练习 ​

共 10 题,建议先独立作答再核对答案。

Q1. Spark 架构中的组件不包括以下哪一项? A. Driver Program B. SparkContext C. Worker Node D. ResourceManager

点击查看答案

答案:D Spark 架构中的组件包括 Driver Program、SparkContext、Cluster Manager、Worker Node 等,ResourceManager 是 Hadoop(YARN)中的组件,不属于 Spark 自身架构。

Q2. 关于 Spark 相对 Hadoop 的改进,下列说法最准确的是?

点击查看答案

答案:D 相比于 Hadoop,Spark 继承了 MapReduce 分布式计算的优点,并改进了 MapReduce 的明显缺陷(如中间结果落盘导致的高延迟问题)。

Q3. 以下哪一项不属于 Spark 的运行模式?

点击查看答案

答案:D Spark 的运行模式包括 Standalone、YARN、Mesos 和 Kubernetes 共 4 种;HDFS 是 Hadoop 集群中的分布式文件系统,属于存储层,不是运行模式。

Q4. 用于实时数据流式计算的 Spark 组件是?

点击查看答案

答案:C Spark MLlib 用于机器学习场景,Spark SQL 用于 SQL 查询,Spark Streaming 用于实时数据流式计算,Spark GraphX 用于图计算应用。

Q5. 下列关于"行动操作"的描述,正确的是?

点击查看答案

答案:B 行动操作主要指将 RDD 存储至硬盘中,或触发转换操作执行的操作。

Q6. Spark 诞生自 UC Berkeley 的 "AMP" 实验室,"AMP" 分别指什么?

点击查看答案

答案:A "AMP" 分别指算法(Algorithm)、机器(Machine)、人(People)。

Q7. 以下哪一项不是 Spark RDD 常用的转换操作?

点击查看答案

答案:B Spark RDD 常用的转换操作有 map()、filter()、flatMap()、union()、groupByKey()、reduceByKey() 等。

Q8. 以下哪一项不是 Spark RDD 常用的行动操作?

点击查看答案

答案:A Spark RDD 常用的行动操作有 reduce()、collect()、count()、first()、take()、saveAsTextFile()、foreach() 等。

Q9. 用于配置 Spark 集群工作节点的文件是?

点击查看答案

答案:C/etc/profile 用于配置本地系统环境变量;spark-env.sh 用于配置 Spark 集群运行时的环境变量;workers 用于配置 Spark 集群的工作节点;spark-defaults.conf 用于配置 Spark 应用程序的默认参数。

Q10. Spark 集群启动后不会产生以下哪个进程?

点击查看答案

答案:C Spark 集群启动后的进程包括 Master(主节点)、Worker(工作节点)、HistoryServer(历史日志服务);JobHistoryServer 是 Hadoop 集群中 MapReduce 作业的历史日志服务进程,不属于 Spark 进程。


05 实习知识衔接 ​

结合你已有的 Java / Scala / Hadoop / Hive 基础,这部分内容在企业实习中通常这样被用到:

  • 集群部署与运维类岗位:企业生产环境的 Spark 集群多以 YARN 模式运行(复用已有的 Hadoop 资源池,而不是单独维护一套 Standalone 集群),本笔记中 client / cluster 模式的区别是运维和排障时最常被问到的基础问题之一。
  • 数据开发类岗位:企业里更常见的是直接使用 Spark SQL(写法接近 Hive SQL)或 PySpark / Scala Spark 处理离线 ETL,RDD 的算子逻辑是理解 DataFrame/Dataset 底层执行计划的基础,即使日常不直接写 RDD,面试中仍常被追问"转换与行动操作的区别""宽窄依赖如何影响性能"。
  • 简历与面试表达建议:可以用一句话概括本项目的实操成果,例如"独立完成 Spark Standalone 完全分布式集群的搭建与调优,包括与 Hadoop 集群的整合(HDFS 存储、YARN 资源调度)及 History Server 日志监控配置"。
  • 与 Hive 的关系:Spark 可以直接读取 Hive 的元数据(通过 Spark SQL 集成 Hive Metastore),企业中常见"Hive 建仓、Spark 计算"的组合,理解 Spark 如何从 Hive 读数据,是后续学习 Spark SQL 的重要前提。

06 自查清单 ​

对照以下清单自我检查,全部打钩即代表本项目内容已经掌握。

  • [ ] 能说出 Spark 的五大特点,并解释"为什么 Spark 比 Hadoop MapReduce 快"
  • [ ] 能说出 Spark 生态圈中至少 4 个组件的名称与用途
  • [ ] 能区分 Standalone 模式下 Driver Program 在主节点 / 本地客户端两种不同位置的场景
  • [ ] 能说出 YARN client 模式与 cluster 模式的区别,并解释为什么 spark-shell 只能用 client 模式
  • [ ] 能说出至少 5 个转换算子和 5 个行动算子,并解释惰性求值机制
  • [ ] 能解释宽依赖 / 窄依赖的定义,以及 Stage 是如何划分的
  • [ ] 能独立完成 Spark 单机版环境搭建,并用 SparkPi 验证成功
  • [ ] 能独立完成单机伪分布式集群搭建,理解 spark-env.sh 各参数含义
  • [ ] 能独立完成完全分布式集群搭建,包括 workers、spark-defaults.conf 配置与节点间分发
  • [ ] 能通过 8080 / 18080 两个 Web UI 查看集群状态与历史作业

基于 Vite 强力驱动 | 纯静态轻量托管