探讨mapper和reducer之间的关系

JobTracker负责作业调度和执行的各个方面,所以当执行任何与作业管理相关的的任务时,他成为了我们的主要接口。JobTracker代表我们与NameNode通信,并对存储信息存在HDFS上的数据相关的所有交互进行管理。

1.将输入分块

这些交互首先发生在JobTracker接受输入数据,并确定如何将其分配给map任务的时候。回想一下,HDFS文件通常备份成至少128MB的数据块,JobTracker会将每个数据块分配给一个map任务。设想一个更大的以TB为单位的输入文件,切分模型变得更有意义。每段文件(或用MapReduce术语来讲每个split)由一个map作业处理。

一旦对各个分块完成了运算,JobTracker就会将他们和包含Mapper与Reduce类的JAR文件放置在HDFS上作业专用的目录,而该路径在任务开始时将被传递给每个任务。

2.分配任务

一旦JobTracker确定了所需的map任务数,他就会检查集群中的主机数,正在运行的TaskTracker数以及可并行执行的map任务数(用户自定义的配置变量)。JobTracker也会查看各个输入数据块在集群中的分布位置,并禅师定义一个执行计划,使TaskTracker尽可能处理位于相同物理主机上的数据块。或者即使做不到这一点,TaskTracker至少处理一个位于相同硬件机架的数据块。

数据局部性优化是Hadoop能高效处理巨大数据集的一个关键原因。默认情况下每个数据块会被复制到三台不同的主机。所以,在本地处理大部分数据块的任务/主机计划比起初预想的可能性更高。

3.启动任务

然后每个TaskTracker开启一个独立的Java虚拟机来执行任务。这确实增加了启动时间损失但它将因错误运行map或reduce任务所引发的问题与TaskTracker隔离开来,而且可以将它配置成在随后执行的任务之间共享。
如果集群有足够的能力一次性执行所有的map任务,它们将会被全部启动,并获得它们将要处理的分块数据和作业JAR文件。每个TaskTracker随后将分块复制到本地文件系统。
如果任务数超过了集群能力,JobTracker将维护一个挂起任务队列,并在节点完成最初分配的map任务后,将挂起任务分配给节点。
现在,我们准备查看map任务执行完毕的数据。听起来工作量似乎很大,事实确实如此。这也解释了在运行任意MapReduce作业时,为什么系统启动及执行上述步骤会花费大量时间。

4.不断监视JobTracker

现在,JobTracker等待TaskTracker执行所有的mapper和reducer。它不断地与TaskTracker交换心跳和状态消息,查找进度或问题的证据。它还从整个作业执行过程的所有任务中收集指标,其中一些指标是Hadoop提供的,还有一些是map和reduce任务的开发人员指定的,不过本例中我们没有使用任何指标。

5.mapper的输入

This is a test

Yes this is 

驱动类使用TextInputFormat指定了输入我呢见的格式和结构,因此,Hadoop会把输入我呢见看作以行号为键并以改行内容为值的文本。因此mapper的两次调用将被赋予以下输入

1 This is a test

2 Yes this is 

6.mapper的输出和reducer的输入

mapper的输出是一些列形式为(word,1)的键值对。

(This,1),(is,1),(a,1),(test.,1),(Yes,1),(it,1),(is,1)

这些是从mapper输出的键值对并不会直接传给reducer。在map和reduce之间,还有一个shuffle阶段

7.分块

Reduce接口的隐性保证之一是,与给定键相关的所有值都会被提交到同一个reducer。由于个集群中运行着多个reduce任务,因此,每个mapper的输出必须被分块,使其分别传入相应的各个reducer。这些分块文件保存在本地节点的文件系统。
集群中的Reduce任务数并不像mapper数量一样是动态的事实上,我们可以在作业提交阶段指定reduce任务数。因此,每个TaskTracker就知道集群中有多少个reducer,并据此得知mapper输出应切分为多少块。

8.reducer类的输入

reducer的TaskTracker从JobTracker接收更新,这些更新指明了集群中哪些节点承载着map的输出分块,这些分块将由本地reduce任务处理。之后,TaskTracker从各个节点获取分块,并将它们合并为一个文件反馈给reduce任务。

9.reducer类的执行

我们实现的wordcountReducer类很简单。针对每个词,该类仅对数组中的元素数目进行统计并为每个词输出最终的(word,count)键值对。

10.reducer类的输出

因此,本例中reducer的最终输出集合为:
(This,1),(is,2), (a,1), (test,1), (yes,1), (this,1)
这些数据将被输出到驱动程序指定的输出路径下的分块文件中,并将使用指定的OutputFormat对其进行格式化。每个reduce任务写人一个以part-r-nnnnn为文件名的文件,其中nnnnn从00000开始并逐步递增。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值