分布式批处理:MapReduce初探

大家好,我是方圆。《数据密集型应用系统设计》第十章中有介绍到 MapReduce 相关的内容,当时觉得看得意犹未尽,所以便找了一些资料又看了一下。随着深入发现能扩展的东西实在太多,考虑时间有限,准备先把 MapReduce 基础相关的知识和其中的思想总结和记录下来,如果之后有机会接触到大数据相关的工作再做深入的研究。

1. 什么是MapReduce?

MapReduce 是一个编程模型(框架),它采用 “分治” 的处理模式:首先将数据进行分块,之后对数据进行处理,包括 Map阶段Reduce阶段

Map阶段是对输入的数据进行整合,通过定义的输入格式获取文件信息和类型,并且确定读取方式,最终将读取的内容以 键值对 的形式保存。

Reduce阶段则是对Map阶段生成的数据进行二次处理,从而获得我们想要的计算结果。

这样理解起来比较抽象,我们通过一个简单的栗子来描述下 MapReduce 的执行过程:

比如,现在我们安排学生数图书馆中所有的书,A同学数1号书架上的书,B同学数2号书架上的书… 这样人越多的话,数书的速度就越快,这个过程就对应的是 Map阶段;之后我们将所有同学数书的结果值加在一起,这就对应了 Reduce阶段

2. MapReduce作业执行流程

我们将 MapReduce 执行的任务称为 job。通常使用 job 把输入的数据分割成若干的独立数据块,并分布在不同的节点上。然后通过分散在不同节点上的 map 任务以完全并行的形式进行处理,之后 MapReduce 对 map 的处理结果进行收集,然后将结果输送给 reduce 进行下一步处理。它的执行流程图如下

MapReduce处理流程.jpg

  1. MapReduce 框架首先将输入文件划分为 M 片,每片通常为 16MB 到 64MB 大小,随后会启动集群中服务器的进程

  2. 集群中的进程分为 Master进程Worker进程。Master 会挑选空闲的 Worker,一次分配一个 map 任务或者一个 reduce 任务,而 Worker 进程则负责执行任务

  3. 被分配到 map 任务的 Worker 读取对应分片的输入,从输入中解析出键值对,并分别将其传给用户定义的 map 函数。map 函数会在每条输入记录上调用一次,完成后返回的中间键值对会被暂时缓存在内存里。对于每个输入记录,它可以生成任意数量的键值对,并且不会保留从一个输入记录到下一个记录的任何状态,因此对每个记录的处理都是独立的

  4. Worker 内存中缓存的键值对,会被分片函数分成 R 个分片,并周期性地写进本地磁盘。这些键值对在磁盘上的位置会被发送给 Master,Master 负责将位置发送给被分配到 reduce 任务的 Worker

  5. 当一个 Reduce Worker 接收到 Master 发送的这些位置,它会向保存这些内容的 Map Worker 发送 RPC 请求来读取这些内容。当一个 Reduce Worker 读取完所有的中间数据,就会将其根据 key 进行排序,这样所有相同 key 的数据就会聚合在一起。这种排序是必要的,因为通常许多不同的 key 会由同一个 reduce 任务处理。如果数据过大,可能会使用外部排序

  6. Reduce Worker 遍历有序的中间数据,对遇到的所有 key,都会将 key 和对应的值集合传给用户定义的 reduce 函数。reduce 函数的输出会被追加到一个最终的输出文件(每个 reduce 分片一个)

  7. 当所有的 map 任务和 reduce 任务都完成后,MapReduce 的任务也就完成了

运行结束后,MapReduce 的运行结果保存在 R 个输出文件中,通常这些文件会被用作下一个 Mapreduce 任务的输入,组成 工作流(一个作业的输出成为下一个作业的输入) 的形式。不过,在工作流中的一项作业只有在先前的作业完后成才能开始,所以需要 Master 来处理作业间的依赖问题,这样才能使得系统更加高效。

过程中的 map 函数和 reduce 函数是需要我们自定义实现的。在大多数情况下,map 任务的代码在将要运行的服务器节点上并不存在,所以 Master 首先会将代码复制到适当的服务器上,然后启动 map 任务开始读取输入文件。因为 “移动计算比移动数据更划算” ,一个应用请求的计算,尤其是在海量级别的数据时候,离它的数据越近就越高效,因为这样能降低网络阻塞的影响,提高系统数据的吞吐量。

3. 从MapReduce到批处理系统

批处理系统区别于在线服务系统,后者每收到一个客户的请求都会尽快处理并返回一个响应,而批处理系统则是读取一些输入数据并产生一些输出数据,这往往需要一段时间(从几分钟到几天),通常情况不会有用户等待作业完成,所以批处理系统又被称为 离线系统,而且你可以反复的运行它们,因为它们不会对输入进行修改(只读)。

基于 MapReduce 实现的系统,如 HDFS(Hadoop File System) 就是典型的批处理系统,它提出时就是为了能够通过使用 大量普通的服务器 搭建集群来实现大数据的并行处理,其最优先考虑的是数据的扩展性和系统的可用性。

批处理系统常被应用在广告行业,通过统计点击率的信息,调整相应广告的投放能力;也可以用来分析既定网站在某一时间段内的用户数,以此来判断服务器合适的维护时间。这个操作涉及浏览全部服务器上的日志文件,并对其信息进行提取和处理,繁重且复杂,但是如果应用了 Hadoop 这种大数据处理系统就能化繁为简。


巨人的肩膀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方圆想当图灵

嘿嘿,小赏就行,不赏俺也不争你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值