HDFS 与 YARN 整合笔记:从架构到实战

📅 2026/7/27 6:12:35
HDFS 与 YARN 整合笔记:从架构到实战
1. 核心组件概述HDFSHadoop Distributed File System和 YARNYet Another Resource Negotiator是 Apache Hadoop 生态系统的两大核心支柱。HDFS一个高容错、高吞吐量的分布式文件系统用于存储海量数据。它将大文件分割成块Block并分散存储在集群的多个节点上。YARNHadoop 2.0 引入的资源管理和作业调度平台。它将资源管理与作业调度/监控功能分离使得 Hadoop 可以运行除 MapReduce 之外的计算框架如 Spark、Flink。简单来说HDFS 管存储YARN 管计算。它们的整合构成了 Hadoop 处理大数据“存储计算”的基础架构。2. HDFS 架构详解2.1 核心角色NameNode (NN)主节点管理文件系统的命名空间元数据如文件目录树、文件到数据块的映射、数据块的位置信息。通常有主备Active/Standby配置以实现高可用。DataNode (DN)从节点负责存储实际的数据块并定期向 NameNode 发送心跳和块报告。Secondary NameNode辅助节点定期合并 NameNode 的编辑日志Edits和镜像文件FsImage减轻 NameNode 负担。注意它不是热备节点。2.2 写文件流程客户端向 NameNode 发起创建文件请求。NameNode 检查权限与命名空间后在元数据中创建文件记录并返回一个可写的 DataNode 列表管道。客户端将数据包写入管道中的第一个 DataNode该节点接收后转发给下一个依次传递。所有 DataNode 确认写入成功后客户端向 NameNode 报告完成。2.3 读文件流程客户端向 NameNode 请求文件块位置。NameNode 返回存储该块的所有 DataNode 地址按网络拓扑排序。客户端直接从最近的 DataNode 读取数据块。2.4 关键特性数据分块默认块大小 128MBHadoop 2.x/3.x利于并行处理。副本机制默认副本因子为 3提供容错能力。机架感知智能放置副本平衡可靠性与网络带宽。3. YARN 架构详解3.1 核心角色ResourceManager (RM)集群资源的总管理者负责整个系统的资源分配与调度。通常有主备Active/Standby配置。NodeManager (NM)每个节点上的代理负责管理本节点的资源CPU、内存和容器Container生命周期。ApplicationMaster (AM)每个提交的应用程序如一个 MapReduce Job、一个 Spark Application特有的管理者负责向 RM 申请资源并与 NM 协作执行和监控任务。ContainerYARN 中的资源抽象单元封装了节点上一定量的 CPU、内存等资源。任务如 Map Task运行在 Container 中。3.2 应用提交与执行流程提交客户端向 RM 提交应用程序。初始化RM 为应用分配一个 Container并在其中启动该应用的 AM。资源申请AM 向 RM 注册并根据应用需求如需要多少个 Map Task申请资源Container。资源分配RM 根据调度策略如 Capacity Scheduler、Fair Scheduler将空闲的 Container 分配给 AM。任务启动AM 与对应的 NM 通信在分配到的 Container 中启动任务如 MapTask。监控与完成AM 监控任务状态任务完成后向 RM 注销并释放资源。4. HDFS 与 YARN 如何协同工作一个典型的数据处理任务如 MapReduce清晰地展示了两者的整合输入阶段应用程序通过其 AM从 HDFS 读取输入数据。AM 根据 HDFS 中文件的分块信息从 NameNode 获取来确定需要启动多少个 Map Task每个数据块通常对应一个 Map Task。计算阶段AM 向 YARN 的 RM 申请运行这些 Map Task 所需的 Container 资源。RM 调度资源NM 启动 Container。Map Task 在 Container 中执行其输入数据直接来自本节点或网络最近的 DataNode利用数据本地性优化。中间结果与输出阶段Map Task 产生的中间结果可能写入本地磁盘Shuffle 阶段而非 HDFS。Reduce Task 读取中间结果处理后将最终结果写回 HDFS。核心协同点数据本地性YARN 调度器如 Capacity Scheduler会尽量将任务Container调度到存储其输入数据块的 DataNode 所在节点上从而减少网络传输这是整合带来的最大性能优势。资源共享所有计算框架MapReduce, Spark, Hive on Tez等都通过 YARN 共享集群资源而这些框架处理的数据通常存储在 HDFS 上。资源感知YARN 的 NodeManager 可以感知节点的存储状态尽管不直接管理HDFS在极端情况下避免将任务调度到磁盘已满的节点。5. 配置文件关键参数示例5.1 HDFS 核心配置 (hdfs-site.xml)!-- NameNode 元数据存储目录 --propertynamedfs.namenode.name.dir/namevalue/data/hadoop/hdfs/name/value/property!-- DataNode 数据块存储目录 --propertynamedfs.datanode.data.dir/namevalue/data/hadoop/hdfs/data/value/property!-- 文件块副本数量 --propertynamedfs.replication/namevalue3/value/property5.2 YARN 核心配置 (yarn-site.xml)!-- ResourceManager 地址 --propertynameyarn.resourcemanager.hostname/namevaluemaster-node/value/property!-- NodeManager 可分配的物理内存资源 --propertynameyarn.nodemanager.resource.memory-mb/namevalue8192/value/property!-- NodeManager 可分配的 CPU vCore 资源 --propertynameyarn.nodemanager.resource.cpu-vcores/namevalue8/value/property!-- 使用的调度器类 --propertynameyarn.resourcemanager.scheduler.class/namevalueorg.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler/value/property5.3 整合关联配置 (mapred-site.xml- 以 MapReduce 为例)!-- 指定 MapReduce 框架为 YARN --propertynamemapreduce.framework.name/namevalueyarn/value/property6. 实战提交一个 MapReduce 作业到 YARN以下命令展示了从 HDFS 读取数据经 YARN 调度计算最后将结果写回 HDFS 的完整过程。# 1. 将本地数据上传至 HDFShdfs dfs-put/local/path/input_data /user/hadoop/input/# 2. 提交 MapReduce 作业到 YARNhadoop jar /path/to/hadoop-mapreduce-examples.jar wordcount\/user/hadoop/input/\/user/hadoop/output/# 3. 查看 YARN 上的应用状态yarnapplication-listyarnapplication-statusApplication_ID# 4. 从 HDFS 查看结果hdfs dfs-cat/user/hadoop/output/part-r-000007. 常见问题与排查7.1 资源不足导致任务失败现象应用长时间处于ACCEPTED状态或任务失败并提示Container exited with a non-zero exit code。排查检查yarn.nodemanager.resource.memory-mb和yarn.nodemanager.resource.cpu-vcores配置是否合理。通过yarn node -list查看节点资源状态。检查队列资源容量是否已满。7.2 数据本地性差导致性能低下现象作业运行缓慢YARN 监控显示数据本地性比例低如OFF_SWITCH过多。优化确保数据在 HDFS 上分布均匀避免所有数据集中在少数节点。适当调小yarn.scheduler.capacity.node-locality-delay谨慎调整以等待本地节点资源。7.3 HDFS 磁盘空间不足影响 YARN现象NodeManager 日志报错或任务因无法写入 HDFS 而失败。解决使用hdfs dfsadmin -report查看集群存储使用情况。清理 HDFS 无用文件或扩容 DataNode 存储。8. 总结与演进HDFS 与 YARN 的整合是 Hadoop 从单一计算模型MapReduce演变为通用大数据平台的关键。这种“存储与计算分离”的架构带来了灵活性支持多种计算框架。高资源利用率通过 YARN 统一调度。数据本地性优化计算贴近数据极大提升性能。演进趋势随着云原生和存算分离架构的兴起出现了如 HDFS 与 Kubernetes 上的 YARNYuniKorn整合或将 HDFS 替换为对象存储如 S3的方案但其核心思想——让计算高效地访问存储——依然不变。