MapReduce1中资源预先划分为固定数量的map slot和reduce slot,具体是怎么划分的?
MapReduce 1(MRv1)中map slot与reduce slot的固定划分机制
在Hadoop MapReduce 1(MRv1)中,资源管理采用静态分配的方式,map slot和reduce slot的数量在集群启动时预先配置,且无法动态调整。以下是具体划分方式及其背后的设计逻辑:
一、核心架构与角色
MRv1的资源管理由两个核心组件实现:
- JobTracker
- 负责作业调度(将任务分配给TaskTracker)和资源监控。
- 全局管理所有作业的map和reduce任务。
- TaskTracker
- 每个节点(DataNode)上运行的守护进程。
- 根据配置的slot数量,向JobTracker汇报可用资源(空闲的map slot和reduce slot)。
- 执行具体的map或reduce任务。
二、slot的静态配置
每个TaskTracker节点上的map slot和reduce slot数量通过以下参数固定设定:
- map slot数量:
由mapred.tasktracker.map.tasks.maximum
参数控制(默认值2)。
例如,若集群有100个节点,则总map slot数为100 × 2 = 200
。 - reduce slot数量:
由mapred.tasktracker.reduce.tasks.maximum
参数控制(默认值2)。
总reduce slot数为100 × 2 = 200
。
配置文件示例(mapred-site.xml
):
<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>2</value>
</property>
<property>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>2</value>
</property>
三、slot的资源分配逻辑
-
资源单位固定
- 每个slot对应固定的资源(如内存、CPU),例如:
- 每个map slot分配1个CPU核心和2GB内存;
- 每个reduce slot分配1个CPU核心和4GB内存。
- 问题:资源分配无法根据任务实际需求动态调整,导致资源浪费或不足。
- 每个slot对应固定的资源(如内存、CPU),例如:
-
slot类型隔离
- map slot只能运行map任务,reduce slot只能运行reduce任务。
- 问题:若map slot空闲但reduce slot不足(或反之),资源无法共享,利用率低下。
-
任务调度流程
- JobTracker根据作业需求,向TaskTracker请求空闲的map slot。
- map任务完成后,释放map slot,JobTracker再分配reduce任务到reduce slot。
- 若slot不足,任务需等待其他任务完成释放资源。
四、固定划分的优缺点
优点 | 缺点 |
---|---|
实现简单,资源管理复杂度低。 | 资源利用率低(map/reduce slot无法复用)。 |
避免资源竞争,稳定性较高。 | 无法应对动态负载(如突发大量map任务)。 |
易于预估集群容量。 | 配置需人工调整,灵活性差。 |
五、与YARN的对比
在YARN(Hadoop 2.x+)中,资源管理改进为动态分配:
- 资源单位:
- 使用**容器(Container)**作为通用资源单位,不再区分map和reduce。
- 容器资源(CPU、内存)按需申请,例如一个任务可申请2个CPU和4GB内存。
- 灵活性:
- 资源按应用需求动态分配,避免slot类型隔离的问题。
- 支持多种计算框架(如Spark、Flink)共享集群资源。
六、实际场景示例
假设一个MRv1集群配置如下:
- 节点数:10台
- 每节点map slot数:4
- 每节点reduce slot数:2
资源总量:
- map slot总数:
10 × 4 = 40
- reduce slot总数:
10 × 2 = 20
作业执行:
- 提交一个需要30个map任务和15个reduce任务的作业。
- JobTracker分配30个map slot(需占用30/40资源)和15个reduce slot(15/20资源)。
- 若此时另一个作业需要20个map任务,则需等待前一个作业释放map slot。
七、总结
MRv1通过静态划分map slot和reduce slot简化了资源管理,但牺牲了灵活性和资源利用率。这种设计适合早期批处理场景,但在复杂或多变的工作负载下显得力不从心。YARN的动态资源管理(容器化)正是为了解决这些问题而引入,成为现代大数据生态的基石。理解MRv1的slot机制,有助于更好地体会Hadoop架构的演进历程。