云计算技术的核心思想是MapReduce架构,由Jeffrey Dean与Sanjay Ghemawat共同提出,是一种比较成功的分布式并行计算平台编程模式,适用于对大型数据集进行分布式处理和信息检索。MapRedtlce模型分为两个部分:Map部分和Redlice部分。Map部分将数据转换成中间键值对,并将中间键值对发送到远程数据节点,远程数据节点调用Reduce方法,对中间健值对进行合并、删减,生成最终键值对。MapReduce架构不仅建立键值对、并行传输,它还需要处理并发操作、容错及数据管理和负载均衡等细节问题。MapReduce最大的贡献就是屏蔽了实现细节,为用户提供了一系列简单的接口,可以最大限度地实现并行与分布计算。
虽然Map函数和Reduce函数都是用户自定义,但所有的MapReduce函数都需要遵循一个相同的约定:在Map部分产生一组间接的中间键值对,也就是对数据拆分的一个过程,在Reduce部分合并接收到的中间键值对,最终形成一个相对较小的值集合,Reduce执行后可能产生0个或者1个输出值。由于受架构的约束,必须将算法转换成这种形式执行,否则很困难或者无法在平台上运行。
架构中需要一个或多个节点执行总的中央控制功能,负责控制系统中资源的调度,接受用户请求并返回执行结果。不同的平台对执行这种功能的节点的命名方式不同,本书称其为Master节点,称普通的工作节点为Worker节点。Master分配Worker节点时,尽量调用本地Worker节点或者距离较近的节点来执行某一个任务,其目的是最大限度地减少网络数据传输量。Worker节点按照用户的请求和实际需要被分配相应的Map任务或者Reduce任务,在程序执行结束时,Master将节点释放,回收到资源池中,为下次执行任务做准备。Master节点定期发送Ping命令到所有节点中,如果Worker节点在一段时间内没有响应,则认为该节点失效,那么该节点的执行结果可能是不正确的,即使是正确结果该节点也无法被访问,因此需要对该任务再次分配节点,重新执行一遍。如果Master节点失效了,需要停止MapReduce程序的运行,再重新启动Master节点。各节点结构关系如图7-6所示。
图7-6 MapReduce架构中各类节点间的关系
MapReduce的执行过程如下。
(1)划分文件,每块大概16~64M,具体每块大小由参数决定。(www.daowen.com)
(2)在执行Map或者Reduce任务请求时,Master节点选择空闲的Worker节点,并为这些节点分配任务、传输命令执行环境。
(3)一个分配了Map任务的Worker节点读取、处理相关的输入块,将文本以行为单位传递给用户定义的Map函数,Map函数产生的中间键值对暂时缓冲到内存。
(4)缓冲到内存的中间键值对被定时刷写到本地硬盘中,这些数据通过分区函数分成R个区。本地硬盘存储中间键值对的位置信息被发送回Master节点,之后Master节点将这些位置信息传送给负责执行Reduce任务的Worker节点。
(5)Master节点通知执行Reduce函数的Worker节点中间键值对的物理位置,Reduce节点再从执行Map函数的Worker节点的本地磁盘中读取中间键值对。因为从不同的Map节点中接收数据时,数据的顺序是打乱的,因此当读取完成,执行Reduce任务的节点对中间Key值排序,保证相同Key的值存储在一起。所以对中间结果排序是必需的工作,但是如果中间结果集太大,则需要使用外排序。
(6)接受Reduce任务的Worker节点遍历所有排序后的中间数据,并把Key和相关的中间结果值集合传递给用户定义的Reduce函数。每一个Reduce节点输出一个最终的输出文件。
(7)当所有的Map任务和Reduce任务都执行完成时,Master激活用户程序,返回结果到用户程序的调用点。通常,用户不需要合并多个Reduce节点的输出文件到一个文件,可以把这些文件作为下一次MapReduce调用的输入,或者用另一个分布式应用来处理这些文件。在Map部分,如果需要执行数据合并,则可以调用Corebine函数,通常数据在Map本地进行合并,再通过网络传输到Reduce节点上。MapReduce的典型应用情况为:①庞大的数据文件;②数据库中的数据很少更新;③对数据的操作多为读操作和添加操作。并且要求数据有良好的并行性,以保证不会因挖掘算法顺序的不同,而产生不同的结果。因此,在本书中需要对选择做MapReduce化的数据和算法进行分析,判断是否适合并进行处理。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。