Google MapReduce小记


        MapReduce 的本质可以说是一个模型,一个进行任务分割和结果汇总的模型。其高明之处在于使用于分布式并行计算,将大量的计算资源进行整合调配。

        开端:随着计算机技术的发展和网络的普及,我们所产生的数据量越来越大,需要处理的数据也越来越多。大数据时代分析任务比传统的数据分析任务要复杂的多,因为往往涉及的数据量巨大,比如要分析汇总某个大型零售商在全国的销售数据,查看某个搜索引擎的特定词条的访问日志… … 通常来讲,我们的笔记本也能狗同时干很多事,比如一边听音乐,一边下载电影,一边写文档,这些都是可以同时进行的,本质上是因为这些程序任务所处理的数据量规模较小。而对于大规模的数据处理任务来说,就不是一台电脑同时做一件任务的逻辑关系。假如你写了一个程序,然后让你的电脑来跑一个比较大的数据量(例如把百度百科上所有的词条分析一遍…),那么你的电脑需要很长很长的时间来做这件事…大多数情况下,数据还没跑完,你的电脑就被累死了(死机…)。那么怎么办?就有人考虑到了用许多台电脑来同时完成这个任务。这就引入了并行计算的概念。

        执行:许多电脑同时完成一件复杂问题,其需要一个分配子任务到各个计算机和回收汇总计算结果的过程。MapReduce 就是解决这两个问题的一套新的抽象模型,它把并行计算、容错、数据分布、负载均衡等复杂的细节这些问题都封装在了 MapReduce 库中。


        通过将 Map 调用的输入数据自动分割为 M 个数据片段的集合,Map 调用被分布到多台机器上执行。输入的数据片段能够在不同的机器上并行处理。使用分区函数将 Map 调用产生的中间 Key 值分成 R 个不同分区进行处理,然后再通过 Reduce 将结果汇总回收。(具体的详细内容可查阅原论文,我在这里就不再赘述)

        具体是怎么实现的呢?实际上说了这样一个事儿:已知手头上有许许多多(几万也许,甚至几十万…)PC机,每一个可能很挫,但是如果这些PC机团结协作起来,可以PK一个大型的工作站。现在有个复杂的任务,需要处理海量的数据。数据在哪里?数据实际上是随机地存储于这些个PC机器上的。我们不需要统一地把数据一起存到一个超大的硬盘上,数据可以直接散布在这些个PC上,这些PC自身不仅是许许多多个处理器,也是许许多多个小硬盘。这些PC机器分为三类,第一类称为Master,Master是负责调度的,相当于工地的工头。第二类叫Worker,相当于干活儿的工人。Woker进一步分为两种,一种Worker叫Mapper,另一种叫Reducer。假设我们有一个巨大的数据集,里面有海量规模的元素,元素的个数为M,每个元素都需要进行同一个函数处理。于是Master将M分成许多小份,然后每一份分给一个Mapper来做,Mapper干完活儿(执行完函数),将自己那一份儿活儿的结果传给Reducer。Reducer之后统计汇总各个Mapper传过来的结果,得到最后的任务的答案。当然,这是最简单的表述,因为实际上Master的任务分配过程是很复杂的,会考虑任务时间?任务是否出错?网络通讯负担等等等等许多问题。

        理念:其实 MapReduce 讲的就是分而治之的程序处理理念,把一个复杂的任务划分为若干个简单的任务分别来做。这样做的意义就在于可以有效减少网络通讯负担。


        我在做深度学习的课题时深刻理解到了分布式计算的必要性,在神经网络处理中,深度的神经层和过大的数据处理量以及生成的大量向量都无法在普通的计算机上跑。我们在做 Kaggle 上一个简单的比赛赛题时,26000 张图片连放都放不进自己的显存中。通过不断的尝试,最终解决的两种方案都应用到了 MapReduce 的思想:1.使用小批量的 batch (就是一次放一丢丢数据进去,进行多线程并行)2.采购云端服务器,调用集群服务器进行并行式计算。

        总的来说,MapReduce 的理念是要比其具体的实现细节要重要。

参考文献:

  关于MapReduce的理解? - 知乎https://www.zhihu.com/question/23345991

【阿里云】MapReduce 概述  - MaxCompute 文档 https://help.aliyun.com/document_detail/27875.html

你可能感兴趣的:(Google MapReduce小记)