项目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 一行即可完成:
// 代码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 并调度 |
SparkContext | Spark 应用与集群交互的入口,代表与集群管理器的一条连接 |
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 是访问不了的(这是初学者最常见的困惑点之一)。
# 代码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 |
| JDK | jdk-8u461-linux-x64.tar.gz |
| Hadoop | hadoop-3.3.6.tar.gz |
| MySQL | mysql-8.0.30-1.el9.x86_64.rpm-bundle.tar |
| Hive | apache-hive-3.1.3-bin.tar.gz |
💡 Spark 安装包为
spark-3.5.1-bin-hadoop3-scala2.13.tgz,需自行下载并上传至虚拟机的/opt/apps/目录(三种搭建方式均以此为起点)。
Step 1 · 搭建单机版环境
流程:下载安装包 → 上传至虚拟机 → 解压 → 配置环境变量 → 功能测试。
# 代码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 模式"一起理解:
# 代码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 clusterStep 2 · 搭建单机伪分布式集群
流程:解压安装包 → 修改 spark-env.sh → 配置环境变量 → 启动集群 → 查看进程 → 功能测试。
# 代码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(伪分布式)
# 代码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# 代码1-11 启动Spark集群
cd $SPARK_HOME/sbin/
./start-all.sh
# 代码1-12 功能测试
cd $SPARK_HOME/bin/
./run-example SparkPi 2spark-env.sh 参数说明(伪分布式)
| 参数 | 描述 |
|---|---|
JAVA_HOME | Java 的安装路径 |
HADOOP_HOME | Hadoop 的安装路径 |
HADOOP_CONF_DIR | Hadoop 配置文件的路径 |
SPARK_MASTER_IP | Spark 主节点的 IP 地址或机器名 |
SPARK_LOCAL_IP | Spark 本地的 IP 地址或机器名 |
Step 3 · 搭建完全分布式集群
完全分布式集群采用主从模式:一台机器作为主节点(Master),其他机器作为工作节点(Worker)。本项目使用 3 个节点——1 个主节点 + 2 个工作节点,且主节点同时承担部分工作节点的任务(即 master 自身也在 workers 名单中)。
流程:解压安装包 → 修改配置文件(spark-env.sh / workers / spark-defaults.conf)→ 将 Spark 目录远程复制到子节点 → 配置并刷新环境变量 → 启动 Hadoop 集群并查看进程 → 启动 Spark 集群并查看进程 → 浏览器访问 Web 监控端口。
# 代码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(完全分布式)
# 代码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# 代码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:8080 | Spark Master 的 Web UI,监控集群实时状态、Worker 节点,以及正在运行/已完成的作业信息 |
http://master:18080 | Spark History Server 端口,记录已完成和正在运行的作业信息及具体日志链接,便于事后排查 |
配置参数速查表
spark-env.sh(新增参数,相对伪分布式)
| 参数 | 描述 |
|---|---|
LD_LIBRARY_PATH | Hadoop 动态链接库的路径 |
SPARK_MASTER_PORT | Spark 主节点的端口号 |
SPARK_WORKER_MEMORY | Worker 节点能给予 Executor 的内存大小 |
SPARK_WORKER_CORES | 每个节点可以使用的内核数 |
SPARK_EXECUTOR_MEMORY | 每个 Executor 的内存大小 |
SPARK_EXECUTOR_CORES | 每个 Executor 的内核数 |
SPARK_WORKER_INSTANCES | 每个节点的 Worker 进程数 |
spark-defaults.conf
| 参数 | 解释 |
|---|---|
spark.master | Spark 主节点所在机器及端口,默认写法为 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 查看集群状态与历史作业