随着计算技术的发展,有些应用须要很是巨大的计算能力才能完成,若是采用集中式计算,须要耗费至关长的时间来完成。怎么解决这个问题呢?固然是把这些问题分红多份,在不一样的机器上去解决,众人拾柴火焰高嘛。而分布式计算就是将该应用分解成许多小的部分,分配给多台计算机进行处理。这样能够节约总体计算时间,大大提升计算效率。在分布式中,针对这种状况咱们大概有两种计算模式:MapReduce和Stream,接下来就让咱们来看看它们是何方神圣。注意:本文讲述的两种计算模式是以特定数据类型(分别对应静态数据和动态数据)做为计算维度。而在分布式领域中还有另外两种分布式计算模式,即 Actor 和流水线。它们是以计算过程或处理过程的维度的,不作本文讲述的重点。segmentfault
相信你们都有据说过Hadoop这个框架,这个框架主要用来解决海量数据的计算问题。那么它是如何作到海量数据的计算呢?你可能会想,既然是海量数据,有这么大的规模,那就让多个进程去处理,最后去汇总一下结果,这样就能够加大马力,提高速度了。
没错,就是这种想法,在分布式领域中咱们称这种叫做MR(Map Reduce)模式。咱们上边分红多个进程处理的想法能够归结成一个词--分而治之,是的,MR就是一个典型的分而治之(简称分治法)的表明。缓存
分治法就是将一个复杂的、难以直接解决的大问题,分割成一些规模较小的、能够比较简单的或直接求解的子问题,这些子问题之间相互独立且与原问题形式相同,递归地求解这些子问题,而后将子问题的解合并获得原问题的解。好比咱们统计全国人口数量。网络
了解了分治法以后,咱们再来看看本段的主角MR,以下图所示,MapReduce 分为 Map 和 Reduce 两个核心阶段,其中 Map 对应“分”, 即把复杂的任务分解为若干个“简单的任务”执行;Reduce 对应着“合”,即对 Map 阶段的结果进行汇总。并发
在第一阶段,也就是 Map 阶段,将大数据计算任务拆分为多个子任务,拆分后的子任务一般具备以下特征: 相对于原始任务来讲,划分后的子任务与原任务是同质的,好比原任务是统计全国人口数,拆分为统计省的人口数子任务时,都是统计人口数;而且,子任务的数据规模和计算规模会小不少。多个子任务之间没有依赖,能够独立运行、并行计算,好比按照省统计人口数,统计河北省的人口数和统计湖南省的人口数之间没有依赖关系,能够独立、并行的统计。
第二阶段,也就是 Reduce 阶段,第一阶段拆分的子任务计算完成后,汇总全部子任务的 计算结果,以获得最终结果。也就是,汇总各个省统计的人口数,获得全国的总人口数。app
上边了解了这么多,那么在 MapReduce 里,各个组件是如何分工完成一个复杂任务的呢?框架
为了解答这个问题,我先带你了解一下 MapReduce 的组件结构。分布式
如上图所示,MapReduce 主要包括如下三种组件:函数
基于这三种组件,MapReduce 的工做流程以下所示:oop
程序从 User Program 开始进入 MapReduce 操做流程。其中图中的“step1,step2, ...,step6”表示操做步骤。学习
从上述流程能够看出,整个 MapReduce 的工做流程主要能够归纳为 5 个阶段,即: Input(输入)、Splitting(拆分)、Mapping(映射)、Reducing(化简)以及 Final Result(输出)。
全部 MapReduce 操做执行完毕后,MRAppMaster 将 R 个分区的输出文件结果返回给 User Program,用户能够根据实际须要进行操做。好比,一般并不须要合并这 R 个输出文 件,而是将其做为输入交给另外一个 MapReduce 程序处理。
咱们来描述一个具体的例子来帮助你们理解,假设咱们如今要统计苏锡常地区第二季度手机订单数量 Top3 的品牌。咱们来看看具体的统计步骤吧。
由上述流程能够看出,Map/Reduce 做业和 map()/reduce() 函数是有区别的:
根据上文咱们知道MR模式的核心思想是分治法,在这种模式下任务完成后整个进程就结束了,并且它并不适合去处理实时任务。实时性任务主要是针对流数据的处理,对处理时延要求很高,一般须要有常驻服务进程,等待数据的随时到来随时处理,以保证低时延。处理流数据任务的计算模式,在分布式领域中叫做 Stream。
近年来,因为网络监控、传感监测、AR/VR 等实时性应用的兴起,一类须要处理流数据的 业务发展了起来。好比各类直播平台中,咱们须要处理直播产生的音视频数据流等。这种如流水般持续涌现,且须要实时处理的数据,咱们称之为流数据。它有什么特征呢?一、数据如流水般持续、快速地到达;二、海量数据规模,数据量可达到 TB 级甚至 PB 级;三、对实时性要求高,随着时间流逝,数据的价值会大幅下降; 四、数据顺序没法保证,也就是说系统没法控制将要处理的数据元素的顺序。那么,在分布式领域中,对于这种流数据的计算模式就是流计算,也叫作Stream。由于流数据大量、快速、时变的特色,因此它一般被用于处理数据密集型应用。
由于流式计算强调的是实时性,数据一旦产生就会被当即处理,因此在当一条数据处理完成后会序列化存储到缓存中,而后马上经过网络传输到下一个节点,由下一个节点继续处理,而不是像MapReduce 那样,等到缓存写满才开始处理、传输。为了保证数据的实时性,在流计算中,不会存储任何数据,就像水流同样滚滚向前。那么,它的处理流程是怎么样的呢?使用流计算进行数据处理通常会有三个步骤,参见下图:
小结一下,流计算是处理持续到达的数据,它并不会去存储数据,适用于对数据处理有较高实时性要求的场景,好比网络监控,传感检测,AR/VR和视频流等实时应用。
以上咱们分别学习了MapReduce(批处理)和Stream(流式计算)模式,咱们也对它们有了一些了解,虽然这两种计算模式对数据的处理方式不一样,但都是以特定数据类型(分别对应静态数据和动态数据)做为计算维度。
【分布式系统遨游】分布式数据存储
欢迎对本系列文章感兴趣的读者订阅咱们的公众号,关注博主下次不迷路~