欢迎光临
我们一直在努力

Hadoop 核心组件详解:HDFS、YARN、MapReduce 如何各司其职?

Hadoop 核心组件详解:HDFS、YARN、MapReduce 如何各司其职?

    • 一、Hadoop 核心组件全景图
    • 二、HDFS:分布式文件系统
      • 1. 架构角色
      • 2. 读写流程(流程图)
        • HDFS 写数据流程
        • HDFS 读数据流程
    • 三、YARN:资源调度与管理系统
      • 1. 架构角色
      • 2. YARN 的任务提交流程
    • 四、MapReduce:分布式计算框架
      • 1. 核心思想
      • 2. 经典 WordCount 代码示例
      • 3. MapReduce 完整执行流程
    • 五、总结:三驾马车的协同

🌺The Begin🌺点点关注,收藏不迷路🌺

大数据时代,面对海量数据的存储与计算,Hadoop 作为一个开源的分布式基础架构,发挥了重要作用。它不仅仅是一个程序,而是一个完整的生态系统。要理解 Hadoop,首先要掌握它的三大核心组件:HDFS、YARN 和 MapReduce。

本文将深入浅出地解析这三大组件的架构与角色,并通过流程图和代码示例,帮助你理解它们是如何协同工作,处理海量数据的。

一、Hadoop 核心组件全景图

在 Hadoop 2.x 及以后的版本中,其架构主要由以下四部分组成(其中 Common 为底层支撑):

  • HDFS(分布式文件系统):解决“海量数据怎么存”的问题。
  • YARN(资源调度框架):解决“集群资源怎么管”的问题。
  • MapReduce(分布式计算框架):解决“海量数据怎么算”的问题。
  • Hadoop Common:支撑以上模块的公共工具库(如 RPC、序列化等)。
  • 下图清晰地展示了 Hadoop 核心组件在大数据处理流程中的层次关系:

    #mermaid-svg-MAfiUyDhSpGtUW13{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MAfiUyDhSpGtUW13 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MAfiUyDhSpGtUW13 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MAfiUyDhSpGtUW13 .error-icon{fill:#552222;}#mermaid-svg-MAfiUyDhSpGtUW13 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MAfiUyDhSpGtUW13 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MAfiUyDhSpGtUW13 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MAfiUyDhSpGtUW13 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MAfiUyDhSpGtUW13 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MAfiUyDhSpGtUW13 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MAfiUyDhSpGtUW13 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MAfiUyDhSpGtUW13 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MAfiUyDhSpGtUW13 .marker.cross{stroke:#333333;}#mermaid-svg-MAfiUyDhSpGtUW13 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MAfiUyDhSpGtUW13 p{margin:0;}#mermaid-svg-MAfiUyDhSpGtUW13 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-MAfiUyDhSpGtUW13 .cluster-label text{fill:#333;}#mermaid-svg-MAfiUyDhSpGtUW13 .cluster-label span{color:#333;}#mermaid-svg-MAfiUyDhSpGtUW13 .cluster-label span p{background-color:transparent;}#mermaid-svg-MAfiUyDhSpGtUW13 .label text,#mermaid-svg-MAfiUyDhSpGtUW13 span{fill:#333;color:#333;}#mermaid-svg-MAfiUyDhSpGtUW13 .node rect,#mermaid-svg-MAfiUyDhSpGtUW13 .node circle,#mermaid-svg-MAfiUyDhSpGtUW13 .node ellipse,#mermaid-svg-MAfiUyDhSpGtUW13 .node polygon,#mermaid-svg-MAfiUyDhSpGtUW13 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MAfiUyDhSpGtUW13 .rough-node .label text,#mermaid-svg-MAfiUyDhSpGtUW13 .node .label text,#mermaid-svg-MAfiUyDhSpGtUW13 .image-shape .label,#mermaid-svg-MAfiUyDhSpGtUW13 .icon-shape .label{text-anchor:middle;}#mermaid-svg-MAfiUyDhSpGtUW13 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-MAfiUyDhSpGtUW13 .rough-node .label,#mermaid-svg-MAfiUyDhSpGtUW13 .node .label,#mermaid-svg-MAfiUyDhSpGtUW13 .image-shape .label,#mermaid-svg-MAfiUyDhSpGtUW13 .icon-shape .label{text-align:center;}#mermaid-svg-MAfiUyDhSpGtUW13 .node.clickable{cursor:pointer;}#mermaid-svg-MAfiUyDhSpGtUW13 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-MAfiUyDhSpGtUW13 .arrowheadPath{fill:#333333;}#mermaid-svg-MAfiUyDhSpGtUW13 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MAfiUyDhSpGtUW13 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MAfiUyDhSpGtUW13 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MAfiUyDhSpGtUW13 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MAfiUyDhSpGtUW13 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MAfiUyDhSpGtUW13 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-MAfiUyDhSpGtUW13 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MAfiUyDhSpGtUW13 .cluster text{fill:#333;}#mermaid-svg-MAfiUyDhSpGtUW13 .cluster span{color:#333;}#mermaid-svg-MAfiUyDhSpGtUW13 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-MAfiUyDhSpGtUW13 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MAfiUyDhSpGtUW13 rect.text{fill:none;stroke-width:0;}#mermaid-svg-MAfiUyDhSpGtUW13 .icon-shape,#mermaid-svg-MAfiUyDhSpGtUW13 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MAfiUyDhSpGtUW13 .icon-shape p,#mermaid-svg-MAfiUyDhSpGtUW13 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-MAfiUyDhSpGtUW13 .icon-shape rect,#mermaid-svg-MAfiUyDhSpGtUW13 .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MAfiUyDhSpGtUW13 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-MAfiUyDhSpGtUW13 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-MAfiUyDhSpGtUW13 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    Client层

    主节点 Master

    数据读写

    数据读写

    心跳与块报告

    心跳与块报告

    心跳与资源汇报

    心跳与资源汇报

    从节点 Slave

    DataNode

    NodeManager

    从节点 Slave

    DataNode存储数据块

    NodeManager管理容器

    NameNodeHDFS元数据管理

    ResourceManagerYARN全局资源调度


    二、HDFS:分布式文件系统

    HDFS 是整个 Hadoop 生态的存储基石。它的设计目标是运行在廉价硬件上,提供高容错、高吞吐量的数据访问。

    1. 架构角色

    HDFS 采用经典的主从(Master/Slave)架构 :

    • NameNode(主节点):相当于“目录索引”。它管理文件系统的命名空间,维护所有文件和目录的元数据(如文件名、权限、以及文件数据块所在的DataNode列表)。NameNode 还会记录每个块的存放位置,但并不持久化存储每个块的具体位置信息,这些信息在启动时由DataNode提供。
    • DataNode(从节点):真正的“搬运工”。负责存储实际的数据块(Block)。默认情况下,一个文件会被切割成 128MB 大小的块,并且每个块会有 3 个副本,分布在不同的 DataNode 上以保证数据安全 。
    • Secondary NameNode(辅助节点):不是NameNode的热备。它定期合并 NameNode 的日志(edits log)和镜像文件(fsimage),帮助 NameNode 在重启时更快地启动,并在 NameNode 损坏时提供恢复依据 。

    2. 读写流程(流程图)

    HDFS 写数据流程

    当客户端要往 HDFS 写入一个文件时,流程如下:

    #mermaid-svg-DaHpvuuiSGbuJuk3{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DaHpvuuiSGbuJuk3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DaHpvuuiSGbuJuk3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DaHpvuuiSGbuJuk3 .error-icon{fill:#552222;}#mermaid-svg-DaHpvuuiSGbuJuk3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DaHpvuuiSGbuJuk3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DaHpvuuiSGbuJuk3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DaHpvuuiSGbuJuk3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DaHpvuuiSGbuJuk3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DaHpvuuiSGbuJuk3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DaHpvuuiSGbuJuk3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DaHpvuuiSGbuJuk3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DaHpvuuiSGbuJuk3 .marker.cross{stroke:#333333;}#mermaid-svg-DaHpvuuiSGbuJuk3 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DaHpvuuiSGbuJuk3 p{margin:0;}#mermaid-svg-DaHpvuuiSGbuJuk3 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-DaHpvuuiSGbuJuk3 .cluster-label text{fill:#333;}#mermaid-svg-DaHpvuuiSGbuJuk3 .cluster-label span{color:#333;}#mermaid-svg-DaHpvuuiSGbuJuk3 .cluster-label span p{background-color:transparent;}#mermaid-svg-DaHpvuuiSGbuJuk3 .label text,#mermaid-svg-DaHpvuuiSGbuJuk3 span{fill:#333;color:#333;}#mermaid-svg-DaHpvuuiSGbuJuk3 .node rect,#mermaid-svg-DaHpvuuiSGbuJuk3 .node circle,#mermaid-svg-DaHpvuuiSGbuJuk3 .node ellipse,#mermaid-svg-DaHpvuuiSGbuJuk3 .node polygon,#mermaid-svg-DaHpvuuiSGbuJuk3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DaHpvuuiSGbuJuk3 .rough-node .label text,#mermaid-svg-DaHpvuuiSGbuJuk3 .node .label text,#mermaid-svg-DaHpvuuiSGbuJuk3 .image-shape .label,#mermaid-svg-DaHpvuuiSGbuJuk3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-DaHpvuuiSGbuJuk3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DaHpvuuiSGbuJuk3 .rough-node .label,#mermaid-svg-DaHpvuuiSGbuJuk3 .node .label,#mermaid-svg-DaHpvuuiSGbuJuk3 .image-shape .label,#mermaid-svg-DaHpvuuiSGbuJuk3 .icon-shape .label{text-align:center;}#mermaid-svg-DaHpvuuiSGbuJuk3 .node.clickable{cursor:pointer;}#mermaid-svg-DaHpvuuiSGbuJuk3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DaHpvuuiSGbuJuk3 .arrowheadPath{fill:#333333;}#mermaid-svg-DaHpvuuiSGbuJuk3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DaHpvuuiSGbuJuk3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DaHpvuuiSGbuJuk3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DaHpvuuiSGbuJuk3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DaHpvuuiSGbuJuk3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DaHpvuuiSGbuJuk3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DaHpvuuiSGbuJuk3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DaHpvuuiSGbuJuk3 .cluster text{fill:#333;}#mermaid-svg-DaHpvuuiSGbuJuk3 .cluster span{color:#333;}#mermaid-svg-DaHpvuuiSGbuJuk3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DaHpvuuiSGbuJuk3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DaHpvuuiSGbuJuk3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-DaHpvuuiSGbuJuk3 .icon-shape,#mermaid-svg-DaHpvuuiSGbuJuk3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DaHpvuuiSGbuJuk3 .icon-shape p,#mermaid-svg-DaHpvuuiSGbuJuk3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DaHpvuuiSGbuJuk3 .icon-shape rect,#mermaid-svg-DaHpvuuiSGbuJuk3 .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DaHpvuuiSGbuJuk3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DaHpvuuiSGbuJuk3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DaHpvuuiSGbuJuk3 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    数据写入管道

    返回可用DataNode列表

    请求分配第一个Block

    复制Block

    复制Block

    确认副本完成

    更新元数据

    客户端

    向NameNode请求上传文件

    NameNode检查权限及路径

    客户端将文件切分为Block

    DataNode 1

    DataNode 2

    DataNode 3

    NameNode

    写入成功

    流程简述:客户端向 NameNode 请求上传文件 -> NameNode 检查目标路径和权限 -> NameNode 告知客户端可写入的 DataNode 列表 -> 客户端将文件切分成 Block -> 按顺序将 Block 以**管道(Pipeline)**方式写入第一个 DataNode,并由该节点自动复制给后续节点 -> 所有副本写入成功后,客户端通知 NameNode 更新元数据 。

    HDFS 读数据流程

    读取文件时,流程则体现为“计算向数据移动”的思想:

    #mermaid-svg-cwV9bV5ITRkeQC08{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cwV9bV5ITRkeQC08 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cwV9bV5ITRkeQC08 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cwV9bV5ITRkeQC08 .error-icon{fill:#552222;}#mermaid-svg-cwV9bV5ITRkeQC08 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cwV9bV5ITRkeQC08 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cwV9bV5ITRkeQC08 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cwV9bV5ITRkeQC08 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cwV9bV5ITRkeQC08 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cwV9bV5ITRkeQC08 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cwV9bV5ITRkeQC08 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cwV9bV5ITRkeQC08 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cwV9bV5ITRkeQC08 .marker.cross{stroke:#333333;}#mermaid-svg-cwV9bV5ITRkeQC08 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cwV9bV5ITRkeQC08 p{margin:0;}#mermaid-svg-cwV9bV5ITRkeQC08 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-cwV9bV5ITRkeQC08 .cluster-label text{fill:#333;}#mermaid-svg-cwV9bV5ITRkeQC08 .cluster-label span{color:#333;}#mermaid-svg-cwV9bV5ITRkeQC08 .cluster-label span p{background-color:transparent;}#mermaid-svg-cwV9bV5ITRkeQC08 .label text,#mermaid-svg-cwV9bV5ITRkeQC08 span{fill:#333;color:#333;}#mermaid-svg-cwV9bV5ITRkeQC08 .node rect,#mermaid-svg-cwV9bV5ITRkeQC08 .node circle,#mermaid-svg-cwV9bV5ITRkeQC08 .node ellipse,#mermaid-svg-cwV9bV5ITRkeQC08 .node polygon,#mermaid-svg-cwV9bV5ITRkeQC08 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cwV9bV5ITRkeQC08 .rough-node .label text,#mermaid-svg-cwV9bV5ITRkeQC08 .node .label text,#mermaid-svg-cwV9bV5ITRkeQC08 .image-shape .label,#mermaid-svg-cwV9bV5ITRkeQC08 .icon-shape .label{text-anchor:middle;}#mermaid-svg-cwV9bV5ITRkeQC08 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-cwV9bV5ITRkeQC08 .rough-node .label,#mermaid-svg-cwV9bV5ITRkeQC08 .node .label,#mermaid-svg-cwV9bV5ITRkeQC08 .image-shape .label,#mermaid-svg-cwV9bV5ITRkeQC08 .icon-shape .label{text-align:center;}#mermaid-svg-cwV9bV5ITRkeQC08 .node.clickable{cursor:pointer;}#mermaid-svg-cwV9bV5ITRkeQC08 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-cwV9bV5ITRkeQC08 .arrowheadPath{fill:#333333;}#mermaid-svg-cwV9bV5ITRkeQC08 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cwV9bV5ITRkeQC08 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cwV9bV5ITRkeQC08 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cwV9bV5ITRkeQC08 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-cwV9bV5ITRkeQC08 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cwV9bV5ITRkeQC08 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-cwV9bV5ITRkeQC08 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cwV9bV5ITRkeQC08 .cluster text{fill:#333;}#mermaid-svg-cwV9bV5ITRkeQC08 .cluster span{color:#333;}#mermaid-svg-cwV9bV5ITRkeQC08 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cwV9bV5ITRkeQC08 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-cwV9bV5ITRkeQC08 rect.text{fill:none;stroke-width:0;}#mermaid-svg-cwV9bV5ITRkeQC08 .icon-shape,#mermaid-svg-cwV9bV5ITRkeQC08 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cwV9bV5ITRkeQC08 .icon-shape p,#mermaid-svg-cwV9bV5ITRkeQC08 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-cwV9bV5ITRkeQC08 .icon-shape rect,#mermaid-svg-cwV9bV5ITRkeQC08 .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cwV9bV5ITRkeQC08 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-cwV9bV5ITRkeQC08 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-cwV9bV5ITRkeQC08 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    HDFS集群

    客户端

    向NameNode请求读取文件

    NameNode返回元数据文件Block分布在哪些DataNode

    客户端根据元数据选择最近的DataNode读取Block

    DataNode 1Block A

    DataNode 2Block B

    客户端合并Block

    完成读取

    流程简述:客户端向 NameNode 请求读取文件 -> NameNode 返回该文件所有 Block 所在的 DataNode 列表(考虑网络拓扑,按近到远排序)-> 客户端直接连接到最近的 DataNode 并行读取数据块 -> 在客户端本地合并成完整的文件 。


    三、YARN:资源调度与管理系统

    在 Hadoop 1.x 时代,MapReduce 既负责计算又负责资源管理,这导致了系统的耦合度过高。YARN 的出现将资源管理和作业调度/监控分离,成为了 Hadoop 的操作系统内核 。

    1. 架构角色

    • ResourceManager(RM):全局老大。负责整个集群的资源管理和分配,处理客户端的请求,启动和监控 ApplicationMaster,并在节点故障时进行容错处理 。
    • NodeManager(NM):单机管家。负责单个节点的资源管理(CPU、内存),启动并监控容器(Container),并定期向 ResourceManager 汇报本节点资源使用情况 。
    • ApplicationMaster(AM):任务监工。每个提交到 YARN 的应用程序都有一个专属的 AM。它负责向 ResourceManager 申请资源(Container),并与 NodeManager 通信启动任务,同时监控任务的运行状态,进行容错 。
    • Container:资源容器。对任务运行环境的抽象,封装了 CPU、内存等资源及环境变量。

    2. YARN 的任务提交流程

    #mermaid-svg-KyHnYao1ACl4efFs{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KyHnYao1ACl4efFs .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KyHnYao1ACl4efFs .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KyHnYao1ACl4efFs .error-icon{fill:#552222;}#mermaid-svg-KyHnYao1ACl4efFs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KyHnYao1ACl4efFs .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KyHnYao1ACl4efFs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KyHnYao1ACl4efFs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KyHnYao1ACl4efFs .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KyHnYao1ACl4efFs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KyHnYao1ACl4efFs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KyHnYao1ACl4efFs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KyHnYao1ACl4efFs .marker.cross{stroke:#333333;}#mermaid-svg-KyHnYao1ACl4efFs svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KyHnYao1ACl4efFs p{margin:0;}#mermaid-svg-KyHnYao1ACl4efFs .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-KyHnYao1ACl4efFs .cluster-label text{fill:#333;}#mermaid-svg-KyHnYao1ACl4efFs .cluster-label span{color:#333;}#mermaid-svg-KyHnYao1ACl4efFs .cluster-label span p{background-color:transparent;}#mermaid-svg-KyHnYao1ACl4efFs .label text,#mermaid-svg-KyHnYao1ACl4efFs span{fill:#333;color:#333;}#mermaid-svg-KyHnYao1ACl4efFs .node rect,#mermaid-svg-KyHnYao1ACl4efFs .node circle,#mermaid-svg-KyHnYao1ACl4efFs .node ellipse,#mermaid-svg-KyHnYao1ACl4efFs .node polygon,#mermaid-svg-KyHnYao1ACl4efFs .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KyHnYao1ACl4efFs .rough-node .label text,#mermaid-svg-KyHnYao1ACl4efFs .node .label text,#mermaid-svg-KyHnYao1ACl4efFs .image-shape .label,#mermaid-svg-KyHnYao1ACl4efFs .icon-shape .label{text-anchor:middle;}#mermaid-svg-KyHnYao1ACl4efFs .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KyHnYao1ACl4efFs .rough-node .label,#mermaid-svg-KyHnYao1ACl4efFs .node .label,#mermaid-svg-KyHnYao1ACl4efFs .image-shape .label,#mermaid-svg-KyHnYao1ACl4efFs .icon-shape .label{text-align:center;}#mermaid-svg-KyHnYao1ACl4efFs .node.clickable{cursor:pointer;}#mermaid-svg-KyHnYao1ACl4efFs .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KyHnYao1ACl4efFs .arrowheadPath{fill:#333333;}#mermaid-svg-KyHnYao1ACl4efFs .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KyHnYao1ACl4efFs .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KyHnYao1ACl4efFs .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KyHnYao1ACl4efFs .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KyHnYao1ACl4efFs .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KyHnYao1ACl4efFs .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KyHnYao1ACl4efFs .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KyHnYao1ACl4efFs .cluster text{fill:#333;}#mermaid-svg-KyHnYao1ACl4efFs .cluster span{color:#333;}#mermaid-svg-KyHnYao1ACl4efFs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KyHnYao1ACl4efFs .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KyHnYao1ACl4efFs rect.text{fill:none;stroke-width:0;}#mermaid-svg-KyHnYao1ACl4efFs .icon-shape,#mermaid-svg-KyHnYao1ACl4efFs .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KyHnYao1ACl4efFs .icon-shape p,#mermaid-svg-KyHnYao1ACl4efFs .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KyHnYao1ACl4efFs .icon-shape rect,#mermaid-svg-KyHnYao1ACl4efFs .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KyHnYao1ACl4efFs .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KyHnYao1ACl4efFs .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KyHnYao1ACl4efFs :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    提交Application

    分配Container启动ApplicationMaster

    启动

    向RM注册并申请资源

    返回资源列表

    通知NM启动Container

    通知NM启动Container

    执行Task

    执行Task

    心跳汇报进度

    心跳汇报进度

    注销并关闭

    客户端

    ResourceManager

    NodeManager 1

    ApplicationMaster

    NodeManager 2

    NodeManager 3

    MapTask/ReduceTask

    MapTask/ReduceTask

    流程简述:客户端提交作业到 ResourceManager -> RM 在某个 NodeManager 上分配第一个 Container 启动 ApplicationMaster -> AM 启动后向 RM 注册并申请资源(Container列表) -> AM 向对应的 NodeManager 发送指令启动真正的 Task(Map/Reduce) -> Task 运行期间通过 AM 向 RM 汇报进度 -> 作业完成后,AM 注销并释放资源 。


    四、MapReduce:分布式计算框架

    MapReduce 是一种分而治之的编程模型,用于大规模数据集的并行计算。它将计算过程抽象为两个阶段:Map(映射)和Reduce(归约) 。

    1. 核心思想

    • Map:把复杂的任务分解为若干个“简单的任务”来并行处理。
    • Reduce:把 Map 阶段处理后的结果进行汇总。

    2. 经典 WordCount 代码示例

    下面是一个统计文本中单词出现次数的经典案例 :

    // Mapper类:负责切分单词并输出 <单词,1>
    public static class TokenizerMapper
    extends Mapper<Object, Text, Text, IntWritable>{

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(LongWritable key, Text value, Context context
    ) throws IOException, InterruptedException {
    StringTokenizer itr = new StringTokenizer(value.toString());
    while (itr.hasMoreTokens()) {
    word.set(itr.nextToken());
    context.write(word, one); // 输出: (hello, 1)
    }
    }
    }

    // Reducer类:负责累加相同单词的次数
    public static class IntSumReducer
    extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values,
    Context context
    ) throws IOException, InterruptedException {
    int sum = 0;
    for (IntWritable val : values) {
    sum += val.get(); // 累加: (hello, [1,1,1]) -> 3
    }
    result.set(sum);
    context.write(key, result); // 输出: (hello, 3)
    }
    }

    3. MapReduce 完整执行流程

    #mermaid-svg-Yb2fNOeEHaaqZRRQ{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Yb2fNOeEHaaqZRRQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .error-icon{fill:#552222;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .marker.cross{stroke:#333333;}#mermaid-svg-Yb2fNOeEHaaqZRRQ svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Yb2fNOeEHaaqZRRQ p{margin:0;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .cluster-label text{fill:#333;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .cluster-label span{color:#333;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .cluster-label span p{background-color:transparent;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .label text,#mermaid-svg-Yb2fNOeEHaaqZRRQ span{fill:#333;color:#333;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .node rect,#mermaid-svg-Yb2fNOeEHaaqZRRQ .node circle,#mermaid-svg-Yb2fNOeEHaaqZRRQ .node ellipse,#mermaid-svg-Yb2fNOeEHaaqZRRQ .node polygon,#mermaid-svg-Yb2fNOeEHaaqZRRQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .rough-node .label text,#mermaid-svg-Yb2fNOeEHaaqZRRQ .node .label text,#mermaid-svg-Yb2fNOeEHaaqZRRQ .image-shape .label,#mermaid-svg-Yb2fNOeEHaaqZRRQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .rough-node .label,#mermaid-svg-Yb2fNOeEHaaqZRRQ .node .label,#mermaid-svg-Yb2fNOeEHaaqZRRQ .image-shape .label,#mermaid-svg-Yb2fNOeEHaaqZRRQ .icon-shape .label{text-align:center;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .node.clickable{cursor:pointer;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .arrowheadPath{fill:#333333;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Yb2fNOeEHaaqZRRQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Yb2fNOeEHaaqZRRQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Yb2fNOeEHaaqZRRQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .cluster text{fill:#333;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .cluster span{color:#333;}#mermaid-svg-Yb2fNOeEHaaqZRRQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Yb2fNOeEHaaqZRRQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .icon-shape,#mermaid-svg-Yb2fNOeEHaaqZRRQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .icon-shape p,#mermaid-svg-Yb2fNOeEHaaqZRRQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .icon-shape rect,#mermaid-svg-Yb2fNOeEHaaqZRRQ .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Yb2fNOeEHaaqZRRQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Yb2fNOeEHaaqZRRQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Yb2fNOeEHaaqZRRQ :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    Reduce阶段

    Shuffle阶段分区 排序 拷贝

    Map阶段

    输入分片

    输出 (k,v)

    输出 (k,v)

    输出 (k,v)

    文件 0

    Split 1

    Split 2

    Split 3

    MapTask

    MapTask

    MapTask

    环形缓冲区

    环形缓冲区

    环形缓冲区

    溢写到磁盘并按分区排序

    归并排序合并溢写文件

    ReduceTask拉取对应分区数据

    最终结果写入HDFS

    流程详解 :

  • Map 阶段:

    • Input:从 HDFS 读取数据,根据输入格式(InputFormat)将文件切分成多个 Split(逻辑切片),每个 Split 启动一个 MapTask。
    • Map:运行用户自定义的 map() 函数,输出中间结果到内存缓冲区(环形缓冲区)。
    • Spill(溢写):当缓冲区达到阈值(默认80%),后台线程开始将数据溢写到本地磁盘。在溢写过程中,会进行分区(Partition)和排序(Sort)。如果用户定义了 Combiner(相当于小型的本地Reduce),会在此时执行。
  • Shuffle 阶段:

    • Copy:ReduceTask 启动多个复制线程,通过 HTTP 方式从各个 MapTask 完成的节点上拉取属于自己的分区数据。
    • Merge:ReduceTask 将从不同 Map 拉取来的数据进行合并(Merge)和排序,形成 Reduce 函数的输入文件。
  • Reduce 阶段:

    • 运行用户自定义的 reduce() 函数,对排序后的数据进行聚合计算。
    • 将最终结果写入 HDFS。
  • 五、总结:三驾马车的协同

    在 Hadoop 集群中,这三大组件形成了一个高效的整体:

    • HDFS 提供了坚实的数据仓库,让海量数据有处可存,且安全可靠。
    • YARN 扮演了大管家的角色,统筹集群的计算资源,谁该用多少、什么时候用,都由它说了算。
    • MapReduce 则是执行者,它利用 YARN 分配的资源,对 HDFS 上的数据进行大规模并行计算。

    理解这三者的关系,是掌握 Hadoop 乃至整个大数据技术生态的基石。无论是后来的 Hive、Spark 还是 Flink,很多都是在 YARN 之上运行,并利用 HDFS 进行存储的。打好这个基础,你在学习其他大数据组件时会事半功倍。

    在这里插入图片描述

    🌺The End🌺点点关注,收藏不迷路🌺

    赞(0)
    未经允许不得转载:171主机测评 » Hadoop 核心组件详解:HDFS、YARN、MapReduce 如何各司其职?
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址