Map/Reduce

 Hadoop Map/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个廉价机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。
一个Map/Reduce作业(job)通常会把输入的数据集切分成若干的数据块,由map任务(task)以完全并行的方式处理它们。框架会对map的输出进行排序,然后结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。整个框架负责任务的调度和监控,以及重新执行已失败的任务。
 通常,Map/Reduce框架和分布式文件系统是运行在一组相同节点上的,也就是说,计算节点和存储节点通常在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用。
Map/Reduce框架由一个单独的master JobTracker和每个集群节点一个slave TaskTracker共同组成。master负责调度构成一个作业的所有任务,这些任务分布在不同的slave上,master监控它们执行,重新执行已经失败的任务。而slave仅负责执行由master指派的任务。
 应用程序至少应该指明输入/输出的位置(路径),并通过实现合适的接口或抽象类提供map和reduce函数。再加上其它作业的参数,就构成了作业配置(job configuration)。然后,Hadoop的job client提交作业(jar包/可执行程序等)和配置信息给JobTracker,后者负责分发这些软件和配置信息给slave、调度任务并监控它们的执行,同时提供状态和诊断信息给job-client。
 虽然Hadoop框架是用Java实现的,但Map/Reduce应用程序则不一定用Java来写。
 Hadoop Streaming是一种运行作业的实用工具,它允许用户创建和运行任何可执行程序(例如:Shell工具)来做为mapper和reducer。
 Hadoop Pipes是一个与SWIG兼容的C++ API(没有基于JNI技术),它也可用于实现Map/Reduce应用程序。
 输入与输出:
Map/Reduce框架运转在<key,value>键值对上,也就是说,框架把作业输入看为是一组<key,value>键值对,同样也产出一组<key,value>键值对做为作业的输出,这两组键值对的类型可能不同。
框架需要对key和value的类(classes)进行序列化操作,因此,这些类需要实现Writable接口。另外,为了方便框架执行排序操作,key类必须实现WritableComparable接口。
一个Map/Reduce作业的输入和输出类型如下所示:
 (input)<k1,v1>->map-><k2,v2>->combine-><k2,v2>->reduce-><k2,v3>(output)
posted @ 2011-04-20 19:18  langke93  阅读(345)  评论(0编辑  收藏  举报