跳转到内容

课程介绍

最后我们学习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对比

特性SparkHadoop MapReduce
计算模式内存计算磁盘计算
计算速度快(10-100倍)
编程模型RDD、DataFrame、DatasetMapReduce
API丰富度丰富(Scala、Java、Python、R)较少(Java)
实时处理支持不支持
机器学习MLlib库需要Mahout
资源管理Standalone、YARN、MesosYARN
学习曲线较陡较平缓

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 -version
bash
# 输出示例:
# 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进程
jps
bash
# 应该看到NameNode、DataNode等进程

步骤3:启动Hadoop HDFS(如果未启动)

bash
# 在NODE1上启动Hadoop
cd /export/server/hadoop
sbin/start-all.sh
bash
# 验证Hadoop启动状态
jps

3. 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.tgz
bash
# 等待下载完成

步骤2:验证下载文件

bash
# 查看下载的文件
ls -lh spark-2.4.5-bin-hadoop2.7.tgz
bash
# 输出示例:
# -rw-r--r-- 1 root root 220M XXX日期 spark-2.4.5-bin-hadoop2.7.tgz

3. 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.7
bash
# 输出示例:
# drwxr-xr-x 10 root root 4096 XXX日期 spark-2.4.5-bin-hadoop2.7

3. 3 创建软链接

步骤1:创建软链接

bash
# 创建spark软链接
ln -s /export/server/spark-2.4.5-bin-hadoop2.7 /export/server/spark
bash
# 查看软链接
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

# 查看目录内容
ls

4. 配置Spark

4. 1 修改配置文件名

步骤1:进入配置目录

bash
# 进入Spark配置目录
cd /export/server/spark/conf

步骤2:查看配置文件

bash
# 查看配置文件列表
ls -l
bash
# 输出示例:
# -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.sh
bash
# 验证重命名结果
ls -l spark-env.sh

步骤4:重命名slaves.template

bash
# 重命名slaves.template为slaves
mv slaves.template slaves
bash
# 验证重命名结果
ls -l slaves

4. 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
# 保存并退出
:wq

4. 3 修改slaves文件

步骤1:编辑slaves文件

bash
# 编辑slaves文件
vim slaves

步骤2:清空文件内容

bash
# 删除文件中的所有内容
:%d

步骤3:添加Worker节点

node1
node2
node3

步骤4:保存退出

bash
# 保存并退出
:wq

5. 分发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/spark
bash
# 验证软链接
ls -l | grep spark

5. 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/spark
bash
# 验证软链接
ls -l | grep spark

注意事项:

  • 分发时使用的是spark-2.4.5-bin-hadoop2.7实际目录,不是软链接spark
  • 确保每台节点都创建了软链接

6. 启动Spark集群

6. 1 启动前检查

步骤1:检查Hadoop HDFS状态

bash
# 在NODE1上检查Hadoop进程
jps
bash
# 应该看到:
# NameNode
# DataNode
# SecondaryNameNode

步骤2:检查Spark配置

bash
# 查看Spark配置文件
cat /export/server/spark/conf/spark-env.sh

# 查看Worker节点列表
cat /export/server/spark/conf/slaves

6. 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上检查进程
jps
bash
# 应该看到:
# Master
# Worker
bash
# 在NODE2上检查进程
jps
bash
# 应该看到:
# Worker
bash
# 在NODE3上检查进程
jps
bash
# 应该看到:
# Worker

6. 3 Spark集群架构

集群角色:

节点角色说明
NODE1Master + Worker管理节点 + 工作节点
NODE2Worker工作节点
NODE3Worker工作节点

架构说明:

  • 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-shell
bash
# 等待进入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
:quit

8. 提交测试任务

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.jar

9. 常见问题

9. 1 常见问题及解决方案

问题原因解决方案
Spark无法启动Hadoop HDFS未启动先启动Hadoop HDFS
Master无法启动端口被占用检查7077端口占用情况
Worker无法连接Master网络不通检查网络连接和防火墙
任务提交失败内存不足增加Worker内存配置
Web界面无法访问防火墙阻止开放8081端口
任务运行缓慢资源分配不合理调整Worker核心数和内存
任务失败代码错误检查任务代码和日志

9. 2 故障排查命令

检查Spark进程:

bash
# 查看Spark相关进程
jps | grep -i spark
bash
# 输出示例:
# 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 - 执行任务

安装步骤:

  1. 确保JDK和Hadoop已安装
  2. 下载并解压Spark
  3. 配置spark-env.sh(设置JDK、Scala路径)
  4. 配置slaves文件(列出所有Worker节点)
  5. 分发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(_ + _)
  • 按时间统计:使用mapValuesreduceByKey按小时分组
  • 排序查找最高:.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模拟发送数据到端口

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径