大家好,我是方圆。《数据密集型应用系统设计》第十章中有介绍到 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 框架首先将输入文件划分为 M 片,每片通常为 16MB 到 64MB 大小,随后会启动集群中服务器的进程
-
集群中的进程分为 Master进程 和 Worker进程。Master 会挑选空闲的 Worker,一次分配一个 map 任务或者一个 reduce 任务,而 Worker 进程则负责执行任务
-
被分配到 map 任务的 Worker 读取对应分片的输入,从输入中解析出键值对,并分别将其传给用户定义的 map 函数。map 函数会在每条输入记录上调用一次,完成后返回的中间键值对会被暂时缓存在内存里。对于每个输入记录,它可以生成任意数量的键值对,并且不会保留从一个输入记录到下一个记录的任何状态,因此对每个记录的处理都是独立的
-
Worker 内存中缓存的键值对,会被分片函数分成 R 个分片,并周期性地写进本地磁盘。这些键值对在磁盘上的位置会被发送给 Master,Master 负责将位置发送给被分配到 reduce 任务的 Worker
-
当一个 Reduce Worker 接收到 Master 发送的这些位置,它会向保存这些内容的 Map Worker 发送 RPC 请求来读取这些内容。当一个 Reduce Worker 读取完所有的中间数据,就会将其根据 key 进行排序,这样所有相同 key 的数据就会聚合在一起。这种排序是必要的,因为通常许多不同的 key 会由同一个 reduce 任务处理。如果数据过大,可能会使用外部排序
-
Reduce Worker 遍历有序的中间数据,对遇到的所有 key,都会将 key 和对应的值集合传给用户定义的 reduce 函数。reduce 函数的输出会被追加到一个最终的输出文件(每个 reduce 分片一个)
-
当所有的 map 任务和 reduce 任务都完成后,MapReduce 的任务也就完成了
运行结束后,MapReduce 的运行结果保存在 R 个输出文件中,通常这些文件会被用作下一个 Mapreduce 任务的输入,组成 工作流(一个作业的输出成为下一个作业的输入) 的形式。不过,在工作流中的一项作业只有在先前的作业完后成才能开始,所以需要 Master 来处理作业间的依赖问题,这样才能使得系统更加高效。
过程中的 map 函数和 reduce 函数是需要我们自定义实现的。在大多数情况下,map 任务的代码在将要运行的服务器节点上并不存在,所以 Master 首先会将代码复制到适当的服务器上,然后启动 map 任务开始读取输入文件。因为 “移动计算比移动数据更划算” ,一个应用请求的计算,尤其是在海量级别的数据时候,离它的数据越近就越高效,因为这样能降低网络阻塞的影响,提高系统数据的吞吐量。
3. 从MapReduce到批处理系统
批处理系统区别于在线服务系统,后者每收到一个客户的请求都会尽快处理并返回一个响应,而批处理系统则是读取一些输入数据并产生一些输出数据,这往往需要一段时间(从几分钟到几天),通常情况不会有用户等待作业完成,所以批处理系统又被称为 离线系统,而且你可以反复的运行它们,因为它们不会对输入进行修改(只读)。
基于 MapReduce 实现的系统,如 HDFS(Hadoop File System) 就是典型的批处理系统,它提出时就是为了能够通过使用 大量普通的服务器 搭建集群来实现大数据的并行处理,其最优先考虑的是数据的扩展性和系统的可用性。
批处理系统常被应用在广告行业,通过统计点击率的信息,调整相应广告的投放能力;也可以用来分析既定网站在某一时间段内的用户数,以此来判断服务器合适的维护时间。这个操作涉及浏览全部服务器上的日志文件,并对其信息进行提取和处理,繁重且复杂,但是如果应用了 Hadoop 这种大数据处理系统就能化繁为简。
巨人的肩膀
-
《数据密集型应用系统设计》:第十章
-
《MapReduce 2.0源码分析与编程实战》:第一、二、四章