1.2 Hadoop初体验
1.2.1 了解Hadoop的构架
Hadoop是一个能够对大量数据进行分布式处理的软件框架,实现了Google的MapReduce编程模型和框架,能够把应用程序分割成许多小的工作单元,并把这些单元放到任何集群节点上执行。在MapReduce中,一个准备提交执行的应用程序称为“作业(job)”,而从一个作业划分出的、运行于各计算节点的工作单元称为“任务(task)”。此外,Hadoop提供的分布式文件系统(HDFS)主要负责各个节点上的数据存储,并实现了高吞吐率的数据读写。
在分布式存储和分布式计算方面,Hadoop都使用主/从(Master/Slave)架构。在一个配置完整的集群上想让Hadoop这头大象奔跑起来,需要在集群中运行一系列后台(deamon)程序。不同的后台程序扮演不同的角色,这些角色由NameNode、DataNode、Secondary NameNode、JobTracker、TaskTracker组成。其中NameNode、Secondary NameNode、JobTracker运行在Master节点上(如图1-1所示),而在每个Slave节点上,部署一个DataNode和TaskTracker,以便这个Slave服务器上运行的数据处理程序能尽可能直接处理本机的数据。对Master节点需要特别说明的是,在小集群中,Secondary NameNode可以属于某个从节点;在大型集群中,NameNode和JobTracker被分别部署在两台服务器上。
下面介绍各个角色在Hadoop中的作用。
1.NameNode
NameNode是HDFS的守护程序,负责记录文件是如何分割成数据块的,以及这些数据块分别被存储到哪些数据节点上。它的主要功能是对内存及I/O进行集中管理。
图1-1 Hadoop主从节点结构分解
一般来说,NameNode所在的服务器不存储任何用户信息或执行计算任务,以避免这些程序降低服务器的性能。如果其它从服务器因出现软硬件的问题而宕机,Hadoop集群仍旧可以继续运转,或者快速重启。但是,由于NameNode是Hadoop集群中的一个单点,一旦NameNode服务器宕机,整个系统将无法运行。
2.DataNode
集群中的每个从服务器都运行一个DataNode后台程序,这个后台程序负责把HDFS数据块读写到本地的文件系统。当需要通过客户端读/写某个数据时,先由NameNode告诉客户端去哪个DataNode进行具体的读/写操作,然后,客户端直接与这个DataNode服务器上的后台程序进行通信,并且对相关的数据块进行读/写操作。
3.Secondary NameNode
Secondary NameNode是一个用来监控HDFS状态的辅助后台程序。就像NameNode一样,每个集群都有一个Secondary NameNode,并且部署在一台单独的服务器上。Secondary NameNode不同于NameNode,它不接收或记录任何实时的数据变化,但是,它会与NameNode进行通信,以便定期地保存HDFS元数据的快照。由于NameNode是单点的,通过Secondary NameNode的快照功能,可以将NameNode的宕机时间和数据损失降低到最小。同时,如果NameNode发生问题,Secondary NameNode可以及时地作为备用NameNode使用。
4.JobTracker
JobTracker后台程序用来连接应用程序与Hadoop。用户代码提交到集群以后,由JobTracker决定哪个文件将被处理,并且为不同的task分配节点。同时,它还监控所有运行的task,一旦某个task失败了,JobTracker就会自动重新开启这个task,在大多数情况下这个task会被放在不同的节点上。当然,具体运行情况取决于重启的预设值。每个Hadoop集群只有一个JobTracker,一般运行在集群的Master节点上。
5.TaskTracker
TaskTracker与负责存储数据的DataNode相结合,其处理结构上也遵循主/从架构。JobTracker位于主节点,统领MapReduce工作;而TaskTrackers位于从节点,独立管理各自的task。每个TaskTracker负责独立执行具体的task,而JobTracker负责分配task。虽然每个从节点上仅有唯一的一个TaskTracker,但是每个TaskTracker可以产生多个Java虚拟机(JVM),用于并行处理多个map以及reduce任务。TaskTracker的一个重要职责就是与JobTracker交互。如果JobTracker无法准时地获取TaskTracker提交的信息,JobTracker就判定TaskTracker已经崩溃,并将任务分配给其他节点处理。
1.2.2 查看Hadoop活动
通过“http://(Master node的主机名/IP):50030”命令链接到JobTracker,可以直观地查看Hadoop执行任务时的情况。
1.JobTracker页面
图1-2给出通过http://UbuntuMaster:50030访问JobTracker主页的截图。
页面最上方给出了Hadoop的安装细节,读者可以了解Hadoop的版本号、编译时间以及JobTracker的当前状态(在本例中,状态是running)和启动时间。
集群信息(Cluster Summary)部分提供的是关于集群的概要信息。包括:当前正在集群上运行的map和reduce的数量、作业提交的数量、集群的负载状况、集群中可用的map和reduce任务数(“Map Task Capacity”和“Reduce Task Capacity”),每个节点平均可用的任务数、列入黑名单的TaskTrackers数等信息。调度信息(Scheduling Information)显示正在运行的作业调度器的相关信息(此处是“默认值”),单击“default”可以查看作业队列(显示的是正在运行、完成和失败的作业)。如果任务还没有完成,那么每部分都会有一个作业表,表里每行显示出作业的ID、作业拥有者、作业名(使用JobConf的setJobName()方法设置的mapred.job.name属性)以及进度信息。接下来的三部分依次给出了有关作业运行(Running Jobs)、结束(Completed Jobs)以及失败(Failed Jobs)的信息,读者可通过这三部分了解作业运行状态。
页面的最后给出了一些链接信息,它们指向了JobTracker日志以及JobTracker历史信息,这些信息是永久存储的。
2.作业页面
单击图1-2中的作业ID,可以进入如图1-3所示的作业页面。页面最上方是作业的摘要,包括:作业的拥有者、作业名和作业运行时间。作业文件是整理过的作业配置文件,包括作业运行中有效的所有属性和值。如果不确定某个属性的值,可以单击该属性查看文件。
图1-2 JobTracker页面
图1-3 作业页面
当作业在运行时,可通过作业页面监视作业进度,页面信息会定期自动更新。摘要信息下方的表格展示map和reduce进度。Num Tasks显示该作业map和reduce的总数(图中的作业示例执行了两个map任务和一个reduce任务)。其他列显示的是这些任务的状态:Pending(挂起)、Running(运行)、Complete(完成)和Killed(失败)。最后一列显示的是一个作业所有map和reduce任务中失败和中止的任务尝试(Task Attempt)总数(Task Attempt标记为Killed的原因可能是:它们是推测执行的副本,Task Attempt运行的Task Tracker已结束,或这些Task Attempt已被用户中止)。
该页的中间部分是用来给作业计数的表。在作业运行时,表中的这些信息都会定期地动态更新。
该页面的后半部分显示每个任务进度的完成图(如图1-4所示)。其中,Reduce完成图可以分为三个阶段:copy(map输出的数据传输到reduce的TaskTracker需要通过copy来实现)、sort(在reduce输入时,对数据进行sort)以及reduce(reduce函数运行产生最后输出结果)。
图1-4 任务进度图
此外,通过“http://(Master node的主机名/IP):50070”可以链接到NameNode,对HDFS进行检测。另外,在NameNode和JobTracker Web 页面内,还含有大量链接,可以获取更多有关Hadoop配置和操作的其它信息(包括运行日志),读者需要时可以自行查看更多的细节。