我们先介绍构成 Hadoop 1.x系统的组件,再介绍构成 Hadoop 2.x 系统的新组件。宏观上说,Hadoop 1.x 系统有以下几个守护进程:
维护着存储在 HDFS 上的所有文件的元数据信息。这些元数据信息包括组成文件的数据块信息,及这些数据块在数据节点上的位置。这个组件正是使用 Hadoop 1.x 搭建大型计算集群系统的瓶颈所在。
这不是名称节点的热备份。实际上,它作为Hadoop 平台的一个组件,其命名不是很恰当。它为名称节点组件执行一些内务处理功能(housekeeping functions)。
把真正的数据块存放在本地硬盘上,这些数据块组成了保存在HDFS 上的每个文件。
这是 Hadoop 系统的主要组件之一,它负责一个任务的整个执行过程。它的具体功能包括:调度各个子任务(Mapper 任务和 Reducer 任务各自的子任务)到各自的计算节点运行,时刻监控任务运行和计算节点的健康状况,对失败的子任务重新调度执行。就像名称节点一样,这个组件是使用 Hadoop 1.x 搭建大型计算集群系统的瓶颈所在。
运行在各个数据节点上,用来启动和管理各个 Map/Reduce 任务。与作业跟踪器进行通信。
Hadoop 1.x 集群有两种类型的节点:主节点(master nodes) 和从节点 (slave nodes)。
主节点负责执行如下几个守护进程:名称节点进程、辅助名称节点进程、作业跟踪器进程
从节点分布在整个集群上并执行如下几个守护进程:数据节点进程、任务跟踪器进程
Hadoop 分布式文件系统(HDFS) 用于支持数据处理程序要处理的大文件。这样的程序在处理数据的时候,有一次写、多次读的特点。
HDFS 文件系统由以下几个守护进程协调地运行来提供服务:
HDFS 系统也是主从架构的。运行名称节点进程的服务器为主节点,运行数据节点进程的服务器为从节点。一般情况下,集群中的每个从节点都会运行一个数据节点进程。这个数据节点进程管理着挂载到这个数据节点上的存储设备。HDFS 系统提供一个统一的文件系统命名空间,用户就像使用一个文件系统一样来存取集群节点上的数据。名称节点进程负责管理这些存储在集群上的文件的元数据。
当客户端向 HDFS 请求读取或者存储一个文件的时候,它需要知道要访问的数据节点是哪一个。知道这个信息之后,客户端可以直接访问那个数据节点。文件的元数据信息由名称节点来负责维护。
HDFS 系统提供一个统一的文件系统命名空间,用户就像使用一个文件系统一样来存取集群节点上的数据。HDFS 把存储在目录中的文件按照一定的层级展示出来,目录是可以嵌套的。
所有文件和目录的元数据信息都由名称节点来负责管理。名称节点管理所有的文件操作,包括文件/目录的打开、关闭、重命名、移动等等。数据节点就负责存储实际的文件数据。这是一个非常重要的区别。当客户点请求或者发送文件数据,文件的数据在物理上是不经过名称节点传输的。否则这将是一个极其严重的瓶颈。客户端仅仅是简单地从名称节点获取文件的元数据,然后根据其元数据信息直接从数据节点获取文件的数据块。
名称节点存储的一些元数据包括:
名称节点服务器上存放元数据的文件为 fsimage。 Hadoop 系统运行期间任何涉及对元数据修改的操作都保存在内存中,并且被持久存储到另外一个名为 edits 的文件。辅助名称节点会周期性地把 edits 文件中的信息合并到 fsimage 文件中
我们知道名称节点在内存中维护着所有的元数据。名称节点最先从存放在本地文件系统中的 fsimage 文件将元数据加载到内存中。在 Hadoop 系统中的一系列操作运行过程中,元数据信息在内存中不断更新。为了防止数据丢失,这些数据操作记录还会被持久存储到另外一个名为 edits 的本地文件中。
edits 文件是用来在 Hadoop 系统运行期间收集元数据的变化的。如果 Hadoop 系统重启了,在 Hadoop 重启的过程中,edits 文件中的内容会与 fsimage 文件中的内容合并。显然,这会拖慢 Hadoop 系统的重启时间。辅助名称节点就是来处理这个问题的。辅助名称节点的作用就是周期性地把 edits 文件中的内容与 fsimage 文件中的内容合并。为此目的,辅助名称节点会周期性地顺序执行下列步骤:
名称节点可以导致 Hadoop 1.x 系统单点故障。如果 edits 文件和fsimage 文件数据损坏了,存放在 HDFS 系统上的所有数据都会丢失。
任务跟踪器(TaskTracker)守护进程在集群中每台计算节点中运行,接收诸如 Map、Reduce 和 Shuffle 这些操作任务的请求。每个任务跟踪器都会分配一定的槽位数(a set ofslots),其槽位数的数量一般与计算节点上可用的 CPU 核数一致。任务跟踪器接收到一个(来自作业跟踪器)的请求之后,就会启动一个任务(task),任务跟踪器会为这个任务初始化一个新的JVM。JVM 重用是可以的,但这项功能在实际用法示例中并不常见。使用 Hadoop 平台的大多数用户都将该功能关闭了。任务跟踪器分配一项任务取决于它的可用槽位(slots) 数量(槽位数量二实际运行的任务数量)。任务跟踪器负责向作业跟踪器(JobTracker)发送心跳消息。除了向作业跟踪器反馈任务跟踪器的运行状况之外,心跳信息中还包括了任务跟踪器当前可用的槽位数量。
作业跟踪器(JobTracker)守护进程负责启动和监控 MapReduce 作业。当一个客户端向Hadoop 系统提交一个作业,作业的启动流程如下图所示:
该过程的详细步骤如下:
作业跟踪器的故障会导致 Hadoop 系统的单点故障。如果作业跟踪器节点挂掉,集群上所有的任务都将无法正确运行。由于仅有一个作业跟踪器节点运行,在多任务同时运行的系统环境中,会增加该作业跟踪器节点的工作负载。