Hadoop技术内幕之Hadoop基本结构

来源:互联网 发布:最短路问题的floyd算法 编辑:程序博客网 时间:2024/05/22 01:51

Hadoop基本结构

Hadoop 由两部分组成, 分别是分布式文件系统和分布式计算框架 MapReduce。
分布式文件系统主要用于大规模数据的分布式存储, 而 MapReduce 则构建在分布式文件系
统之上, 对存储在分布式文件系统中的数据进行分布式计算。

HDFS结构

HDFS 是一个具有高度容错性的分布式文件系统, 适合部署在廉价的机器上。 HDFS 能
提供高吞吐量的数据访问, 非常适合大规模数据集上的应用。

总体上采用了 master/slave 架构, 主要由以下几个组件组成 :ClientNameNodeSecondary NameNode(在Hadoop 0.21.0中,SecondaryNameNodeCheckpoint Node代替) 和 DataNode

  1. Client
    Client( 代表用户) 通过与 NameNode 和 DataNode 交互访问 HDFS 中的文件。 Client
    提供了一个类似 POSIX 的文件系统接口供用户调用。
  2. NameNode
    整个 Hadoop 集群中只有一个 NameNode。 负责管理 HDFS的目录树和相关的文件元数据信息。 这些信息是以“fsimage” ( HDFS 元数据镜像文件)和“editlog” ( HDFS 文件改动日志) (在Hadoop 0.21.0中,二者合二为一)两个文件 形式存放在本地磁盘, 当 HDFS 重启时重新构造出来的。 此外,NameNode 还负责监控各个 DataNode 的健康状态, 一旦发现某个DataNode 宕掉, 则将该 DataNode 移出 HDFS 并重新备份其上面的数据。
  3. Secondary NameNode
    Secondary NameNode 最重要的任务并不是为 NameNode 元数据进行热备份, 而是定期合并 fsimage 和 edits 日志, 并传输给 NameNode。
    Secondary NameNode负责合并 fsimage 和 edits, 并将文件存储到磁盘上,
  4. DataNode
    每个 Slave 节点上安装一个 DataNode, 它负责实际的数据存储, 并将数据信息定期汇报给 NameNode。 DataNode 以固定大小的 block 为基本单位组织文件内容, 默认情况下 block 大小为 64MB。 当用户上传一个大的文件到 HDFS 上时, 该文件会被切分成若干个 block, 分别存储到不同的 DataNode ; 同时, 为了保证数据可靠, 会将同一个 block以流水线方式写到若干个( 默认是 3, 该参数可配置) 不同的 DataNode 上。 这种文件切割后存储的过程是对用户透明的。

Hadoop MapReduce结构

也采用Mater/Slave结构。它主要由以下几个组件组成 : Client、 JobTracker、 TaskTracker 和 Task。

这里写图片描述

  1. Client
    用户编写的 MapReduce 程序通过 Client 提交到 JobTracker 端 ; 同时, 用户可通过 Client 提供的一些接口查看作业运行状态。 在 Hadoop 内部用“作业” ( Job) 表示 MapReduce 程序。 一个MapReduce 程序可对应若干个作业, 而每个作业会被分解成若干个 Map/Reduce 任务( Task)。
  2. JobTracker
    JobTracker 主要负责资源监控和作业调度。 JobTracker 监控所有TaskTracker 与作业的健康状况, 一旦发现失败情况后, 其会将相应的任务转移到其他节点; 同时, JobTracker 会跟踪任务的执行进度、 资源使用量等信息, 并将这些信息告诉任务调度器, 而调度器会在资源出现空闲时, 选择合适的任务使用这些资源。 在 Hadoop 中, 任务调度器是一个可插拔的模块, 用户可以根据自己的需要设计相应的调度器。
  3. TashTracker
    TaskTracker 会周期性地通过 Heartbeat 将本节点上资源的使用情况和任务的运行进度汇报给 JobTracker, 同时接收 JobTracker 发送过来的命令并执行相应的操作( 如启动新任务、 杀死任务等)。 TaskTracker 使用“slot”等量划分本节点上的资源量。“slot”代表计算资源( CPU、内存等)。 一个 Task 获取到一个 slot 后才有机会运行, 而 Hadoop 调度器的作用就是将各个TaskTracker 上的空闲 slot 分配给 Task 使用。 slot 分为 Map slot 和 Reduce slot 两种, 分别供Map Task 和 Reduce Task 使用。 TaskTracker 通过 slot 数目( 可配置参数) 限定 Task 的并发度。
  4. Task
    Task 分为 Map Task 和 Reduce Task 两种, 均由 TaskTracker 启动。HDFS 以固定大小的 block 为基本单位存储数据, 而对于 MapReduce 而言, 其处理单位是 split。split 是一个逻辑概念, 它只包含一些元数据信息, 比如数据起始位置、 数据长度、 数据所在节点等。split 的多少决定了 Map Task 的数目, 因为每个 split 会交由一个 Map Task 处理。

这里写图片描述

Map Task 先将对应的 split 迭代解析成一个个 key/value 对, 依次调用用户自定义的 map() 函数进行处理, 最终将临时结果存放到本地磁盘上, 其中临时数据被分成若干个 partition, 每个 partition 将被一个 Reduce Task 处理。

这里写图片描述

该过程分为三个阶段
①从远程节点上读取 MapTask 中间结果( 称为“Shuffle 阶段” ); ②按照 key 对 key/value 对进行排序( 称为“Sort 阶段” ) ;
③依次读取 <key, value list>, 调用用户自定义的 reduce() 函数处理, 并将最终结果存到 HDFS 上( 称为“Reduce 阶段” )。

这里写图片描述

1 0
原创粉丝点击