hadoop版本

Hadoop 1.x 到 2.x:JobTracker 扛不住了,所以有了 YARN

Hadoop 1.x 能跑,但跑不大。

当集群从几十台扩展到几百台、几千台的时候,JobTracker 扛不住了——它既要管资源分配,又要管任务调度,还要管容错,一个节点撑所有,成了单点瓶颈。

2.x 的核心改进就一件事:把 JobTracker 拆了。

拆成 ResourceManager(管资源)和 ApplicationMaster(管单个作业)。这个拆分,就是 YARN。

1.x 的架构:JobTracker 一身兼两职

Hadoop 1.x 有三个核心模块:

  • Common:通用工具库
  • HDFS:分布式存储
  • MapReduce:计算 + 资源调度,全在 JobTracker 身上

JobTracker 扛了三件事:

  1. 资源管理:集群里谁有多少 CPU、多少内存,它管
  2. 任务调度:每个 Map/Reduce 任务怎么分、怎么跑,它管
  3. 容错处理:任务失败了怎么重试,它还管

这个设计在集群小的时候没问题,集群大了就出事了。

1.x 的三个硬伤

硬伤1:JobTracker 是单点瓶颈

所有任务调度、资源分配都要经过 JobTracker。集群到几百个节点时,JobTracker 的 CPU 和内存就被撑爆了,任务提交变慢、响应变慢,整个集群卡在 JobTracker 上。

硬伤2:JobTracker 挂了,整个集群瘫痪

1.x 的 JobTracker 没有备份机制。它一挂,所有正在跑的任务全失败,新的任务也提交不了。恢复只能重启,重启还要 replay 日志,期间集群不可用。

硬伤3:资源分配僵化,利用率低

1.x 把资源分成固定数量的 Map SlotReduce Slot

  • Map 任务只能用 Map Slot
  • Reduce 任务只能用 Reduce Slot

如果 Map 任务跑完了,Map Slot 空着也不能给 Reduce 用;如果 Reduce 任务多,Reduce Slot 不够就只能排队。资源是固定的,不能灵活调配。

2.x 的解法:拆!

2.x 引入 YARN,把 JobTracker 的职责拆成两块:

Hadoop 1.x:          JobTracker(资源 + 调度)
                     ↓
Hadoop 2.x:   ResourceManager(资源) + ApplicationMaster(调度)

拆完之后各管各的:

组件 管什么 特点
ResourceManager(RM) 集群资源分配(CPU、内存) 全局只有一个,但支持 HA 热备
NodeManager(NM) 单节点资源管理 每台机器一个
ApplicationMaster(AM) 单个作业的任务调度 每个作业一个,作业结束就销毁

一个 MapReduce 作业在 YARN 上的流程:

  1. Client 提交作业 → RM
  2. RM 在某个节点上启动 AM(MRAppMaster)
  3. AM 向 RM 申请资源 → RM 返回 Container 列表
  4. AM 在 Container 里启动 Map/Reduce 任务
  5. 任务完成 → AM 向 RM 注销 → 释放资源

RM 只管”给资源”,不管”怎么跑”。 怎么跑是 AM 的事。所以 Spark 有 Spark AM,Flink 有 Flink AM——每个框架自己管自己的调度逻辑。

2.x 解决了什么问题

1.x 的问题 2.x 怎么解决的
JobTracker 单点瓶颈 拆成 RM(轻量)+ AM(分散),压力分散
JobTracker 挂了全挂 RM 支持 HA(Active/Standby),AM 挂了只影响单个作业
Map/Reduce Slot 固定 改用 Container,资源按需分配,不分类型
只支持 MapReduce YARN 支持任意框架(Spark、Flink、Tez)

Container 替代 Slot 是资源利用率的质变:

  • Slot:固定大小,不管用不用都占着
  • Container:按需申请,用多少申请多少,用完释放

架构演进图

hadoop1和hadoop2区别