批处理模式
首先我们需要先了解一个概念:批处理模式
批处理模式是一种最早进行大规模数据处理的模式。
批处理非常适合需要访问整个数据集合才能完成的计算工作。
批处理主要操作大规模静态数据集,并在整体数据处理完毕后返回结果。
例如,在计算总数和平均数时,必须将数据集作为一个整体加以处理,而不能将其视作多条记录的集合。这些操作要求在计算进行过程中数据维持自己的状态。
需要处理大量数据的任务通常最适合用批处理模式进行处理,批处理系统在设计过程中就充分考虑了数据的量,可提供充足的处理资源。
由于批处理在应对大量持久数据方面的表现极为出色,因此经常被用于对历史数据进行分析。
为了提高处理效率,对大规模数据集进行批处理需要借助分布式并行程序。传统的程序基本是以单指令、单数据流的方式按顺序执行的; 这种程序开发起来比较简单,符合人们的思维习惯,但是性能会受到单台计算机的性能的限制,很难在给定的时间内完成任务。
而分布式并行程序运行在大量计算机组成的集群上,可以同时利用多台计算机并发完成同一个数据处理任务,提高了处理效率,同时,可以通过增加新的计算机扩充集群的计算能力。
Google 最先实现了分布式并行处理模式 MapReduce,并于2004年以论文的方式对外公布了其工作原理,Hadoop MapReduce 是它的开源实现;Hadoop MapReduce运行在HDFS上。
MapReduce 简释
如果想知道相当厚的一摞牌中有多少张红桃,最直观的方式就是一张张检查这些牌,并且数出有多少张是红桃。
这种方法的缺陷是速度太慢,特别是在牌的数量特别大的情况下,获取结果的时间会很长。
MapReduce 方法的规则如下:
第一步:把这摞牌分配给在座的所有玩家。
第二步:让每个玩家数自己手中的牌中有几张是红桃,然后把这个数目汇报上来。
第三步:把所有玩家汇报的数字加起来,得到最后的结论。
显而易见,MapReduce方法通过让所有玩家同时并行检查牌来找出一摞牌中有多少红桃,可以大大加快得到答案的速度。
MapReduce 方法使用了拆分的思想,合并了两种经典函数:
- 映射(Map)
对集合中的每个元素进行同一个操作.
如果想把表单里每个单元格乘以二,那么把这个函数单独地应用在每个单元格上的操作就属于映射.
- 化简(Reduce)
遍历集合中的元素来返回一个综合的结果.
如果想找出表单里所有数字的总和,那么输出表单里一列数字的总和的任务就属于化简.
下面使用 MapReduce 数据分析的基本方法来重新审视前面分散纸牌找出红桃总数的例子:
在这个例子里,玩家代表计算机,因为他们同时工作,所以他们是个集群。
把牌分给多个玩家并且让他们各自数数,就是在并行执行运算,此时每个玩家都在同时计数。
这就把这项工作变成了分布式的,因为多个不同的人在解决同一个问题的过程中并不需要知道他们的邻居在干什么。
告诉每个人去数数,实际上就是对一项检查每张牌的任务进行了映射。
不是让玩家把红桃牌递回来,而是让他们把想要的东西化简为一个数字。
需要注意的是牌分配得是否均匀。如果某个玩家分到的牌远多于其他玩家,那么他数牌的过程可能比其他人要慢很多,从而会影响整个数牌的进度。
进一步还可以问一些更有趣的问题:
例如,"一摞牌的平均值是什么?"。
我们可以通过合并"所有牌的值的和是什么?"及"我们有多少张牌?"这两个问题来得到答案。
用这个"和"除以"牌的张数"就得到了平均值。
MapReduce 算法的机制要远比数牌复杂得多,但是主体思想是一致的,即通过分散计算来分析大量数据。
无论是 Google、百度、腾讯、NASA,还是小创业公司,MapReduce 都是目前分析互联网级别数据的主流方法。
MapReduce 基本思想
使用 MapReduce 处理大数据的基本思想包括 3 个层面:
首先,对大数据采取分而治之的思想。
对相互间不具有计算依赖关系的大数据实现并行处理,最自然的办法就是采取分而治之的策略。
其次,把分而治之的思想上升到抽象模型。为了克服 MPI 等并行计算方法缺少高层并行编程模型这一缺陷,MapReduce 借鉴了 Lisp函数式语言中的思想,用 Map 和 Reduce 两个函数提供了高层的并行编程抽象模型。
最后,把分而治之的思想上升到架构层面,统一架构为程序员隐藏系统层的实现细节。
大数据处理思想:化大为小 分而治之
并行计算的第一个重要问题是如何划分计算任务或者计算数据以便对划分的子任务或数据块同时进行计算。
但是,一些计算问题的前后数据项之间存在很强的依赖关系,无法进行划分,只能串行计算。
对于不可拆分的计算任务或相互间有依赖关系的数据无法进行并行计算。一个大数据若可以分为具有同样计算过程的数据块,并且这些数据块之间不存在数据依赖关系,则提高处理速度的最好办法就是并行计算。
假设有一个巨大的二维数据,大得无法同时放进一个计算机的内存,如下图所示,现在需要求每个元素的开立方。
因为对每个元素的处理是相同的,并且数据元素间不存在数据依赖关系,因此可以考虑将其划分为子数组,由一组计算机并行处理。
MapReduce实例分析:WordCount
单词计数是最简单也是最能体现 MapReduce 思想的程序之一,可以称为 MapReduce 版"Hello World".
单词计数的主要功能是统计一系列文本文件中每个单词出现的次数。
设计思路
首先,检查单词计数是否可以使用 MapReduce 进行处理。
因为在单词计数程序任务中,不同单词的出现次数之间不存在相关性,相互独立;
所以可以把不同的单词分发给不同的机器进行并行处理。
因此,可以采用MapReduce 来实现单词计数的统计任务。
其次,确定 MapReduce 程序的设计思路。把文件内容分解成许多个单词,然后把所有相同的单词聚集到一起,计算出每个单词出现的次数。
最后,确定 MapReduce 程序的执行过程。把一个大的文件切分成许多个分片(HDFS的工作),将每个分片输入到不同结点上形成不同的Map 任务。
每个 Map 任务分别负责完成从不同的文件块中解析出所有的单词。
处理过程
1.将文件拆分成多个分片
该实例把文件拆分成两个分片,每个分片包含两行内容。
在该作业中,有两个执行 Map 任务的结点和一个执行 Reduce 任务的结点。
每个分片分配给一个 Map 结点,并将文件按行分割形成 <key,value> 对,如图所示。
这一步由 MapReduce框架自动完成,其中 key 的值为字符号。
2.将分割好的 <key,value> 对交给用户定义的 Map 方法进行处理,生成新的 <key,value> 对,如图所示。
3.在实际应用中,每个输入分片在经过 Map 函数分解以后都会生成大量类似 <Hello,1> 的中间结果,为了减少网络传输开销,框架会把 Map 方法输出的 <key,value> 对按照 key 值进行排序,并执行 Combine(局部合并)过程,将 key 值相同的 value 值累加,得到 Map 的最终输出结果,如图所示。
4.Reduce 先对从 Map 端接收的数据进行排序,再交由用户自定义的 Reduce 方法进行处理,得到新的 <key,value> 对,并作为结果输出,如图所示。