Hadoop工作机制详解

1、Hadoop介绍

  随着现代社会的发展,信息数据量高速增长。然而单机的计算机,无论是硬盘存储、网络IO、计算CPU还是内存都是非常有限的。针对这种情况,Hadoop便应运而生。
  从其定义就可以发现,它解决了两大问题:大数据存储、大数据分析。也就是Hadoop的两大核心:HDFS和MapReduce。HDFS(Hadoop Distributed File System)是可扩展、容错、高性能的分布式文件系统,异步复制,一次写入多次读取,主要负责存储。MapReduce为分布式计算框架,主要包含map(映射)和reduce(归约)过程,负责在HDFS上进行计算。

  Hadoop是一个能够让用户轻松架构和使用的分布式计算的平台。用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。其优点主要有以下几个:

  1. 高可靠性:Hadoop按位存储和处理数据的能力值得人们信赖。
  2. 高扩展性:Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
  3. 高效性:Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
  4. 高容错性:Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
  5. 低成本:与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,Hadoop是开源的,项目的软件成本因此会大大降低。
  6. Hadoop带有用Java语言编写的框架,因此运行在Linux生产平台上是非常理想的,Hadoop上的应用程序也可以使用其他语言编写,比如C++。

2、HDFS介绍

HDFS主要由三类节点构成:NameNode、DataNode和Secondary NameNode。

Hadoop工作机制详解

  名称节点(NameNode)它是一个通常在HDFS架构中单独机器上运行的组件,负责管理文件系统名称空间和控制外部客户机的访问。NameNode决定是否将文件映射到DataNode上的复制块上。对于最常见的3个复制块,第一个复制块存储在同一机架的不同节点上,最后一个复制块存储在不同机架的某个节点上。

  数据节点(DataNode)数据节点也是一个通常在HDFS架构中的单独机器上运行的组件。Hadoop集群包含一个NameNode和大量DataNode。数据节点通常以机架的形式组织,机架通过一个交换机将所有系统连接起来。数据节点响应来自HDFS客户机的读写请求。它们还响应来自NameNode的创建、删除和复制块的命令。名称节点依赖来自每个数据节点的定期心跳(heartbeat)消息。每条消息都包含一个块报告,名称节点可以根据这个报告验证块映射和其他文件系统元数据。如果数据节点不能发送心跳消息,名称节点将采取修复措施,重新复制在该节点上丢失的块。

NameNode DataNode
存储元数据 存储文件内容
元数据保存在内存中 文件内容保存在磁盘
保存文件, block, DataNode 之间的关系 维护了 block 到 DataNode 文件之间的关系

  第二名称节点(Secondary NameNode)第二名称节点的作用在于为HDFS中的名称节点提供一个Checkpoint,它只是名称节点的一个助手节点,这也是它在社区内被认为是Checkpoint Node的原因。如图2-3所示,只有在NameNode重启时,edits才会合并到fsimage文件中,从而得到一个文件系统的最新快照。

3、MapReduce介绍

  MapReduce一般分为三个阶段:Map、Shuffle、Reduce。下图以一个简单的WordCount为例:

Hadoop工作机制详解

  1. input:输入数据一般放在HDFS上面就可以了,而且文件是被分块的。关于文件块和文件分片的关系,在输入分片中说明。
  2. 输入分片:在进行Map阶段之前,MapReduce框架会根据输入文件计算输入分片(split),每个输入分片会对应一个Map任务,输入分片往往和HDFS的块关系很密切。例如,HDFS的块的大小是128MB,如果我们输入两个文件,大小分别是27MB、129MB,那么27MB的文件会作为一个输入分片(不足128M会被当作一个分片),而129MB则是两个输入分片(129-128=1,不足128MB,所以1MB也会被当作一个输入分片),所以,一般来说,一个文件块会对应一个分片。如图所示,Splitting对应下面的三个数据应该理解为三个分片。
  3. Map阶段:这个阶段的处理逻辑其实就是程序员编写好的Map函数,因为一个分片对应一个Map任务,并且是对应一个文件块,所以这里其实是数据本地化的操作,也就是所谓的移动计算而不是移动数据。如图所示,这里的操作其实就是把每句话进行分割,然后得到每个单词,再对每个单词进行映射,得到单词和1的键值对。
  4. Shuffle阶段:这是“奇迹”发生的地方,MapReduce的核心其实就是Shuffle。Shuffle就是将Map的输出进行整合,然后作为Reduce的输入发送给Reduce。简单理解就是把所有Map的输出按照键进行排序,并且把相对键的键值对整合到同一个组中。如图所示,Bear、Car、Deer、River是排序的,并且Bear这个键有两个键值对。
  5. Reduce阶段:与Map类似,这里也是用户编写程序的地方,可以针对分组后的键值对进行处理。如图所示,针对同一个键Bear的所有值进行了一个加法操作,得到<Bear,2>这样的键值对。
  6. 输出:Reduce的输出直接写入HDFS上,同样这个输出文件也是分块的。

4、YARN介绍

  MapReduce发展到2.x时就不使用JobTracker来作为自己的资源管理框架,而选择使用YARN。

Hadoop工作机制详解
YARN集群主要包括三种组件:

  1. ResourceManager:ResourceManager是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(ApplicationManager,)。Scheduler负责分配最少但满足Application运行所需的资源量给Application。Scheduler只是基于资源的使用情况进行调度,并不负责监视/跟踪Application的状态,当然也不会处理失败的Task。ApplicationManager负责处理客户端提交的Job以及协商第一个Container以供ApplicationMaster运行,并且在ApplicationMaster失败的时候会重新启动ApplicationMaster(YARN中使用ResourceContainer概念来管理集群的资源,Resource Container是资源的抽象,每个Container包括一定的内存、IO、网络等资源)。
  2. ApplicationMasterApplicatonMaster是一个框架特殊的库,每个Application有一个ApplicationMaster,主要管理和监控部署在YARN集群上的各种应用。
    Application有一个ApplicationMaster,主要管理和监控部署在YARN集群上的各种应用。
  3. NodeManager主要负责启动Resourcemanager分配给ApplicationMaster的Container,并且会监视Container的运行情况。在启动Container的时候,NodeManager会设置一些必要的环境变量以及相关文件;当所有准备工作做好后,才会启动该Container。启动后,NodeManager会周期性地监视该Container运行占用的资源情况,若是超过了该Container所声明的资源量,则会kill掉该Container所代表的进程。

有错误的地方敬请指出,欢迎大家评论区或者私信交流!每日持续更新Java、Python、大数据技术,请大家多多关注!