1. 从整体架构理解
用户提交应用程序 → Driver创建SparkContext → 与Master通信 → Master分配资源 → Worker启动Executor → Executor执行任务
2. 各组件详细说明
Master(主节点)
- 角色:集群的资源管理器
- 职责:
- 管理所有Worker节点
- 接收客户端应用程序的连接请求
- 分配计算资源给应用程序
- 监控Worker节点的状态
- 类比:
公司的CEO,负责整体资源分配
Worker(工作节点)
- 角色:集群的工作执行节点
- 职责:
- 管理所在节点的资源
- 执行Master分配的任务
- 启动和管理Executor进程
- 向Master汇报心跳和资源状态
- 类比:
部门经理,管理具体部门的资源
Driver(驱动器)
- 角色:应用程序的大脑和控制中心
- 职责:
- 运行用户的main()函数
- 创建SparkContext
- 将用户程序转换为任务(DAG)
- 调度任务到Executor
- 收集计算结果
- 监控任务执行状态
- 关键点:
- 每个应用程序有一个Driver
- 可以在集群内部或外部(如你的本地机器)
- 类比:
项目经理,负责整个项目的规划和协调
Executor(执行器)
- 角色:应用程序的任务执行单元
- 职责:
- 执行具体的任务(Task)
- 存储RDD的分区数据
- 将结果返回给Driver
- 提供内存存储(缓存数据)
- 关键点:
- 每个Worker节点可以有多个Executor
- 每个应用程序有自己独立的Executor
- 类比:
具体干活的员工
3. 组件交互流程示例
// 1. 用户在Driver程序中编写代码
val spark = SparkSession.builder()
.appName("Example")
.getOrCreate()
// 2. Driver创建SparkContext,连接Master
val sc = spark.sparkContext
// 3. Master分配资源,Worker启动Executor
// 4. Driver将任务分发给Executor执行
val rdd = sc.parallelize(1 to 100)
val result = rdd.map(_ * 2).collect()
// 5. Executor执行map操作,将结果返回Driver
4. 在集群中的部署方式
Standalone模式
Client Machine (Driver)
↓
Master Node
/ | \
Worker1 Worker2 Worker3
| | |
Exec1 Exec1 Exec1
Exec2 Exec2
YARN/Mesos模式
- Master/Worker → ResourceManager/NodeManager
- 其他概念相同
5. 核心区别对比表
| 组件 | 数量 | 生命周期 | 作用 | 通信对象 |
|---|---|---|---|---|
| Master | 集群1个(或HA模式多个) | 集群运行时持续存在 | 集群资源管理 | Worker, Driver |
| Worker | 集群多个 | 集群运行时持续存在 | 节点资源管理 | Master, Executor |
| Driver | 每个应用1个 | 应用程序运行期间 | 应用逻辑控制 | Master, Executor |
| Executor | 每个应用多个 | 应用程序运行期间 | 任务执行计算 | Driver, Worker |
6. 实际运行示例
# 启动Master
./sbin/start-master.sh
# 启动Worker
./sbin/start-worker.sh spark://master-ip:7077
# 提交应用(Driver在客户端)
spark-submit \
--master spark://master-ip:7077 \
--class com.example.MyApp \
myapp.jar
# 提交应用(Driver在集群)
spark-submit \
--master spark://master-ip:7077 \
--deploy-mode cluster \
--class com.example.MyApp \
myapp.jar
7. 记忆技巧
想象一个建筑工地:
- Master:工地总指挥(知道所有资源情况)
- Worker:各个施工队队长(管理具体人员和设备)
- Driver:建筑师(有图纸,知道要建什么)
- Executor:建筑工人(具体砌砖、抹灰)
或者想象一个餐厅:
- Master:餐厅经理(分配服务区域)
- Worker:服务员领班(管理几个服务员)
- Driver:厨师长(看订单,决定做什么菜)
- Executor:厨师(具体炒菜)
8. 常见配置参数
# Worker配置
spark.worker.cores = 4 # 每个Worker可用的CPU核心数
spark.worker.memory = 16g # 每个Worker可用的内存
# Executor配置
spark.executor.cores = 2 # 每个Executor的CPU核心数
spark.executor.memory = 4g # 每个Executor的内存
# Driver配置
spark.driver.cores = 1 # Driver的CPU核心数
spark.driver.memory = 2g # Driver的内存
总结:Master/Worker管理集群物理资源,Driver/Executor管理应用程序逻辑执行。理解这个分离是掌握Spark架构的关键。