Mengdong的技术博客

学习,记录,分享

导航

《Data-intensive Text Processing with MapReduce》读书笔记第2章:MapReduce基础(4)

本读书笔记的目录地址:http://www.cnblogs.com/mdyang/archive/2011/06/29/data-intensive-text-prcessing-with-mapreduce-contents.html

2.6 Hadoop集群架构 

 

图2.6 完整的Hadoop集群架构

 将上面的所有功能模块整合起来,我们就可以得到完整的Hadoop集群架构(如图2.6):

1) HDFS namenode上运行namenode守护进程(daemon)

2) 工作提交节点(job submission node)上运行工作追踪器(jobtracker),这种节点直接与客户端连接,接受MapReduce工作(job)。jobtracker监测MapReduce工作的执行状态,协调mapper和reducer的执行序。

一般来说这两种节点(1)和2))分开部署于不同的物理机之上,而在相对较小的集群中也有协同部署的情况存在(即1)和2)部署于同一台机器上)。

一个MapReduce工作被分割成一定数量的map任务(task)和reduce任务。任务追踪器(tasktracker)周期性地向jobtracker发送搏动消息(heartbeat message),jobtracker收到搏动消息后发送反馈消息。当tasktracker能够执行新任务时(在Hadoop中体现为tasktracker的任务槽中有了空槽位),jobtracker的反馈信息中将会包含新任务的相关信息。

reducer的数量由程序员编程指定。而mapper的数量则取决于多个因素:程序员可在程序中指定mapper数量,而最终的实际数量由Hadoop根据多个因素(程序指定数、输入文件的数量、文件的块数)确定。执行时,每个mapper将被分配一个key-value对的序列(在Hadoop中称为一个输入分割,即an input split)。input split由执行框架自动计算出,执行框架尽量保证每个input split恰好对应一个HDFS数据块大小,使得每个mapper得到的数据量都是一个块。调度mapper执行时,jobtracker将会尽量利用好数据局部性:jobtracker尽量让每个mapper都在持有其将要处理的数据的机器上执行,这样每个mapper都将只处理局部数据(避免网络传输)。对于实在无法运行在本机的mapper,将会通过网络传输的方法解决(比如mapper1处理b1,mapper2处理b2,b1与b2均位于node1上,而node1只能执行一个mapper。当mapper1已经分配至node1时,mapper2只能分配至别的机器上,比如node2,然后将b2从node1传输至node2处理)。在更大规模的集群中,则有更为广义的局部性可以利用:例如机架(rack)内(intra-rack)的网络带宽远远超出机架间(inter-rack)的网络带宽,则如果不能保证数据本机,则退而求其次保证数据本机架(例如在上面那个例子的情况下,node1与node2位于同一个机架中,也算一种局部性)。

单单从概念上讲,可以理解为对输入数据的每个key-value对使用mapper,得到的中间结果经过分组、排序后,对每组具有相同key的中间结果key-value对使用reducer. 不过实际的执行更为复杂。

在Hadoop中,mapper是一个带有Map方法的Java对象,对于每个任务(task),由tasktracker生成一个mapper对象。mapper对象生成时将会挂载Hadoop API中的钩子(hook),可用来触发用户自定义的预处理程序代码。这意味着mapper在执行时可读入额外数据(例如程序状态、静态数据、字典等)。初始化完成后执行框架对所有输入数据执行Map方法。每个特定input split中的所有key-value对都由一个mapper对象处理,因此可以根据应用需求在每个mapper中记录当前上下文的处理状态,这个特性对于设计MapReduce算法十分重要。所有mapper输入数据处理完毕后,还可以执行用户自定义的后处理操作,这也是一个很重要的特性。

reducer的执行与mapper类似:对于每个reduce任务生成一个reducer对象,reducer对象也可以执行用户自定义的预处理和后处理操作。初始化完成后,对于每个划分(partition,由partitioner生成),对其中的每个key-value对迭代处理(MapReduce保证这个输入序列是有序的)。同样,对于每组reduce输入的处理都在一个reducer对象中完成,因此可以记录上下文信息(这对于MapReduce算法设计也很重要)。

2.7 总结

本章从函数式编程开始介绍,通过介绍mapper/reducer、划分器/合并器、分布式文件系统对MapReduce编程模型进行了概览。这将是进一步介绍MapReduce算法设计的基础。

posted on 2011-07-08 09:32  mdyang  阅读(1038)  评论(2编辑  收藏  举报