【MapReduce】MapReduce:Simplified Data Processing on Large Clusters

本文深入解析MapReduce编程模型,涵盖其工作原理、实现细节与优化技巧。MapReduce是一种处理大规模数据集的并行算法模型,通过Map和Reduce函数处理和生成数据。文章详细介绍了MapReduce的执行流程、容错机制、数据存储策略以及提升性能的实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


摘要

MapReduce是一个处理和生成超大数据及的算法模型的相关实现。用户首先创建一个Map函数处理一个基于key/value pair的数据集合,输出中间的基于key/value pair的数据集合;然后创建一个Reduce函数来合并所有的具有先沟通中间key值的中间value值。

这个系统在运行时只关心:

  • 如何分割输入数据
  • 如何在大量计算机组成的集群中调度
  • 集群中计算机错误的处理
  • 管理集群中计算机之间必要的通信

一个典型的MapReduce模型往往由几千台机器组成、处理以TB计算的数据

1、介绍

如何处理并行计算、如何分发数据、如何处理错误。这些问题在分布式计算中需要精心处理。

为了解决这些问题,设计了一个新的抽象的模型。使用这个模型只需要描述想要执行的运算即可,不必关心并行计算、容错、数据分布、负载均衡等复杂细节,这些解决方案都被封装在一个库里。

本文分为七个章节,各个章节的内容如下:

  • 第二部分描述了基本的编程模型和一些使用案例
  • 第三部分描述了一个经过裁剪的、适合我们的基于集群的计算环境的MapReduce实现
  • 第四部分描述了我们认为在MapReduce编程模型中的一些实用技巧
  • 第五部分对于各种不同的任务,测量我们MapReduce实现的性能
  • 第六部分揭示了在google内部如何使用MapReduce作为基础重写索引系统产品,包括其他一些使用MapReduce的经验
  • 第七部分探讨了相关的和未来的工作

2、编程模型

MapReduce编程模型的原理是:利用一个输入key/value pair集合来产生一个输出的key/value pair集合。MapReduce库的用户用两个函数表达这个计算:Map和Reduce。

用户自定义的 Map 函数接受一个输入的 key/value pair值,然后产生一个中间 key/value pair 值的集合。MapReduce库把所有具有相同中间key值i的中间 value 值集合在一起后传递给reduce函数。

用户自定义的 Reduce 函数接受一个中间 key 的值i和相关的一个 value 值的集合。 Reduce 函数合并这些value值,形成一个较小的value值的集合。一般的,每次 Reduce 函数调用只产生 0 或 1 个输出value值。通常我们通过一个迭代器把中间value值提供给Reduce函数,这样我们就可以处理无法全部放入内存中的大量的value值的集合。

2.1 示例

有一些简单例子帮助我们理解MapReduce模型:

  • 分布式的Grep:Map函数输出匹配某个模式的一行,Reduce函数是一个恒等函数,即把中间数据复制到输出。
  • 计算URL访问频率:Map函数处理日志中web页面请求的记录,然后输出(URL,1),Reduce函数吧URL的value值都加起来,产生(URL,记录总数)结果。
  • 倒转网络链接图:Map函数在源页面(source)中搜索所有的链接目标(target)并输出位(target,source)。Reduce函数把给定链接目标(target)的链接组成一个列表,输出(target,list(source))。
  • 每个主机的检索词向量:每个主机的检索词向量:检索词向量用一个
    词 频率 列表来概述出现在文档或文档集中的最重要的一些词。Map 函数为每一个输入文档输出 主机名 检索词向量 )),其中主机名来自文档的 URL。Reduce函数接收给定主机的所有文档的检索词向量,并把这些检索词向量加在一起,丢弃掉低频的检索词,输出一个最终的主机名检索词向量 。
  • 倒排索引:Map 函数分析每个文档输出一个 词 文档号 的列表, Reduce 函数的输入是一个给定词的所有(词,文档号),排序所有的文档号,输出 词 ,list(文档号 。所有的输出集合形成一个简单的倒排索引,它以一种简单的算法跟踪词在文档中的位置。
  • 分布式排:Map函数从每个记录提取 key ,输出 (key, Reduce)函数不改变任何的值。这个运算依赖分区机制在4.1描述和排序属性在4.2描述 。

3、实现

MapReduce有多重实现方式,这取决于具体环境。一种方式适合小型的共享内存方式的机器;另一种方式则适用于大型NUMA架构的多处理器的机器,而有的实现方式更适合大型的网络连接集群。

本章讲述的是:用以太网交换机连接、由普通pc组成的大型机群。

3.1 执行概括

在这里插入图片描述

通过将Map调用的输入数据自动分割为M个数据片段的集合,Map调用被分不到多台机器上执行。输入的数据片段能够在不同机器上并行处理。

使用分区函数将Map调用产生的中间key值分成R个不同分布区,Reduce调用也被分不到多台机器上执行。分区数量(R)和分区函数由用户来指定。

当用户调用MapReduce函数时,发生了下面一系列动作:

  • 用户程序首先电泳MapReduce库将输入文件分成M个数据片段,每个数据片段一般16MB到64MB不等。然后用户程序在机群中创建大量的程序副本。
  • 这些程序副本中有一个特殊的程序-master。副本中其他程序都是worker程序,由master分配任务。有M个Map任务和R个Reduce任务被分配。master将一个Map任务或Reduce任务分配给一个空闲的worker。
  • 被分配了map任务的worker读取相关输入数据片段,从数据数据片段中解析出key/value pair,然后把key/value pair传递给用户自定义的Map函数,并由此生成输出的中间key/value pair,并缓存在内存中。
  • 缓存中的key/value pair通过分区函数分成R个区域,之后周期性的写入本地磁盘上。缓存的key/value pair在本地磁盘上的存储位置被回传给master,由master负责把这些存储位置传送给reduce worker。
  • 当reduce worker程序接收到master程序发来的数据位置存储信息后,使用RPC从map worker所在的主机磁盘上读取这些缓存数据。当reduce worker读取所有中间数据后,通过key进行排序使得有相同key值的数据聚集在一起。
  • reduce worker程序便利排序后的中间数据,对于每个唯一的中间值key,reduce worker程序将这个key值和它相关的中间value值的集合传递给用户自定义的reduce函数。reduce函数的输出被追加到所属分区的输出文件。
  • 当所有map和reduce任务都完成后,master唤醒用户程序。这是用户程序的MapReduce调用才返回。

注意,MapReduce的输出放在R个输出文件中。通常用户会把这些文件作为另一个MapReduce的输入或者在另一个可以处理多个分割文件的分布式应用中使用。

3.2 master的数据结构

master存储每个map和reduce任务的状态(空闲、工作中或完成)以及worker机器(非空闲中的机器)的标志。

master存储了map任务产生的R个中间文件存储区域的大小和位置。

3.3 容错

3.3.1 worker故障

master周期性的ping每个worker。如果一个在一个约定时间内没有收到回复,master将其标记为失效。所有这个失效的worker完成的map任务被重设为初始的空闲状态,这样就可以将其分派给其他worker。同时worker失效时正在运行的map或reduce任务也将被重置为空闲状态等待重新调度。

注:

  • 已经完成的reduce任务输出存储在全局文件系统上,因此不需要再次执行
  • 一个map任务首先被worker A 执行,然后A失效又被调度到worker B,这个重新执行的动作会被通知给所有执行reduce任务的worker。任何还没有从worker A读取数据的reduce任务都将从worker B读取数据。
3.3.2 master失败

一个简单方法是将master周期性的把上述数据结构写入磁盘,并设置检查点与日志。但比较麻烦。可以采用master失败就终止MapReduce运算,并通知客户,以便让其重新执行。

3.3.3 失效方面的处理机制

当用户提供的map和reduce操作是输入确定性函数(即相同输入产生相同输出),我们的分布式实现也是输入确定性的。

3.4 存储位置

考虑到网络带宽问题,尽量把输入数据存储在集群及其中机器的本地磁盘来节省网络带宽。MapReduce的master在调度map任务时会考虑输入文件的位置信息,尽量将一个map任务调度到包含相关输入数据拷贝的机器上执行。如果没有调度到临近机器上。

3.5 任务粒度

map拆成了M个片段,reduce拆成了R个片段执行。我们应该合适选择M的值使得每个独立任务处理大约16MB到64MB的数据。

3.6 备用任务

影响一个MapReduce总执行时间的因素通常是“落伍者”。我们通过一个机制减少“落伍者”出现情况:

当一个MapReduce操作接近完成时,master调度备用任务进程执行剩下的、处于处理中状态的任务。无论哪个先完成都标记为完成。


4、技巧

4.1 分区函数设计

4.2 顺序保证

系统确保在给定的分区中,中间key/value pair数据的处理顺序是按照key值增量顺序处理,这样的顺序保证每个分区生成一个有序的输出文件。

4.3 combiner函数

4.4输入和输出的类型

MapReduce库支持几种不同格式的输入数据。文本模式的输入数据的每一行被视为一个key/value pair,key是文件偏移量,value是一行内容

4.5 副作用

4.6 跳过损坏的记录

用户程序的bug导致map或者reduce函数处理某些记录的时候crash掉。通常是修复bug后再次执行MapReduce。但是有时bug很难找到并修复,bug也可能在第三方库里。MapReduce在检测到哪些记录导致确定性的crash,跳过这些记录不处理。

4.7 本地执行版本

4.8 状态信息

master用嵌入式http服务器显示一组状态信息页面,提供监控信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值