什么是Hadoop?

Hadoop是Apache的一款开源框架,使用java语言编写,可以通过编写简单的程序来实现大规模数据集合的分布式计算。工作在Hadoop框架上的应用可以工作在分布式存储和计算机集群计算的环境上面。Hadoop具有高扩展性,其集群能够从单台机器扩展到数千台机器。
Hadoop 采用的是Apache v2协议,Hadoop基于Google发布的MapReduce论文实现,并且应用了函数式编程的思想。

Hadoop 架构

Hadoop框架包括下述三个个模块

HDFS, MapReduce, YARN

HDFS

Hadoop Distributed File System (HDFS) 是Hadoop集群中最根本的文件系统,它提供了高扩展,高容错,机架感知数据存储等特性,可以非常方便的部署在机器上面。HDFS除过分布式文件系统所通有的特点之外,还有些仅属自己的特点:

  • 对硬件故障的考虑设计
  • 更大的数据单元,默认的块大小为128M
  • 对序列操作的优化
  • 机架感知
  • 支持异构集群和跨平台

Hadoop集群中的数据被划分成更小的单元(通常被称为),并且将其分布式存储在集群中,每个块有两个副本,这个两个副本被存储在集群的的一个机架上。这样数据包含自身便有三个副本,具有极高的可用性和容错性,如果一个副本丢失,HDFS将会自动的重新复制一份,以确保集群中一共包含三个数据副本(包含自身)。

HDFS也可以有多种形式,这个取决于Hadoop版本及所需功能。

HDFS是Leader/Follower架构实现的,每个集群都必须包含一个NameNode节点,和一个可选的SecondaryName节点,以及任意数量的DataNodes。

除了管理文件系统命名空间和管理元数据之外,NameNode对clients而言,还扮演着master和brokers的角色(虽然clients是直接与DataNode进行通信的)。NameNode完全存在于内存中,但它仍然会将自身状态写入磁盘。

HDFS 的替代文件系统

HDFS是Hadoop中经典的文件系统,但是Hadoop并不仅仅支持HDFS,它还支持其他的文件系统,比如Local file system, FTP, AWS S3, Azure’s file system, 和OpenStack’s Swift,这些文件系统可以在使用时根据不同URI进行区分。比如:

file: for the local file system
s3: for data stored on Amazon S3

MapReduce

MapReduce是为能够在集群上分布式处理海量数据而量身订做的框架,MapReduce job可以分为三次连续过程。

  • Map 将输入数据划分为key-value集合
  • Shuffle 将Map产生的结果传输给Reduce
  • Reduce 则对接收到的key-value进一步处理

MapReduce的最大工作单元便是job,每个job又会被分割成map task或reduce task。最经典的MapReduce job便是统计文档中单词出现的频率,这个过程可以使用下图来描述

mapreduce

YARN

YARN (Yet Another Resource Negotiator) 是为应用执行分配计算资源的一个框架。YARN主要包含下面三个核心组件

  • ResourceManager(一个集群只有一个)
  • ApplicationMaster(每个应用都有一个)
  • NodeManagers (每个节点都有一个)

yarn

Note:

YARN 使用了一些容易让人误解的名词作为术语,因此应该特别注意。比如在Hadoop ecosystem中,Container这个概念,平常我们听到Container时,我们都认为是与Docker相关。但是这里却是指_Resource Container (RC)_,即表示物理资源的集合。通常被抽象的表示,将资源分配给到目标和可分配单元。
Application也是一个熟词僻义的用法,在YARN中,一个Application指的是被一并执行的task的集合,YARN中的Application的概念大概类似于MapReduce中的job这个概念。

ResourceManager

ResourceManager在YARN中是一个rack-aware master节点,它主要负责管理所有可用资源的集合和运行一些至关重要的服务,其中最重要的便是Scheduler

Scheduler组件是YARN Resourcemanager中向运行时应用分配资源的一个重要组件,它仅仅完成资源调度的功能,并不完成监控应用状态和进度的功能,因此即使应用执行失败,它也不会去重启失败的应用。

但是在Hadoop 2.7.2开始,YARN开始支持少数调度策略CapacitySchedulerFairScheduler,FIFO Scheduler。默认情况下由Hadoop来负责决定使用哪种调度策略,无论使用那种调度策略,Scheduler都会通过Continer来向请求的ApplicationMaster分配资源。

ApplicationMaster

每个运行在Hadoop上面的应用都会有自己专用的ApplicationMaster实例。每个实例进会存在于集群中每个节点仅属于自己的单独Container。每个Application的ApplicationMaster都会周期性的向ResourceManager发送心跳消息,如果有需要的话,还会去向ResourceManger请求额外的资源,ResourceManager便会为额外的资源划分租期(表明该资源已被某NodeManager所持有)

ApplicationMaster会监控每个application的整个生命周期,从向ResourceManager请求额外的资源到向NodeManager提交请求。

NodeManagers

NodeManager可以认为是监控每个节点的Container的代理,会监控每个Container的整个生命周期,包括Continer的资源使用情况,与ResourceManager的周期性通信。

从概念上来说,NodeManager更像是Hadoop早期版本的TaskTrackers,当时Taskrackers主要被用来解决调度map和reduce slots问题,NodeManager有一个动态创建的,任意大小的Resouce Containers(RCs),并不像MR1中的那种slots,RCs可以被用在map tasks中,reduce tasks中,或者是其他框架的tasks

为了更好的描述YARN,这里给出一个YARN application的执行过程。如下图所示:

yarn

  1. client向ResourceManager提交一个MapReduce应用,和启动指定应用的ApplicationMaster所需要的信息。
  2. ResourceManager 会为ApplicationMaster分派一个Container,并且启动Application
  3. ApplicationMaster启动,接着向ResourceManager注册自己,允许调用client直接与ApplicationMaster交互
  4. ApplicatoinMaster为客户端应用分配资源
  5. ApplicationMaster为application启动Container
  6. 在执行期间,clients向Applicationaster提交application状态和进度
  7. apllication执行完成,ApplicationMaster向ResouceManager撤销掉自己的注册信息,然后关机,将自己所持有的Container归还给资源池。

Reference

Hadoop architectural overview