1. 核心组件职责
Driver节点(相当于司机大脑引擎)
-
核心功能:
-
解析用户代码生成DAG
-
将逻辑执行计划转换为物理执行计划
-
协调任务调度与资源分配
-
维护Executor的生命周期
-
-
关键进程:
Executor(相当于工人肌肉)节点
-
核心功能:
-
执行具体的Task(数据计算)
-
管理BlockManager(数据缓存)
-
通过心跳机制与Driver保持通信
-
-
资源分配:
# 典型配置(每个Executor) --executor-memory 16g # 堆内存 --executor-cores 4 # 并发任务数 --memoryOverhead 2g # 堆外内存
2. 任务调度全流程
从代码到物理执行
关键阶段耗时分析
阶段 | 典型耗时 | 优化手段 |
---|---|---|
DAG生成 | 10-100ms | 减少宽依赖数量 |
资源申请 | 2-30s | 使用动态资源分配 |
Task序列化 | 5-50ms | 减小闭包体积 |
数据本地化等待 | 0-60s | 合理设置spark.locality.wait |
3. 调度器工作原理
DAGScheduler阶段划分
// 示例:WordCount的Stage划分
val file = sc.textFile("hdfs://data") // Stage0
val words = file.flatMap(_.split(" ")) // Stage0
val pairs = words.map((_, 1)) // Stage0
val counts = pairs.reduceByKey(_ + _) // Stage1(Shuffle边界)
counts.saveAsTextFile("hdfs://output") // Stage1
Task调度策略
-
调度类型:
-
FIFO调度:默认策略,按提交顺序执行
-
FAIR调度 :配置
spark.scheduler.mode=FAIR
-
-
本地性级别优先级:
-
PROCESS_LOCAL(同进程)
-
NODE_LOCAL(同节点)
-
RACK_LOCAL(同机架)
-
ANY(任意节点)
-
4. 容错机制设计
Executor故障处理
Driver故障恢复
-
Cluster模式:通过集群管理器重启Driver
-
Checkpoint机制:
ssc.checkpoint("hdfs://checkpoint") // 流处理检查点 spark.sparkContext.setCheckpointDir("hdfs://dir") // RDD检查点
5. 企业级调优实践
资源分配公式
# 计算最优Executor数量
total_cores = 100 # 集群总核心数
executor_cores = 4 # 每个Executor核心数
executor_memory = 16 # 每个Executor内存(GB)
num_executors = total_cores // executor_cores
spark.executor.instances = num_executors - 1 # 保留1核心给Driver
避免OOM的配置策略
# 关键参数配置示例
spark.executor.memoryOverhead=2048 # 堆外内存
spark.memory.fraction=0.6 # 执行与存储内存比例
spark.memory.storageFraction=0.5 # 存储内存占比
6. 与Hadoop MapReduce对比
特性 | Spark Driver/Executor | Hadoop JobTracker/TaskTracker |
---|---|---|
任务启动速度 | 线程级(毫秒) | 进程级(秒级) |
数据共享 | 内存共享 | 通过HDFS中转 |
容错粒度 | Task级别 | TaskAttempt级别 |
资源利用率 | 高(动态分配) | 低(静态分配) |
7. 监控与诊断
关键监控指标
指标 | 健康阈值 | 异常处理 |
---|---|---|
Driver CPU使用率 | <70% | 检查DAG复杂度 |
Executor心跳延迟 | <3s | 检查网络状况 |
Task失败率 | <1% | 分析GC日志或数据倾斜 |
数据本地化率 | >90% | 调整spark.locality.wait |
诊断命令示例
# 查看Executor列表
curl http://driver-host:4040/api/v1/applications/<app-id>/allexecutors
# 获取Stage详情
spark-submit --conf spark.eventLog.enabled=true ...
理解Driver/Executor架构的要点:
-
Driver是大脑:负责全局规划但非性能瓶颈
-
Executor是肌肉:实际执行单元需合理配置资源
-
调度策略是神经:平衡数据本地性与资源利用率
-
容错机制是免疫系统:保障作业稳定运行
这种架构设计使得Spark能够:
-
实现亚秒级任务调度延迟(对比MapReduce的秒级延迟)
-
通过内存计算达到10-100倍性能提升
-
支持复杂的DAG执行模式
-
动态适应集群资源变化