什么是 YARN 的 Container(容器)?它封装了哪些维度的资源?
在 Hadoop YARN 架构中,Container(容器) 是一个非常核心的概念。简单来说,它是 YARN 中基本的资源分配单位和任务运行环境。
以下是对 YARN Container 及其封装资源维度的详细解析:
一、 什么是 YARN 的 Container?
- 资源的抽象表示:Container 并不是像物理机或虚拟机那样的实体,它是 YARN 资源管理器(ResourceManager)向应用程序(Application)分配资源的一种抽象表示。它代表了某台特定节点(NodeManager)上的一组特定资源。
- 任务的执行环境:当你在 YARN 上运行一个任务(例如 MapReduce 的 Map/Reduce task,或者 Spark 的 Executor)时,这个任务必须运行在一个 Container 内部。
- 生命周期:Container 是按需动态创建的。当 ApplicationMaster 申请到资源后,NodeManager 会启动 Container 并运行相关任务;任务结束后,Container 会被销毁,资源被系统回收。
- 与 Docker 容器的区别:传统的 YARN Container 只是通过 Linux 内核的
cgroups技术对进程使用的资源进行限制和隔离的一组进程集合。不过,在较新的 Hadoop 版本中,YARN 也已经支持将任务直接运行在真正的 Docker 容器中。
二、 Container 封装了哪些维度的资源?
在 YARN 中,Container 主要封装了以下几个维度的资源(早期版本只有内存和 CPU,Hadoop 3.x 之后引入了更多维度):
1. 内存资源 (Memory) —— 最核心且强制隔离的维度
- 含义:分配给该 Container 内部运行的进程(通常是 JVM)所能使用的最大物理内存量。
- 特点:YARN 对内存的控制非常严格。NodeManager 会持续监控 Container 的内存使用情况。如果 Container 中的任务使用的内存超过了分配的限额,NodeManager 会直接 Kill(杀死) 该 Container,抛出
OutOfMemory相关的错误,以防止单个任务耗尽整个节点的内存而导致节点崩溃。
2. CPU 资源 (vCores - 虚拟核心)
- 含义:分配给该 Container 的 CPU 计算能力。YARN 使用了 vCore(虚拟核心) 的概念,而不是物理核心。
- 特点:由于集群中不同机器的 CPU 性能差异很大,YARN 通过配置将物理 CPU 映射为 vCores,从而抹平硬件差异。与内存的严格限制不同,在默认配置下,YARN 对 CPU 的隔离通常是“软限制”(如果没有其他任务抢占,它可以超额使用 CPU),但如果启用了严格的
cgroups隔离,它将被强制限制在分配的 vCores 配额内。
3. 扩展硬件资源 (Extended Resources) —— Hadoop 3.x 及以上版本引入
随着深度学习和复杂计算的发展,YARN 从 Hadoop 3.1 开始支持更丰富的资源类型,Container 现在也可以封装:
- GPU (图形处理器):用于机器学习、深度学习训练等计算密集型任务。YARN 可以为 Container 隔离和分配特定数量的 GPU 卡。
- FPGA (现场可编程逻辑门阵列):用于特定算法的硬件加速。
4. 其他资源(概念上支持或正在完善)
- 磁盘 I/O 和 网络带宽:虽然在早期的 YARN 设计中,Container 对磁盘读写速度和网络带宽的隔离支持较弱(通常是共享的),但在后续的演进中,社区也在不断探索通过
cgroups或其他操作系统级别的技术对 Disk I/O 和 Network 资源进行限制,以防止“吵闹的邻居(Noisy Neighbor)”问题。
总结
可以将 YARN 集群想象成一家酒店(ResourceManager 是前台,NodeManager 是楼层管理员)。Container 就是前台开给你的一间客房。
这个客房封装了特定的空间(内存)和特定的服务标准(CPU vCores / GPU)。你的任务只能在这个客房规定的资源范围内活动,一旦严重超标(比如内存超限),楼层管理员(NodeManager)就会把你“强制退房”。