1. 首页 > Hadoop教程 > 正文

大数据教程FG066-Spark资源调度与集群管理

本文档风哥主要介绍Spark资源调度与集群管理,包括Spark调度系统、集群管理器类型、调度模式、动态资源分配等内容,风哥教程参考Spark官方文档Cluster Mode Overview、Job Scheduling等内容,适合大数据开发运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 Spark调度系统概述

Spark调度系统负责将应用分解为任务并分配到集群资源上执行。学习交流加群风哥微信: itpux-com

Spark调度层次:

  • 应用:用户提交的Spark程序
  • Job:由Action操作触发的计算任务
  • Stage:Job的执行阶段,以Shuffle为边界
  • Task:最小执行单元,处理一个分区数据

1.2 集群管理器类型

Spark支持的集群管理器:

# 集群管理器类型

1. Standalone模式
– Spark自带的集群管理器
– 部署简单,独立运行
– 适合独立Spark集群

2. Hadoop YARN
– Hadoop资源管理器
– 与Hadoop生态集成
– 适合已有Hadoop集群

3. Apache Mesos
– 通用集群管理器
– 支持多种框架
– 适合多框架混部

4. Kubernetes
– 容器编排平台
– 云原生部署
– 适合容器化环境

# 集群管理器对比
| 特性 | Standalone | YARN | Mesos | K8s |
|————|————|———|———|———|
| 部署复杂度 | 低 | 中 | 高 | 高 |
| 资源隔离 | 进程级 | 容器级 | 容器级 | 容器级 |
| 多租户 | 支持 | 支持 | 支持 | 支持 |
| 生态集成 | 独立 | Hadoop | 多框架 | 云原生 |

# 选择建议
– 已有Hadoop集群:YARN
– 云原生环境:Kubernetes
– 独立部署:Standalone
– 多框架混部:Mesos

1.3 调度模式详解

Spark调度模式详解:

# 调度模式

1. FIFO模式(默认)
– 先进先出
– 适合单用户场景
– 简单高效

2. FAIR模式
– 公平调度
– 支持多用户
– 资源公平分配

# 调度配置
# FIFO模式
spark.scheduler.mode=FIFO

# FAIR模式
spark.scheduler.mode=FAIR
spark.scheduler.allocation.file=/path/to/fairscheduler.xml

# 公平调度配置文件

FAIR
2
4
FIFO
1
2

# 使用调度池
spark.sparkContext.setLocalProperty(“spark.scheduler.pool”, “production”)

风哥提示:生产环境建议使用FAIR调度模式,支持多用户公平共享资源。可以为不同业务配置不同的调度池和权重。

Part02-生产环境规划与建议

2.1 资源规划建议

资源规划建议:

# 资源规划原则

1. Executor资源
– 数量:节点数 * 2-5
– 核心:每个Executor 2-5个
– 内存:每个Executor 4-8GB

2. Driver资源
– 内存:2-4GB
– 核心:1-2个

3. 总资源计算
– 总核心 = Executor数量 * 每个Executor核心
– 总内存 = Executor数量 * 每个Executor内存

# 资源规划示例
集群规模:5个节点,每节点32核、128GB内存

Executor配置:
– 数量:15个(每节点3个)
– 核心:每个4核
– 内存:每个32GB

总资源:
– 总核心:15 * 4 = 60核
– 总内存:15 * 32GB = 480GB

# 资源预留
– 系统预留:每节点10%资源
– Hadoop预留:每节点10%资源
– Spark可用:每节点80%资源

2.2 队列规划建议

队列规划建议:

# YARN队列规划

1. 队列层级
root
├── production(生产队列)
│ ├── realtime(实时任务)
│ └── batch(批处理任务)
├── development(开发队列)
│ └── default
└── maintenance(维护队列)

2. 队列配置

yarn.scheduler.capacity.root.queues
production,development,maintenance
yarn.scheduler.capacity.root.production.capacity
60
yarn.scheduler.capacity.root.development.capacity
30
yarn.scheduler.capacity.root.maintenance.capacity
10

3. 提交到指定队列
spark-submit –queue production …

# 队列资源限制
– 最大容量:队列可使用的最大资源
– 最小容量:队列保证的最小资源
– 最大应用数:队列最大运行应用数

2.3 高可用规划

高可用规划建议:

# Standalone HA配置

1. ZooKeeper模式
– 多个Master节点
– ZooKeeper选举Leader
– 自动故障转移

2. 文件系统模式
– 单Master + 备用Master
– 文件系统存储状态
– 手动切换

# ZooKeeper HA配置
spark.deploy.recoveryMode=ZOOKEEPER
spark.deploy.zookeeper.url=192.168.1.51:2181,192.168.1.52:2181,192.168.1.53:2181
spark.deploy.zookeeper.dir=/spark-ha

# Master配置
# Master1
$ /bigdata/app/spark/sbin/start-master.sh -h 192.168.1.60 -p 7077 -z 192.168.1.51:2181

# Master2
$ /bigdata/app/spark/sbin/start-master.sh -h 192.168.1.61 -p 7077 -z 192.168.1.51:2181

# YARN HA配置
# YARN ResourceManager HA由YARN管理
# Spark无需额外配置

生产环境建议:生产环境建议配置高可用,Standalone模式使用ZooKeeper实现HA,YARN模式使用YARN自带的ResourceManager HA。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 Standalone模式配置

3.1.1 Master配置

# 配置spark-env.sh
$ cat > /bigdata/app/spark/conf/spark-env.sh << 'EOF' #!/bin/bash # spark-env.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn export JAVA_HOME=/usr/lib/jvm/java-17-openjdk export SPARK_HOME=/bigdata/app/spark # Master配置 export SPARK_MASTER_HOST=192.168.1.60 export SPARK_MASTER_PORT=7077 export SPARK_MASTER_WEBUI_PORT=8080 # HA配置 export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER \ -Dspark.deploy.zookeeper.url=192.168.1.51:2181,192.168.1.52:2181,192.168.1.53:2181 \ -Dspark.deploy.zookeeper.dir=/spark-ha" EOF # 启动Master $ /bigdata/app/spark/sbin/start-master.sh starting org.apache.spark.deploy.master.Master, logging to /bigdata/app/spark/logs/spark-spark-org.apache.spark.deploy.master.Master-1-fgedu-spark-master.out # 查看Master状态 $ jps 12345 Master 12456 Jps # 访问Web UI # http://192.168.1.60:8080

3.1.2 Worker配置

# 配置workers文件
$ cat > /bigdata/app/spark/conf/workers << 'EOF' 192.168.1.61 192.168.1.62 192.168.1.63 192.168.1.64 192.168.1.65 EOF # 配置Worker参数 $ cat >> /bigdata/app/spark/conf/spark-env.sh << 'EOF' # Worker配置 export SPARK_WORKER_CORES=16 export SPARK_WORKER_MEMORY=96g export SPARK_WORKER_DIR=/bigdata/spark-work export SPARK_WORKER_WEBUI_PORT=8081 EOF # 启动所有Worker $ /bigdata/app/spark/sbin/start-workers.sh 192.168.1.61: starting org.apache.spark.deploy.worker.Worker, logging to /bigdata/app/spark/logs/spark-spark-org.apache.spark.deploy.worker.Worker-1-fgedu-spark-worker1.out 192.168.1.62: starting org.apache.spark.deploy.worker.Worker, logging to /bigdata/app/spark/logs/spark-spark-org.apache.spark.deploy.worker.Worker-1-fgedu-spark-worker2.out 192.168.1.63: starting org.apache.spark.deploy.worker.Worker, logging to /bigdata/app/spark/logs/spark-spark-org.apache.spark.deploy.worker.Worker-1-fgedu-spark-worker3.out 192.168.1.64: starting org.apache.spark.deploy.worker.Worker, logging to /bigdata/app/spark/logs/spark-spark-org.apache.spark.deploy.worker.Worker-1-fgedu-spark-worker4.out 192.168.1.65: starting org.apache.spark.deploy.worker.Worker, logging to /bigdata/app/spark/logs/spark-spark-org.apache.spark.deploy.worker.Worker-1-fgedu-spark-worker5.out # 查看Worker状态 $ curl http://192.168.1.60:8080/json | python -m json.tool { "url": "spark://192.168.1.60:7077", "workers": [ { "id": "worker-20260408120000-192.168.1.61-8081", "host": "192.168.1.61", "port": 8081, "cores": 16, "memory": 98304, "state": "ALIVE" } ], "cores": 80, "memory": 491520 }

3.2 YARN模式配置

3.2.1 YARN客户端模式

# 配置spark-defaults.conf
$ cat > /bigdata/app/spark/conf/spark-defaults.conf << 'EOF' # YARN配置 spark.master yarn spark.submit.deployMode client # 资源配置 spark.executor.memory 8g spark.executor.cores 4 spark.executor.instances 2 spark.driver.memory 4g # YARN队列 spark.yarn.queue production # 动态资源分配 spark.dynamicAllocation.enabled true spark.dynamicAllocation.minExecutors 2 spark.dynamicAllocation.maxExecutors 20 spark.dynamicAllocation.initialExecutors 5 # Shuffle服务 spark.shuffle.service.enabled true # 历史服务器 spark.eventLog.enabled true spark.eventLog.dir hdfs://192.168.1.60:9000/spark-logs spark.history.fs.logDirectory hdfs://192.168.1.60:9000/spark-logs EOF # 提交应用到YARN $ /bigdata/app/spark/bin/spark-submit \ --master yarn \ --deploy-mode client \ --name fgedu-yarn-app \ --executor-memory 8g \ --executor-cores 4 \ --num-executors 10 \ --queue production \ /bigdata/spark-apps/fgedu-app.jar 2026-04-08 12:30:00 INFO SparkContext:54 - Running Spark version 3.5.1 2026-04-08 12:30:01 INFO ResourceUtils:54 - Starting Spark Master 2026-04-08 12:30:02 INFO SparkContext:54 - Submitted application: fgedu-yarn-app ... 2026-04-08 12:30:30 INFO Client:54 - Application report for application_1680940800000_0001 (state: RUNNING)

3.2.2 YARN集群模式

# 集群模式配置
$ cat > /bigdata/app/spark/conf/spark-defaults.conf << 'EOF' spark.master yarn spark.submit.deployMode cluster spark.executor.memory 8g spark.executor.cores 4 spark.driver.memory 4g spark.yarn.queue production EOF # 提交应用到YARN集群模式 $ /bigdata/app/spark/bin/spark-submit \ --master yarn \ --deploy-mode cluster \ --name fgedu-yarn-cluster-app \ --executor-memory 8g \ --executor-cores 4 \ --num-executors 10 \ --queue production \ --conf spark.yarn.submit.waitAppCompletion=false \ /bigdata/spark-apps/fgedu-app.jar 2026-04-08 12:35:00 INFO Client:54 - Requesting a new application from cluster with 5 NodeManagers 2026-04-08 12:35:01 INFO Client:54 - Verifying our application has not requested more than the maximum memory capability of the cluster 2026-04-08 12:35:02 INFO Client:54 - Uploading resource file:/bigdata/spark-apps/fgedu-app.jar -> hdfs://192.168.1.60:9000/user/spark/.sparkStaging/application_1680940800000_0002/fgedu-app.jar

2026-04-08 12:35:30 INFO Client:54 – Application report for application_1680940800000_0002 (state: RUNNING)

# 查看应用状态
$ yarn application -list

Total number of applications (application types: [] and states: [SUBMITTED, ACCEPTED, RUNNING]):1
Application-Id Application-Name Application-Type User Queue State Final-State Progress Tracking-URL
application_1680940800000_0002 fgedu-yarn-cluster-app SPARK spark production RUNNING UNDEFINED 10% http://192.168.1.61:4040

3.3 动态资源分配

# 动态资源分配配置

# 启用动态资源分配
spark.dynamicAllocation.enabled=true

# 最小Executor数
spark.dynamicAllocation.minExecutors=2

# 最大Executor数
spark.dynamicAllocation.maxExecutors=50

# 初始Executor数
spark.dynamicAllocation.initialExecutors=5

# 扩展策略
spark.dynamicAllocation.executorIdleTimeout=60s
spark.dynamicAllocation.cachedExecutorIdleTimeout=60s
spark.dynamicAllocation.schedulerBacklogTimeout=1s
spark.dynamicAllocation.sustainedSchedulerBacklogTimeout=1s

# 启用Shuffle服务(必须)
spark.shuffle.service.enabled=true
spark.shuffle.service.port=7337

# 完整配置示例
$ /bigdata/app/spark/bin/spark-submit \
–master yarn \
–deploy-mode client \
–conf spark.dynamicAllocation.enabled=true \
–conf spark.dynamicAllocation.minExecutors=2 \
–conf spark.dynamicAllocation.maxExecutors=50 \
–conf spark.dynamicAllocation.initialExecutors=5 \
–conf spark.shuffle.service.enabled=true \
/bigdata/spark-apps/fgedu-app.jar

# 动态资源分配工作原理
1. 应用启动时分配初始Executor
2. 有待处理任务时请求更多Executor
3. Executor空闲超时后释放
4. 缓存数据的Executor有单独的超时

风哥提示:动态资源分配可以根据负载自动调整Executor数量,提高资源利用率。生产环境建议启用动态资源分配,但需要配置Shuffle服务。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 多租户资源管理

# 多租户资源配置

# 创建调度池配置
$ cat > /bigdata/app/spark/conf/fairscheduler.xml << 'EOF'
FAIR
3
10
FAIR
1
5
FIFO
2
8

EOF

# 配置公平调度
$ cat >> /bigdata/app/spark/conf/spark-defaults.conf << 'EOF' spark.scheduler.mode=FAIR spark.scheduler.allocation.file=/bigdata/app/spark/conf/fairscheduler.xml EOF # 提交任务到指定调度池 scala> spark.sparkContext.setLocalProperty(“spark.scheduler.pool”, “fgedu_production”)

# YARN多租户队列配置
# capacity-scheduler.xml yarn.scheduler.capacity.root.fgedu_prod.capacity
50
yarn.scheduler.capacity.root.fgedu_dev.capacity
30
yarn.scheduler.capacity.root.fgedu_batch.capacity
20

# 提交到指定队列
$ spark-submit –queue fgedu_prod …
$ spark-submit –queue fgedu_dev …
$ spark-submit –queue fgedu_batch …

4.2 任务调度实战

# 查看集群资源
$ curl http://192.168.1.60:8080/json

{
“url”: “spark://192.168.1.60:7077”,
“workers”: [
{“host”: “192.168.1.61”, “cores”: 16, “memory”: 98304, “state”: “ALIVE”},
{“host”: “192.168.1.62”, “cores”: 16, “memory”: 98304, “state”: “ALIVE”},
{“host”: “192.168.1.63”, “cores”: 16, “memory”: 98304, “state”: “ALIVE”},
{“host”: “192.168.1.64”, “cores”: 16, “memory”: 98304, “state”: “ALIVE”},
{“host”: “192.168.1.65”, “cores”: 16, “memory”: 98304, “state”: “ALIVE”}
],
“cores”: 80,
“memory”: 491520,
“activeApps”: [
{“id”: “app-20260408120000-0001”, “name”: “fgedu-app-1”, “cores”: 20, “memoryPerExecutor”: 8192}
]
}

# 查看运行中的应用
$ /bigdata/app/spark/bin/spark-submit –status app-20260408120000-0001

Application report for app-20260408120000-0001 (state: RUNNING)
Name: fgedu-app-1
Cores: 20
Memory per Executor: 8192 MB
Submit Date: Mon Apr 08 12:00:00 CST 2026
State: RUNNING
Duration: 30 minutes

# 杀死应用
$ /bigdata/app/spark/bin/spark-submit –kill app-20260408120000-0001

Killing application app-20260408120000-0001

# YARN应用管理
$ yarn application -list
$ yarn application -kill application_1680940800000_0001
$ yarn application -status application_1680940800000_0001

# 查看队列资源使用
$ yarn queue -status production

Queue Information
Queue Name: production
State: RUNNING
Capacity: 60.0%
Current Capacity: 45.0%
Maximum Capacity: 100.0%
Default Node Label Expression:
Num Active Applications: 5
Num Pending Applications: 2

4.3 常见问题处理

4.3.1 资源不足问题

# 问题现象:应用等待资源

# 排查步骤
# 1. 查看集群资源
$ curl http://192.168.1.60:8080/json

# 2. 查看队列资源
$ yarn queue -status production

# 3. 查看应用状态
$ yarn application -list

# 解决方案
# 1. 减少资源请求
–executor-memory 4g
–num-executors 5

# 2. 使用动态资源分配
spark.dynamicAllocation.enabled=true

# 3. 调整队列容量
# 修改capacity-scheduler.xml

# 4. 杀死低优先级应用
$ yarn application -kill application_xxx

4.3.2 调度不公平问题

# 问题现象:某些应用占用过多资源

# 排查步骤
# 1. 查看调度池配置
$ cat /bigdata/app/spark/conf/fairscheduler.xml

# 2. 查看应用资源使用
$ curl http://192.168.1.60:8080/json

# 解决方案
# 1. 调整调度池权重 3
10

# 2. 限制最大资源
spark.executor.memory 8g
spark.executor.instances 10

# 3. 使用Fair调度
spark.scheduler.mode=FAIR

# 4. 配置资源限制
spark.cores.max=20
spark.executor.memory=8g

Part05-风哥经验总结与分享

5.1 调度最佳实践

Spark调度最佳实践建议:

# 调度最佳实践
1. 合理配置资源
– Executor数量:节点数 * 2-5
– Executor核心:2-5个
– Executor内存:4-8GB

2. 使用动态资源分配
– 根据负载自动调整
– 提高资源利用率

3. 配置公平调度
– 多用户公平共享
– 设置调度池权重

4. 监控资源使用
– 定期检查资源使用
– 及时调整配置

5.2 监控运维建议

监控运维建议:

Spark调度监控建议:

  • 监控集群资源使用率
  • 监控应用执行状态
  • 监控队列资源分配
  • 配置资源告警

5.3 工具推荐

调度管理工具:

  • Spark Web UI:集群和应用监控
  • YARN Web UI:YARN资源管理
  • spark-submit:应用提交管理
  • yarn命令:YARN应用管理
风哥提示:Spark资源调度是集群管理的核心,合理配置资源可以提高集群利用率和应用性能。建议启用动态资源分配和公平调度。from bigdata视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息