主题
课程介绍
最后我们学习Spark分布式内存计算环境的部署。Spark是分布式内存计算引擎,比MapReduce性能高10-100倍,支持批处理和流处理。Spark依赖Hadoop HDFS和YARN,需要先启动Hadoop集群。安装Spark需要准备好JDK、Hadoop和ZooKeeper环境。下载安装包后,解压并创建软链接。然后配置环境变量和提交作业到集群,验证计算结果。Spark是大数据计算的核心工具。
1. Spark概述
1. 1 什么是Spark
定义: Apache Spark是一款开源的分布式内存计算引擎,用于处理大规模数据集的计算任务。Spark基于内存计算,比传统的MapReduce计算框架性能更高,支持离线计算和实时计算。
核心特点:
- 分布式内存计算:基于内存进行计算,性能远超磁盘计算
- 统一计算引擎:支持批处理、流处理、SQL查询、机器学习、图计算等多种计算模式
- 易用性:提供丰富的API(Scala、Java、Python、R)
- 高性能:内存计算速度比MapReduce快10-100倍
- 可扩展性:支持水平扩展,可运行在数千个节点上
- 容错性:基于RDD的血统机制实现容错
- 学习曲线:相对较陡,但功能强大
1. 2 Spark应用场景
典型应用场景:
- 离线批处理:ETL数据处理、数据清洗、数据转换
- 实时流处理:实时数据分析、实时推荐、实时监控
- 交互式查询:数据仓库查询、OLAP分析
- 机器学习:模型训练、特征工程、数据挖掘
- 图计算:社交网络分析、推荐系统、路径规划
1. 3 Spark vs Hadoop MapReduce对比
| 特性 | Spark | Hadoop MapReduce |
|---|---|---|
| 计算模式 | 内存计算 | 磁盘计算 |
| 计算速度 | 快(10-100倍) | 慢 |
| 编程模型 | RDD、DataFrame、Dataset | MapReduce |
| API丰富度 | 丰富(Scala、Java、Python、R) | 较少(Java) |
| 实时处理 | 支持 | 不支持 |
| 机器学习 | MLlib库 | 需要Mahout |
| 资源管理 | Standalone、YARN、Mesos | YARN |
| 学习曲线 | 较陡 | 较平缓 |
2. 环境准备
2. 1 前置要求
软件依赖:
- JDK:Java开发环境(版本1.8或以上)
- Hadoop:Hadoop集群(已安装并启动)
集群节点:
- NODE1:192.168.88.131(Master节点)
- NODE2:192.168.88.132(Worker节点)
- NODE3:192.168.88.133(Worker节点)
2. 2 检查前置环境
步骤1:检查JDK环境
bash
# 在每台节点上检查Java版本
java -versionbash
# 输出示例:
# java version "1.8.0_XXX"
# Java(TM) SE Runtime Environment (build 1.8.0_XXX-XXX)
# Java HotSpot(TM) 64-Bit Server VM (build 25.XXX-XXX, mixed mode)步骤2:检查Hadoop HDFS状态
bash
# 在每台节点上检查Hadoop进程
jpsbash
# 应该看到NameNode、DataNode等进程步骤3:启动Hadoop HDFS(如果未启动)
bash
# 在NODE1上启动Hadoop
cd /export/server/hadoop
sbin/start-all.shbash
# 验证Hadoop启动状态
jps3. Spark安装部署
3. 1 下载Spark安装包
步骤1:在NODE1上下载Spark
bash
# 使用wget命令下载Spark安装包
cd /export/software
wget https://archive.apache.org/dist/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgzbash
# 等待下载完成步骤2:验证下载文件
bash
# 查看下载的文件
ls -lh spark-2.4.5-bin-hadoop2.7.tgzbash
# 输出示例:
# -rw-r--r-- 1 root root 220M XXX日期 spark-2.4.5-bin-hadoop2.7.tgz3. 2 解压Spark安装包
步骤1:解压到指定目录
bash
# 解压Spark安装包到/export/server目录
tar -zxvf spark-2.4.5-bin-hadoop2.7.tgz -C /export/server步骤2:查看解压结果
bash
# 进入/export/server目录
cd /export/server
# 查看解压后的文件夹
ls -ld spark-2.4.5-bin-hadoop2.7bash
# 输出示例:
# drwxr-xr-x 10 root root 4096 XXX日期 spark-2.4.5-bin-hadoop2.73. 3 创建软链接
步骤1:创建软链接
bash
# 创建spark软链接
ln -s /export/server/spark-2.4.5-bin-hadoop2.7 /export/server/sparkbash
# 查看软链接
ls -l /export/server | grep spark
# 输出示例:
# lrwxrwxrwx 1 root root 30 XXX日期 spark -> /export/server/spark-2.4.5-bin-hadoop2.7
# drwxr-xr-x 10 root root 4096 XXX日期 spark-2.4.5-bin-hadoop2.7步骤2:验证软链接
bash
# 进入软链接目录
cd /export/server/spark
# 查看目录内容
ls4. 配置Spark
4. 1 修改配置文件名
步骤1:进入配置目录
bash
# 进入Spark配置目录
cd /export/server/spark/conf步骤2:查看配置文件
bash
# 查看配置文件列表
ls -lbash
# 输出示例:
# -rw-r--r-- 1 root root 2025 XXX日期 docker.properties.template
# -rw-r--r-- 1 root root 1006 XXX日期 fairscheduler.xml.template
# -rw-r--r-- 1 root root 2255 XXX日期 log4j.properties.template
# -rw-r--r-- 1 root root 2025 XXX日期 metrics.properties.template
# -rw-r--r-- 1 root root 1108 XXX日期 spark-defaults.conf.template
# -rw-r--r-- 1 root root 6225 XXX日期 spark-env.sh.template
# -rw-r--r-- 1 root root 735 XXX日期 slaves.template步骤3:重命名spark-env.sh.template
bash
# 重命名spark-env.sh.template为spark-env.sh
mv spark-env.sh.template spark-env.shbash
# 验证重命名结果
ls -l spark-env.sh步骤4:重命名slaves.template
bash
# 重命名slaves.template为slaves
mv slaves.template slavesbash
# 验证重命名结果
ls -l slaves4. 2 修改spark-env.sh文件
步骤1:编辑spark-env.sh文件
bash
# 编辑spark-env.sh文件
vim spark-env.sh步骤2:添加环境变量配置 在文件头部添加以下内容:
bash
# Java Home
export JAVA_HOME=/export/server/jdk
# Spark Home
export SPARK_HOME=/export/server/spark
# Spark Master Hostname
export SPARK_MASTER_HOST=node1
# Spark Master Port
export SPARK_MASTER_PORT=7077
# Spark Worker Memory
export SPARK_WORKER_MEMORY=1g
# Spark Worker Cores
export SPARK_WORKER_CORES=1步骤3:保存退出
bash
# 保存并退出
:wq4. 3 修改slaves文件
步骤1:编辑slaves文件
bash
# 编辑slaves文件
vim slaves步骤2:清空文件内容
bash
# 删除文件中的所有内容
:%d步骤3:添加Worker节点
node1
node2
node3步骤4:保存退出
bash
# 保存并退出
:wq5. 分发Spark到其他节点
5. 1 分发Spark到NODE2
步骤1:使用SCP分发Spark
bash
# 在NODE1上执行
cd /export/server
scp -r spark-2.4.5-bin-hadoop2.7 node2:`pwd`步骤2:在NODE2上创建软链接
bash
# 在NODE2上执行
cd /export/server
ln -s /export/server/spark-2.4.5-bin-hadoop2.7 /export/server/sparkbash
# 验证软链接
ls -l | grep spark5. 2 分发Spark到NODE3
步骤1:使用SCP分发Spark
bash
# 在NODE1上执行
cd /export/server
scp -r spark-2.4.5-bin-hadoop2.7 node3:`pwd`步骤2:在NODE3上创建软链接
bash
# 在NODE3上执行
cd /export/server
ln -s /export/server/spark-2.4.5-bin-hadoop2.7 /export/server/sparkbash
# 验证软链接
ls -l | grep spark注意事项:
- 分发时使用的是
spark-2.4.5-bin-hadoop2.7实际目录,不是软链接spark - 确保每台节点都创建了软链接
6. 启动Spark集群
6. 1 启动前检查
步骤1:检查Hadoop HDFS状态
bash
# 在NODE1上检查Hadoop进程
jpsbash
# 应该看到:
# NameNode
# DataNode
# SecondaryNameNode步骤2:检查Spark配置
bash
# 查看Spark配置文件
cat /export/server/spark/conf/spark-env.sh
# 查看Worker节点列表
cat /export/server/spark/conf/slaves6. 2 启动Spark集群
步骤1:启动Spark集群
bash
# 在任意节点上执行(推荐在NODE1上)
cd /export/server/spark
sbin/start-all.sh步骤2:查看启动日志
bash
# 查看Master日志
tail -f /export/server/spark/logs/spark-root-org.apache.spark.deploy.master.Master-1-node1.out
# 查看Worker日志
tail -f /export/server/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-node1.out步骤3:验证Spark进程
bash
# 在NODE1上检查进程
jpsbash
# 应该看到:
# Master
# Workerbash
# 在NODE2上检查进程
jpsbash
# 应该看到:
# Workerbash
# 在NODE3上检查进程
jpsbash
# 应该看到:
# Worker6. 3 Spark集群架构
集群角色:
| 节点 | 角色 | 说明 |
|---|---|---|
| NODE1 | Master + Worker | 管理节点 + 工作节点 |
| NODE2 | Worker | 工作节点 |
| NODE3 | Worker | 工作节点 |
架构说明:
- Master:Spark的管理者,负责集群管理、任务调度、资源分配等
- Worker:Spark的工作者,负责实际的任务执行和资源管理
7. 验证Spark集群
7. 1 通过Web界面验证
步骤1:打开浏览器
- 在浏览器中访问:
http://192.168.88.131:8081
步骤2:查看集群状态
- 查看Master节点:node1
- 查看Worker节点:node1、node2、node3
- 查看集群状态:ALIVE
步骤3:查看Worker信息
- 点击"Workers"标签
- 查看每个Worker的内存、CPU、运行任务数等信息
7. 2 通过命令行验证
步骤1:使用spark-shell验证
bash
# 在任意节点上执行
cd /export/server/spark
bin/spark-shellbash
# 等待进入Spark Shell
# 提示符变为:scala>步骤2:执行简单计算
scala
// 计算圆周率
val pi = sc.parallelize(1 to 1000000).map { i =>
val x = i * 2.0 / 1000000 - 1
val y = i * 2.0 / 1000000 - 1
if (x*x + y*y <= 1) 1 else 0
}.reduce(_ + _) * 4.0 / 1000000
// 输出结果
println(pi)bash
# 输出示例:
// 3.141592653589793步骤3:退出Spark Shell
scala
// 退出Spark Shell
:quit8. 提交测试任务
8. 1 提交Pi计算任务
步骤1:提交Spark Pi任务
bash
# 使用Spark内置的Pi计算程序
cd /export/server/spark
bin/run-example --master spark://node1:7077 SparkPi 10步骤2:查看任务执行过程
bash
# 任务执行输出示例:
# Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
# 20/XX/XX XX:XX:XX INFO SparkContext: Running Spark version 2.4.5
# 20/XX/XX XX:XX:XX INFO SparkContext: Submitted application: SparkPi
# 20/XX/XX XX:XX:XX INFO Utils: Successfully started service 'sparkDriver' on port XXXXX.
# ...
# Pi is roughly 3.141592653589793步骤3:在Web界面查看任务
- 刷新Spark Web界面
- 查看"Running Applications"或"Completed Applications"
- 查看任务详情
8. 2 提交其他测试任务
任务1:WordCount任务
bash
# 提交WordCount任务
cd /export/server/spark
bin/spark-submit --master spark://node1:7077 \
--class org.apache.spark.examples.JavaWordCount \
examples/jars/spark-examples_2.11-2.4.5.jar \
/export/data/wordcount/input任务2:SQL查询任务
bash
# 提交SQL查询任务
cd /export/server/spark
bin/spark-submit --master spark://node1:7077 \
--class org.apache.spark.examples.sql.SparkSQLExample \
examples/jars/spark-examples_2.11-2.4.5.jar9. 常见问题
9. 1 常见问题及解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| Spark无法启动 | Hadoop HDFS未启动 | 先启动Hadoop HDFS |
| Master无法启动 | 端口被占用 | 检查7077端口占用情况 |
| Worker无法连接Master | 网络不通 | 检查网络连接和防火墙 |
| 任务提交失败 | 内存不足 | 增加Worker内存配置 |
| Web界面无法访问 | 防火墙阻止 | 开放8081端口 |
| 任务运行缓慢 | 资源分配不合理 | 调整Worker核心数和内存 |
| 任务失败 | 代码错误 | 检查任务代码和日志 |
9. 2 故障排查命令
检查Spark进程:
bash
# 查看Spark相关进程
jps | grep -i sparkbash
# 输出示例:
# 12345 Master
# 12346 Worker检查Spark日志:
bash
# 查看Master日志
tail -f /export/server/spark/logs/spark-root-org.apache.spark.deploy.master.Master-1-node1.out
# 查看Worker日志
tail -f /export/server/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-node1.out检查Spark配置:
bash
# 查看Spark配置文件
cat /export/server/spark/conf/spark-env.sh
# 查看Worker节点列表
cat /export/server/spark/conf/slaves检查网络连接:
bash
# 检查Master端口
ssh node1 7077
# 检查Web端口
ssh node1 8081检查HDFS状态:
bash
# 查看HDFS状态
hdfs dfsadmin -report
# 查看HDFS目录
hdfs dfs -ls /课程总结
这节课我们学了Spark分布式内存计算环境的部署。
Spark vs Hadoop MapReduce:
- Spark基于内存计算,速度更快
- Hadoop MapReduce基于磁盘,适合海量批处理
- Spark兼容HDFS和YARN
Spark Standalone集群角色:
- Spark Master - 管理Worker
- Spark Worker - 执行任务
安装步骤:
- 确保JDK和Hadoop已安装
- 下载并解压Spark
- 配置spark-env.sh(设置JDK、Scala路径)
- 配置slaves文件(列出所有Worker节点)
- 分发Spark到集群其他节点
启动命令: start-master.sh - 启动Master start-slaves.sh - 启动所有Worker stop-all.sh - 停止所有
Web界面: Spark Master: http://主节点IP:8080
Spark是分布式内存计算框架,支持批处理、流处理、SQL查询、机器学习等。 常用端口: 8080(Web), 7077(Master端口), 7078(Worker端口)
通过本课程的学习,学员应该能够独立完成Spark Standalone集群的安装部署,并掌握Spark的基本操作技能。
课后练习
练习1(基础)- Spark基本操作
练习内容: 启动Spark Shell,创建一个包含1-100的RDD,计算RDD中所有数字的和,计算RDD中所有数字的平均值,过滤出偶数,退出Spark Shell。
提示:
- 启动Spark Shell使用命令:
cd /export/server/spark && bin/spark-shell - 创建RDD使用:
sc.parallelize(1 to 100)或sc.parallelize(List(1,2,3,...)) - 计算和使用:
.reduce(_ + _) - 计算平均值:
.mean()或 先求和再除以元素数量 - 过滤偶数使用:
.filter(_ % 2 == 0) - 退出Shell使用:
:quit
练习2(进阶)- Spark集群管理
练习内容: 查看Spark集群的Web界面,检查Spark集群的进程状态,查看Spark的日志文件,重启Spark集群,验证Spark集群重启后功能是否正常。
提示:
- Spark Web界面访问地址:
http://192.168.88.131:8080 - 检查进程使用:
jps | grep -i spark(应该看到Master和Worker进程) - Master日志路径:
/export/server/spark/logs/spark-root-org.apache.spark.deploy.master.Master-1-node1.out - Worker日志路径:
/export/server/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-node1.out - 停止集群:
cd /export/server/spark && sbin/stop-all.sh - 启动集群:
cd /export/server/spark && sbin/start-all.sh - 验证功能:提交一个简单的Pi计算任务测试
练习3(高阶)- Spark任务提交
练习内容: 提交Spark Pi计算任务,提交WordCount任务,提交SQL查询任务,在Web界面查看任务执行情况,分析任务执行日志。
提示:
- Pi计算任务:
cd /export/server/spark && bin/run-example --master spark://node1:7077 SparkPi 10 - WordCount任务需要准备输入文件到HDFS:
hdfs dfs -put /path/to/file /wordcount/input - WordCount提交命令:
bin/spark-submit --master spark://node1:7077 --class org.apache.spark.examples.JavaWordCount examples/jars/spark-examples_2.11-2.4.5.jar /export/data/wordcount/input - SQL查询任务:
bin/spark-submit --master spark://node1:7077 --class org.apache.spark.examples.sql.SparkSQLExample examples/jars/spark-examples_2.11-2.4.5.jar - Web界面可以查看"Running Applications"和"Completed Applications"标签
- 任务执行日志显示在终端输出,也可以查看Spark日志目录
练习4(实战)- 日志分析系统
练习内容: 使用Spark构建日志分析系统。收集日志数据文件(access.log),使用Spark读取日志文件,统计访问量最高的URL,统计访问量最高的IP,统计每小时访问量,生成分析报告。
提示:
- 准备access.log文件,格式类似:
IP地址 - - [时间] "请求方法 URL 协议" 状态码 大小 - 读取日志文件:
val logRDD = sc.textFile("file:///path/to/access.log")或sc.textFile("hdfs://node1:8020/path/to/access.log") - 解析日志使用字符串分割和正则表达式
- 统计URL访问量:
logRDD.map(line => 提取URL).map(url => (url, 1)).reduceByKey(_ + _) - 统计IP访问量:
logRDD.map(line => 提取IP).map(ip => (ip, 1)).reduceByKey(_ + _) - 按时间统计:使用
mapValues或reduceByKey按小时分组 - 排序查找最高:
.sortBy(_._2, false).take(10) - 保存结果:
.saveAsTextFile("output_path")
练习5(实战)- 实时数据处理
练习内容: 使用Spark Streaming处理实时数据。创建Spark Streaming应用,接收实时数据流,进行实时统计和分析,输出实时结果。
提示:
- Spark Streaming使用
StreamingContext创建流式应用 - 数据源可以是:socket、Kafka、Flume、文件等
- 示例:
val ssc = new StreamingContext(sc, Seconds(5)) - 接收socket数据:
val lines = ssc.socketTextStream("localhost", 9999) - 实时统计:使用
reduceByKeyAndWindow进行窗口统计 - 启动流处理:
ssc.start()和ssc.awaitTermination() - 可以使用
nc -lk 9999模拟发送数据到端口