对于开发测试环境,我推荐使用 Standalone 集群模式 或 Local 模式 ,这两种部署方式最适合开发测试场景:
🚀 推荐部署模式:Standalone 集群模式
✅ 优势
- 独立部署,不依赖其他系统
- 配置简单,启动快速
- 完全模拟分布式环境
- 便于调试和监控
- 资源占用可控
📋 详细部署步骤(基于 CentOS 7.5)
1. 环境准备(所有节点)
# 安装 JDK 11
sudo yum install -y java-11-openjdk-devel
# 设置 JAVA_HOME
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk' | sudo tee /etc/profile.d/java.sh
source /etc/profile.d/java.sh
2. 下载和解压 Spark
wget https://archive.apache.org/dist/spark/spark-3.2.0/spark-3.2.0-bin-hadoop3.2.tgz
tar -zxvf spark-3.2.0-bin-hadoop3.2.tgz -C /opt/
sudo ln -s /opt/spark-3.2.0-bin-hadoop3.2 /opt/spark
3. 配置环境变量
sudo tee /etc/profile.d/spark.sh << 'EOF'
export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
export PYSPARK_PYTHON=python3
EOF
source /etc/profile
4. 配置 Spark(在 Master 节点操作)
spark-env.sh
sudo cp $SPARK_HOME/conf/spark-env.sh.template $SPARK_HOME/conf/spark-env.sh
sudo tee -a $SPARK_HOME/conf/spark-env.sh << 'EOF'
# 基础配置
SPARK_MASTER_HOST=hadoop1
SPARK_MASTER_PORT=7077
SPARK_MASTER_WEBUI_PORT=8080
SPARK_WORKER_CORES=4
SPARK_WORKER_MEMORY=4g
SPARK_WORKER_PORT=8888
# 开发优化
SPARK_LOCAL_DIRS=/data/spark/tmp
SPARK_WORKER_DIR=/data/spark/work
SPARK_LOG_DIR=/data/spark/logs
SPARK_PID_DIR=/data/spark/pids
# 历史服务器
SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://hadoop1:9000/spark-logs"
EOF
workers
sudo cp $SPARK_HOME/conf/workers.template $SPARK_HOME/conf/workers
sudo tee $SPARK_HOME/conf/workers << 'EOF'
hadoop2
hadoop3
EOF
spark-defaults.conf
sudo cp $SPARK_HOME/conf/spark-defaults.conf.template $SPARK_HOME/conf/spark-defaults.conf
sudo tee -a $SPARK_HOME/conf/spark-defaults.conf << 'EOF'
# 基础配置
spark.master spark://hadoop1:7077
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hadoop1:9000/spark-logs
spark.history.fs.logDirectory hdfs://hadoop1:9000/spark-logs
# 开发优化
spark.driver.memory 2g
spark.executor.memory 2g
spark.executor.cores 2
spark.default.parallelism 8
spark.sql.shuffle.partitions 8
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.sql.catalogImplementation hive
EOF
5. 创建数据目录(所有节点)
sudo mkdir -p /data/spark/{tmp,work,logs,pids}
sudo chown -R $(whoami):$(whoami) /data/spark
6. 配置 Hadoop 集成(可选)
# 设置 Hadoop 配置文件路径
echo 'export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop' | sudo tee -a $SPARK_HOME/conf/spark-env.sh
# 复制 Hadoop 配置文件
sudo cp /usr/local/hadoop/etc/hadoop/core-site.xml $SPARK_HOME/conf/
sudo cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml $SPARK_HOME/conf/
7. 分发 Spark 到所有节点
scp -r /opt/spark-3.2.0-bin-hadoop3.2 hadoop2:/opt/
scp -r /opt/spark-3.2.0-bin-hadoop3.2 hadoop3:/opt/
# 创建符号链接
ssh hadoop2 "ln -s /opt/spark-3.2.0-bin-hadoop3.2 /opt/spark"
ssh hadoop3 "ln -s /opt/spark-3.2.0-bin-hadoop3.2 /opt/spark"
# 分发环境变量
scp /etc/profile.d/spark.sh hadoop2:/etc/profile.d/
scp /etc/profile.d/spark.sh hadoop3:/etc/profile.d/
# 应用环境变量
ssh hadoop2 "source /etc/profile"
ssh hadoop3 "source /etc/profile"
8. 创建 HDFS 日志目录
hdfs dfs -mkdir -p /spark-logs
hdfs dfs -chmod 777 /spark-logs
🚦 启动 Spark 集群
1. 启动 Master
$SPARK_HOME/sbin/start-master.sh
2. 启动 Workers
$SPARK_HOME/sbin/start-workers.sh
3. 启动历史服务器
$SPARK_HOME/sbin/start-history-server.sh
🔍 验证集群状态
1. 检查进程
# Master 节点
jps | grep -E 'Master|HistoryServer'
# Worker 节点
jps | grep Worker
2. Web UI 访问
Master Web UI: http://192.168.16.219:8080
History Server: http://192.168.16.219:18080
3. 命令行验证
# 运行 Spark Shell
spark-shell --master spark://hadoop1:7077
# 在 Spark Shell 中运行
val data = 1 to 100
val rdd = sc.parallelize(data)
rdd.sum()
🔧 备选方案:Local 模式(快速开发测试)
✅ 适用场景
- 单机快速验证
- IDE 集成开发
- 单元测试/调试
📋 使用方式
1. 命令行启动
spark-shell --master local[4]
2. IDE 集成(推荐)
在 IntelliJ/Eclipse 中添加依赖:
<!-- Maven 依赖 -->
<dependency>
<groupid>org.apache.spark</groupid>
<artifactid>spark-core_2.12</artifactid>
<version>3.2.0</version>
</dependency>
<dependency>
<groupid>org.apache.spark</groupid>
<artifactid>spark-sql_2.12</artifactid>
<version>3.2.0</version>
</dependency>
示例代码:
import org.apache.spark.sql.SparkSession
object LocalSparkApp {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("LocalSpark")
.master("local[4]")
.getOrCreate()
import spark.implicits._
val data = Seq(("Java", 20000), ("Python", 100000), ("Scala", 3000))
val df = data.toDF("Language", "Users")
df.show()
spark.stop()
}
}
3. PySpark 开发
# 启动 PySpark shell
pyspark --master local[4]
# 或直接运行 Python 脚本
spark-submit --master local[4] your_script.py
⚙️ 部署模式对比
模式 | 复杂度 | 资源需求 | 适用场景 | 生产可用 |
---|---|---|---|---|
Standalone | ★★☆☆☆ | 中等 | 开发测试、小规模生产 | ✅ |
Local | ★☆☆☆☆ | 低 | 本地开发调试 | ❌ |
YARN | ★★★★☆ | 高 | 大规模生产 | ✅ |
Kubernetes | ★★★★☆ | 高 | 云原生环境 | ✅ |
Mesos | ★★★★☆ | 高 | 混合集群 | ✅ |
🛠️ 开发测试环境优化配置
spark-defaults.conf 优化
# 内存优化
spark.driver.memory=2g
spark.executor.memory=2g
spark.memory.fraction=0.6
# 序列化优化
spark.serializer=org.apache.spark.serializer.KryoSerializer
spark.kryoserializer.buffer.max=256m
# 动态分配
spark.dynamicAllocation.enabled=true
spark.dynamicAllocation.minExecutors=1
spark.dynamicAllocation.maxExecutors=4
# SQL 优化
spark.sql.adaptive.enabled=true
spark.sql.shuffle.partitions=8
日志配置优化
# 修改 log4j.properties
sudo cp $SPARK_HOME/conf/log4j.properties.template $SPARK_HOME/conf/log4j.properties
sudo sed -i 's/INFO/WARN/g' $SPARK_HOME/conf/log4j.properties
💡 开发技巧
1. 使用 Spark Shell 交互开发
spark-shell --master spark://hadoop1:7077 --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.2.0
2. 使用 Spark SQL
val df = spark.read.json("hdfs://hadoop1:9000/data/sample.json")
df.createOrReplaceTempView("people")
val results = spark.sql("SELECT name, age FROM people WHERE age > 20")
results.show()
3. 调试技巧
// 查看执行计划
df.explain(true)
// 检查分区
df.rdd.partitions.size
// 使用本地检查点
df.localCheckpoint()
🚨 注意事项
版本兼容性 :
- Scala 版本需匹配(Spark 3.2.0 使用 Scala 2.12)
- Hadoop 版本兼容(Hadoop 3.2+ 推荐)
内存配置 :
# 在 spark-env.sh 中调整 SPARK_DRIVER_MEMORY=4g SPARK_EXECUTOR_MEMORY=4g
Python 环境 :
# 安装 PySpark 依赖 sudo yum install -y python3 python3-pip pip3 install pyspark==3.2.0 pandas pyarrow
🔄 集群管理命令
常用命令
# 启动集群
$SPARK_HOME/sbin/start-all.sh
# 停止集群
$SPARK_HOME/sbin/stop-all.sh
# 启动历史服务器
$SPARK_HOME/sbin/start-history-server.sh
# 停止历史服务器
$SPARK_HOME/sbin/stop-history-server.sh
作业提交
# 提交 Scala 作业
spark-submit --master spark://hadoop1:7077 \
--class org.apache.spark.examples.SparkPi \
$SPARK_HOME/examples/jars/spark-examples_2.12-3.2.0.jar
# 提交 Python 作业
spark-submit --master spark://hadoop1:7077 \
$SPARK_HOME/examples/src/main/python/pi.py
🧪 测试示例
1. 运行 Spark Pi 示例
spark-submit --master spark://hadoop1:7077 \
--class org.apache.spark.examples.SparkPi \
$SPARK_HOME/examples/jars/spark-examples_2.12-3.2.0.jar 100
2. 运行 WordCount 示例
# 准备数据
hdfs dfs -put $SPARK_HOME/README.md /input/spark/README.md
# 提交作业
spark-submit --master spark://hadoop1:7077 \
--class org.apache.spark.examples.JavaWordCount \
$SPARK_HOME/examples/jars/spark-examples_2.12-3.2.0.jar \
hdfs://hadoop1:9000/input/spark/README.md
📈 生产环境演进路径
开发测试环境(Standalone)
↓
小规模生产环境(Standalone)
↓
中大规模生产环境(YARN/Kubernetes)
↓
云原生环境(Kubernetes Operator)
🧹 卸载 Spark
# 停止服务
$SPARK_HOME/sbin/stop-all.sh
$SPARK_HOME/sbin/stop-history-server.sh
# 删除文件
sudo rm -rf /opt/spark-3.2.0-bin-hadoop3.2
sudo rm /opt/spark
sudo rm /etc/profile.d/spark.sh
# 清理数据
sudo rm -rf /data/spark
hdfs dfs -rm -r /spark-logs
对于开发测试环境, Standalone 集群模式 提供了最佳平衡点,既能模拟分布式环境,又保持了简单性。当需要快速迭代时,可结合 Local 模式 在 IDE 中直接调试。