Apache Spark 3.2.0 开发测试环境部署指南

对于开发测试环境,我推荐使用 Standalone 集群模式Local 模式 ,这两种部署方式最适合开发测试场景:

🚀 推荐部署模式:Standalone 集群模式

✅ 优势

  • 独立部署,不依赖其他系统
  • 配置简单,启动快速
  • 完全模拟分布式环境
  • 便于调试和监控
  • 资源占用可控

📋 详细部署步骤(基于 CentOS 7.5)

1. 环境准备(所有节点)

bash 复制代码
# 安装 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

bash 复制代码
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. 配置环境变量

bash 复制代码
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
bash 复制代码
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
bash 复制代码
sudo cp $SPARK_HOME/conf/workers.template $SPARK_HOME/conf/workers
sudo tee $SPARK_HOME/conf/workers << 'EOF'
hadoop2
hadoop3
EOF
spark-defaults.conf
bash 复制代码
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. 创建数据目录(所有节点)

bash 复制代码
sudo mkdir -p /data/spark/{tmp,work,logs,pids}
sudo chown -R $(whoami):$(whoami) /data/spark

6. 配置 Hadoop 集成(可选)

bash 复制代码
# 设置 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 到所有节点

bash 复制代码
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 日志目录

bash 复制代码
hdfs dfs -mkdir -p /spark-logs
hdfs dfs -chmod 777 /spark-logs

🚦 启动 Spark 集群

1. 启动 Master

bash 复制代码
$SPARK_HOME/sbin/start-master.sh

2. 启动 Workers

bash 复制代码
$SPARK_HOME/sbin/start-workers.sh

3. 启动历史服务器

bash 复制代码
$SPARK_HOME/sbin/start-history-server.sh

🔍 验证集群状态

1. 检查进程

bash 复制代码
# 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. 命令行验证

bash 复制代码
# 运行 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. 命令行启动
bash 复制代码
spark-shell --master local[4]
2. IDE 集成(推荐)

在 IntelliJ/Eclipse 中添加依赖:

xml 复制代码
<!-- 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>

示例代码:

scala 复制代码
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 开发
bash 复制代码
# 启动 PySpark shell
pyspark --master local[4]

# 或直接运行 Python 脚本
spark-submit --master local[4] your_script.py

⚙️ 部署模式对比

模式 复杂度 资源需求 适用场景 生产可用
Standalone ★★☆☆☆ 中等 开发测试、小规模生产
Local ★☆☆☆☆ 本地开发调试
YARN ★★★★☆ 大规模生产
Kubernetes ★★★★☆ 云原生环境
Mesos ★★★★☆ 混合集群

🛠️ 开发测试环境优化配置

spark-defaults.conf 优化

properties 复制代码
# 内存优化
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

日志配置优化

bash 复制代码
# 修改 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 交互开发

bash 复制代码
spark-shell --master spark://hadoop1:7077 --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.2.0

2. 使用 Spark SQL

scala 复制代码
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 &gt; 20")
results.show()

3. 调试技巧

scala 复制代码
// 查看执行计划
df.explain(true)

// 检查分区
df.rdd.partitions.size

// 使用本地检查点
df.localCheckpoint()

🚨 注意事项

  1. 版本兼容性

    • Scala 版本需匹配(Spark 3.2.0 使用 Scala 2.12)
    • Hadoop 版本兼容(Hadoop 3.2+ 推荐)
  2. 内存配置

    bash 复制代码
    # 在 spark-env.sh 中调整
    SPARK_DRIVER_MEMORY=4g
    SPARK_EXECUTOR_MEMORY=4g
  3. Python 环境

    bash 复制代码
    # 安装 PySpark 依赖
    sudo yum install -y python3 python3-pip
    pip3 install pyspark==3.2.0 pandas pyarrow

🔄 集群管理命令

常用命令

bash 复制代码
# 启动集群
$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

作业提交

bash 复制代码
# 提交 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 示例

bash 复制代码
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 示例

bash 复制代码
# 准备数据
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

bash 复制代码
# 停止服务
$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 中直接调试。

相关推荐
知见漫记8 小时前
AI 桌面 Agent 本地执行能力技术对照:沙箱机制与权限模式拆解
大数据·人工智能
kruptos10 小时前
分布式系统怎么“选主“?Raft 共识一次讲清
开发语言·分布式·php·共识算法
xcl092510 小时前
幼儿托育系统开发实战:从需求分析到上线全流程指南
java·大数据·需求分析
cspttty10 小时前
国际经济与贸易专业考什么证对就业有帮助
大数据
吴声子夜歌10 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
足球魅力10 小时前
哪款足球软件能分析凯利指数大数据?
大数据·业界资讯
xwz小王子11 小时前
机器人的“最后一毫米”: 新加坡南洋理工大学Facet-0如何教会基础模型“感受”自己的动作?
大数据·人工智能·机器人
腾视科技-AI11 小时前
腾视科技AIBOX双版本重磅发布!本地安全与全球适配,解锁视频智能新可能
大数据·人工智能·科技·安全·大模型·腾视科技·ai算力盒
小智老师PMP11 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
姜穆澜12 小时前
OneID 从 0 到 1 完整生产案例(五)
大数据·notepad++