加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

漫谈大数据仓库与挖掘系统:MapReduce与大规模离线计算系统

发布时间:2020-12-14 03:57:50 所属栏目:大数据 来源:网络整理
导读:013-10-11 阿里技术嘉年华 ? 上集回顾: 什么是大数据?【回复 071 查看】 层次、维度与主题【回复 072 查看】 一切的开始—数据的传输和同步【回复 073 查看】 ? ????读过本文的前三个章节的读者,对大数据系统应该已经有了一个初步的认识,并且已经清楚的
013-10-11 阿里技术嘉年华

?上集回顾:


什么是大数据?【回复071查看】

层次、维度与主题【回复072查看】

一切的开始—数据的传输和同步【回复073查看】

?

????读过本文的前三个章节的读者,对大数据系统应该已经有了一个初步的认识,并且已经清楚的知道,大数据之庞大,已经远远超出任何一个单机系统的处理能力的极限,我们需要成千上万台计算机来协同工作,才能真正完成大数据的处理工作。?


????本文中,笔者一直向各位读者强调的一件事情便是:看似简单的东西实际上从来都不简单。将一个计算任务,分配到不同的服务器上运行,并不是一件很简单的事情:任务如何的被分解、如何协调每一个计算机所做的事情、如何同步计算机节点之间的状态、如何将分散到各个计算机进行计算的结果汇总,并且保证是正确的计算结果、如何在某一个节点出现故障时,及时让另一个节点来替代其的计算.....?

????为了解决种种问题,早在上个世纪八十年代开始,科学家和工程师们就研发出了很多并行计算的框架,例如工作在拥有多个CPU核心的单机上的OpenMP架构,被广泛运用于大型机甚至某些结构的超级计算机中。但是OpenMP架构的一个显著的缺陷是:只能用于共享存储空间的系统中,无法用于网络环境下的并行计算模式,所以其主要运用在单机系统的科学计算中。?
????为了让分布式计算能够在多台服务器上进行,一个至今仍然被广泛应用的分布式框架——MPI诞生了,MPI全称是Message Passing Interface,消息传输接口。MPI本质上是一套规范了如何在分布式计算中进行节点之间的消息传输的协议和标准接口,有不同语言和系统环境下的实现,例如其最著名的实现MPICH( http://www.mpich.org/ )。MPI采用任务之间消息传递方式进行数据交换,其并行开发基本思路是将任务分割成可以独立完成的部分,再下发到各计算节点分别计算,计算后各节点将各自的结果汇总到主计算点进行最终汇总,各点之间的的交互由消息传递完成。这给分布式计算系统的开发带来了不小的便利,无数经典算法的MPI版本早已遍地开花,至今仍在各大企业和科研院所中广泛应用。?
????但是,由于MPI的消息交换机制,导致在使用时必须将算法分为一个个可以独立运行的部分,这只是其的一个小缺陷。更大的问题是:一旦MPI集群中工作的服务器达到一个比较大的数量,例如上千台,那么,服务器节点之间频繁的消息交换,很可能产生灾难性的网络IO风暴,或者最差也会对集群的网络性能造成影响。而且MPI的编程模型,总体上比较复杂,对算法实现的改动会比较多,并不足以以一己之力支撑大数据时代的基石。?
????在2008年初,Google的两位工程师J Dean和S Ghemawat,在著名期刊《Communications of the ACM》中发表了一篇论文:《MapReduce: simplified data processing on large clusters》,阐述了一种在Google内部被广泛运用的分布式计算框架:MapReduce。这正是后来大数据时代得以出现的重要的一块基石:MapReduce本质上更加关心的是,用简单的方法,解决海量数据的分解计算的问题,而不是提供一个框架,让算法本身可以分布式运行(虽然它在实质上也达到了这个效果)。简而言之,MapReduce是相对更关注数据本身的可分割性和独立性的一种框架。这恰恰符合大数据时代的数据的特质:将全部的数据集中在一起,以相仿的形式存储,关注每一条数据的计算,每一条数据具有一定的独立性。同时,MapReduce的第二个阶段,也保证了相关性的数据能够得以正确的处理,体现了大数据时代的关联的特性。?
????下面,让我们看一看,MapReduce究竟是如何架构的,才能够达到如此神奇的效果。在这里,我们以一个简单的例子,来演示MapReduce的工作过程。我们以统计人人网2013年全部日志中每一个字符(汉字、英文或数字)出现的次数为例。这个例子中,输入便是人人网2013年的全部日志的合集了,而输出便是每一个字符和其对应出现的次数。?
????MapReduce的计算过程,主要是分为两个阶段,Map阶段和Reduce阶段,至于一些具体实现上为了优化性能而增加的Local Combine等环节我们在此不予讨论。在Map阶段,我们需要进行计算的数据,以其可以分解的最小单元(在这里,便是一个日志中的一个字符了),进行分解,随机分配到集群中的各个服务器上(有些实现中,分配方式是有规律的,我们先不讨论)。在这个阶段,我们需要将每一个这样的最小的数据单元,进行一次Map,暨为其产生一个key/value的结构。这样的一个数据结构,是在程序中非常常见的:是一个键和一个值的对应,读者们可以理解为是一个数据的名字,与其的值的对应。另外,在这个阶段中,通常还会做一些其它的工作:如对数据进行filter(过滤),将不需要的数据过滤掉,例如我们可能不会去统计一些标点符号,那么在这个阶段,我们可以不给这些标点符号分配名字,或者分配为一个代表“其它”字符的统一的名字。另外由于Map阶段会在很多台服务器上并行执行,所以我们可以在此对数据进行一些复杂的处理,例如在每个计算最小单元的数据中运行各种算法等。?
????在我们的这个例子中,我们把每一个字符的自身,作为一个输出的键(key),也就是其名字。而由于我们认为其的最小计算单元是字符,所以这个输出的值,便是在这个最小计算单元中该字符出现的次数,其实也就是恒为1了(不需要统计的字符可以记为0或干脆丢弃)。这便是Map阶段我们需要做的全部工作。Map阶段在数以千计的计算机上并行进行,每个计算机上仅仅会分到全体文章中的字符的1/1000甚至更少,这种并行处理,使得大量的数据可以很快的完成计算。?
????在Map阶段之后,我们进入了Reduce阶段。还记得我们的例子中的目的么:统计每一个字符出现的次数。这个统计应该是全局性的,而在Map阶段,一个字符是极可能分配到多个不同的计算节点(我们称之为Mapper)中。所以,为了统计一个字符的全局出现次数,在Reduce阶段,MapReduce系统会按照我们给每个最小数据单元分配的名字,把同样名字(Key)的最小数据单元分配到同样的一个计算节点(这里面便是Reducer了)。以此,我们便可以在一个Reducer里面计算好这个字符的出现次数:我们只需要在Reducer中,对具有相同名字(Key)的数据单元的出现次数进行累加即可。Reduce阶段亦时在数百台服务器上完成的(通常比Map阶段的服务器数要少),而且我们可以通过一些优化手段,让Reduce阶段需要处理的总数据量远小于Map阶段。?
????Reduce阶段的最终输出,暨是将各个Reducer的输出直接加在一起,便是2013年人人网全部日志的各个字符的出现次数了。这是一个非常简单的计算的例子,在复杂的计算中,通常要有很多个Map阶段和Reduce阶段的组合,在每个阶段中进行的计算工作也是非常复杂的。但是,MapReduce框架软件已经帮我们解决了大规模分布式计算中大部分环节,我们只需要关注每一个Map和Reduce中的任务即可。?
????为了解决海量数据的存储问题,MapReduce计算系统通常还搭配了分布式存储系统,暨将海量数据存储到成千上百台计算机的软件。在Google内部,这套系统叫做GFS(Google File System)。不过可惜的是,Google的MapReduce的实现以及GFS均没有开源。但是,Apache开源软件基金会,推出了其的开源实现,也就是著名的Hadoop。其基础实现包括了MapReduce的框架和调度系统,以及分布式文件系统HDFS(Hadoop Distributed File System)。?
????另外,我们都知道,SQL语言是处理数据时应用最广泛,也是目前最合适的一种语言。而SQL语言用于处理结构化数据,恰恰结构化数据中的每一个行(Row),是非常合适作为我们在MapReduce中的最小计算单元的。那么,如果我们将SQL语言也在MapReduce和HDFS上分布式运行,那么不就可以用SQL语句,像使用关系数据库一样,来处理海量数据了么。基于这种思路,在Hadoop上运行的Hive诞生了。关于对Hive的原理的详细介绍,以及除了MapReduce之外,大数据时代的其它的分布式计算模型如BSP的介绍,我们将会在下一章的连载中进行。


????尽请期待:漫谈大数据仓库与挖掘系统(五):MapReduce与大规模离线计算系统(2)。?


--

微信名称:阿里技术嘉年华

微信号:alibabatech

简介:传播原创高质量的技术内容

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读