如何在 CentOS 8 环境上搭建Apache Spark 集群、进行资源分配配置与性能调优,覆盖硬件资源规划、环境准备、集群部署、性能参数调整与评估。示例围绕 Spark 3.x 版本展开,并结合具体参数、配置文件与调优建议,适合用于大规模数据分析生产环境。
A5数据整个流程分为以下部分:
- 环境与硬件准备
- Spark 集群部署
- 核心配置详解
- 性能调优方法
- 资源管理与调度优化
- 性能评估与基准测试
一、香港服务器www.a5idc.com环境与硬件准备
1.1 推荐硬件配置(单节点)
| 节点类型 | CPU | 内存 | 存储 | 网络 |
|---|---|---|---|---|
| Master 管理节点 | 8 核 (可扩展16 核) | 32 GB | 500 GB SSD | 10 GbE |
| Worker 计算节点 | 16 核 | 128 GB | 1 TB NVMe SSD | 10 GbE |
| 边缘/客户端节点 | 4 核 | 16 GB | 256 GB SSD | 1 GbE |
推荐使用 NVMe SSD 以减少 Shuffle 阶段 I/O 等待。
1.2 软件版本要求
- 操作系统: CentOS 8 (x86_64)
- Java:OpenJDK 11 或更高(Spark 3.x 推荐)
- Scala:Spark 内置 Scala,不需要单独安装
- Spark:Apache Spark 3.4.4 或更高(与 Hadoop 兼容)
二、集群部署
2.1 安装基础依赖
在所有节点上安装 Java:
bash
dnf install -y java-11-openjdk-devel
确认安装:
bash
java -version
Spark 是基于 JVM 的,所以需要 Java 环境支持。
2.2 下载与安装 Spark
以 Master 节点为例:
bash
wget https://mirrors.aliyun.com/apache/spark/spark-3.4.4/spark-3.4.4-bin-hadoop3.tgz
tar zxvf spark-3.4.4-bin-hadoop3.tgz -C /opt
mv /opt/spark-3.4.4-bin-hadoop3 /opt/spark
在所有 Worker 节点执行同样步骤,确保 Spark 版本一致。
2.3 配置环境变量
在 /etc/profile 中追加:
bash
export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
使配置生效:
bash
source /etc/profile
2.4 SSH 免密设置
为 Spark 管理节点设置 SSH 密钥免密登录所有 Worker,确保 Master 能启动/停止 Worker 进程。
bash
ssh-keygen -t rsa -P ""
ssh-copy-id -i ~/.ssh/id_rsa.pub worker1
三、核心配置详解
3.1 配置 Spark 环境变量
编辑 conf/spark-env.sh:
bash
vim $SPARK_HOME/conf/spark-env.sh
加入如下内容:
bash
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export SPARK_MASTER_HOST=master.example.com
export SPARK_WORKER_CORES=8
export SPARK_WORKER_MEMORY=64g
export SPARK_WORKER_INSTANCES=1
原则是给 Worker 分配合理的 CPU 和内存比例,避免资源过度抢占。
3.2 配置 Spark 默认参数
编辑 conf/spark-defaults.conf,重要参数如下:
conf
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.sql.shuffle.partitions 200
spark.dynamicAllocation.enabled true
spark.dynamicAllocation.minExecutors 2
spark.dynamicAllocation.maxExecutors 50
spark.executor.memoryOverhead 4096
- Kryo 序列化可显著减少网络传输与内存使用。
- 动态资源分配(Dynamic Allocation)帮助根据作业负载自动伸缩 Executor 数量。
四、性能调优策略
4.1 内存管理
Spark 内存分配主要包括 Executor 内存与内存开销:
bash
--executor-memory 32G --executor-cores 4 --conf spark.memory.fraction=0.8
spark.memory.fraction控制用于执行与存储的内存比例。
4.2 并行度与分区
合理设置分区数避免数据倾斜:
- 推荐的并行度:
spark.default.parallelism = cores_total * 2 - 重分区策略:
python
df.repartition(500)
4.3 序列化
启用 Kryo:
bash
--conf spark.serializer=org.apache.spark.serializer.KryoSerializer
注册自定义类可减少序列化开销。
4.4 垃圾回收调优
在 Exec JVM 中启用 G1GC:
bash
--conf "spark.executor.extraJavaOptions=-XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=35"
G1GC 可提高大内存场景的 GC 性能表现。
五、资源管理与调度优化
5.1 Standalone vs YARN
在生产环境建议与 YARN 集成:
- Spark Standalone:部署简单,适合中小规模集群。
- Spark on YARN:可与 Hadoop 生态共享资源,提高调度能力。
启动命令示例(Standalone):
bash
$SPARK_HOME/sbin/start-master.sh
$SPARK_HOME/sbin/start-worker.sh spark://master.example.com:7077
在 YARN 上提交任务:
bash
spark-submit --master yarn --deploy-mode cluster ...
5.2 动态分配策略
在 spark-defaults.conf 中启用:
conf
spark.dynamicAllocation.enabled true
spark.dynamicAllocation.executorIdleTimeout 60s
动态分配在负载波动大的环境下能有效提升资源利用率。
六、性能评估与基准测试
6.1 基准测试准备
使用 Spark 自带的示例 WordCount:
bash
spark-submit \
--class org.apache.spark.examples.JavaWordCount \
--master spark://master.example.com:7077 \
$SPARK_HOME/jars/spark-examples_2.12-3.4.4.jar \
hdfs://namenode:9000/input.txt /output
6.2 性能指标表(假设 10 TB 输入)
| 配置方案 | 执行时间 | CPU 平均利用率 | 内存瓶颈 |
|---|---|---|---|
| 默认配置 | 12 h | 65% | 频繁 GC |
| 调优一(增加分区) | 8 h | 82% | 内存利用率提升 |
| 调优二(动态分配 + Kryo) | 6.5 h | 88% | 最优 |
通过监控 Spark UI 和日志分析作业瓶颈。
七、常见问题及解决方案
| 问题 | 原因 | 解决 |
|---|---|---|
| Executor 频繁重启 | 内存不足 | 增加 Executor 内存 & 调整内存比例 |
| task 失败 | 数据倾斜 | 调整分区策略 |
| GC 停顿 | Heap 太大 | 使用 G1GC 并调整 JVM 参数 |
结语
通过A5数据的步骤,你可以在 CentOS 8 环境下搭建起可高效运行与自动资源调度的 Spark 集群,并结合内存、CPU、序列化、分区及垃圾回收等维度进行调优,确保大数据分析任务在生产环境中稳定可靠地运行。