讲座嘉宾:Timnode
讲座连接:【太阁直播】解读大数据世界中MapReduce的前世此生web
讲座总结:6Kunnnnn算法
原文连接:【讲座总结】解读大数据世界中MapReduce的前世此生数据库
何为MapReduce?网络上不少官方的定义都过于抽象难懂了,但愿经过如下的讲解,可让你们能更简单地理解MapReduce的含义。编程
MapReduce其实起源于web检索,咱们常见的web检索能够简单分为两部分:获取网页内容并创建索引,和根据网页索引来处理查询关键词。网页爬虫
第一,获取网页内容并创建索引。这一步的实现须要用到两种程序,分别是:性能优化
Crawler,别名Spider,网页爬虫程序,用来爬取互联网上的网页内容网络
Indexer,索引器,对爬取下来的web内容创建索引,变成searchable content,这样网页就能被搜索了app
须要解释一下,什么叫作索引器Indexer。咱们能够简单理解为,互联网上每个网页就是一个document,每一个document都包含了不一样的word,而咱们针对每个word,创建一个word出如今哪些document的table。分布式
以下图,假设有document分别为一、二、3,里面分别有abc、xyz、def等词汇。而最终的Indexer结果就是将哪些word出如今哪些document ID中的映射保存下来,每个word对应一个sorted list用来存储document ID。
第二,根据网页索引来处理查询关键词。以下图,当索引器被创建好了以后,每当有网页查询query进来,就须要利用这些索引,来处理query的关键词,找出那些同时含有这些关键词的文档。好比一个query里面同时有abc和bbb,那么含有这两个关键字的文档就是document 2。
自从互联网被创造后,被建立的网页和网站变的愈来愈多,数量极为庞大。像Google这样的web检索巨头如何保证能对互联网上大部分的web进行检索?答案就是并行parallel,或理解为数据量达到单机很难处理的程度,迫使采用运行多台机器来进行分布式计算。
如上图,咱们横向上来看,每一台单机执行Crawler和Indexer任务,生成local index,最后汇总成global index。可是若是纵向上来看,Crawler和Indexer其实能够被分为两个独立的部分(由于他们的输入输出不一样),而它们的中间联系就是,Crawler的输出其实就是Indexer的输入(web pages)。
因此以下图,对于每个web获取+创建索引的任务(Job),咱们把其中从web page到local index的部分看成是Map阶段,从local index汇聚到global index的部分看成是Reduce阶段。
因此咱们能够简单理解为:MapReduce就是把复杂的分布式处理任务,简化分解成Map和Reduce两个阶段。
这样的programming model好处就是,咱们能更简单的进行分布式程序的设计和实现了。可是,虽然有不少的好处,在MapReduce中,咱们还需解决分布式系统的常见问题。好比网络问题,磁盘问题,程序自己问题,并且若是分布式系统出了问题也会很难解决恢复。所以,也就有了上述图片中的master的概念。简单说,Master是一个专门用来管理这些分布式系统的机器。那么,Master是如何进行分布式计算的管理呢?以下图:
在一个分布式计算集群(cluster)中,实际运行任务的是Slave机器,也被称之为DataNode(由于须要处理的data被存在了这些机器上),而Master机器负责任务的调度,也被称之为NameNode,之因此这样是由于它知道应该将哪一个Task分配到哪一个Slave机器上边运行(知道Slave和Task的name)。具体细节,Master中有一个Task queue,存储待执行的任务,每个Slave有若干Task slots用来接收Master分配来的任务并执行。Master的Job Tracker和Slave的Task Tracker,用来监督每一个Task执行状况,若是出现问题好比网络链接失败,或者程序出错,Master和Slave会有相应的措施来解决这些问题并恢复以前的任务进度。
因此,经过以上的任务调度方法,MR的厉害之处,就是把分布式系统的编程分红Map和Reduce两部分,同时解决了头疼的分布式计算问题。好处就是,开发者能够更多的注重程序的开发,而不须要太花时间解决分布式计算的种种问题。
固然,在MapReduce出现前互联网web检索还有别的解决方法,好比可使用一台超级计算机来看成是super indexer,用来接受web pages做为输入,来创建global index,或理解为“shipping data to software”。这样作不是不行,可是把数量庞大的web pages传送到super indexer那里,仅仅是数据的传送就须要花费大量的时间。相比之下,MapReduce的方法能够理解为“shipping software to data”,也就是,DataNode负责存储数据,而NameNode负责将Task(software)传送给DataNode来执行。这样的方法,速度能提高好几个数量级,况且和一台超级计算机相比,购买不少个普通商用计算机来进行分布式计算要划算得多,扩展性也强。以下图:
此外,MapReduce更适合用来做non-Transactional的数据分析,也就是数据内容基本保持不变,而相比Transactional或者Real-time的数据就会持续的更新,每次数据分析都是按batch process,一次大量时间长。
HDFS,Hadoop Distributed File Systems,是根据Google著名的GFS的论文实现的开源项目,其实Hadoop也是Google另一篇MapReduce论文的具体实现。因此咱们能够理解为Hadoop就是HDFS和MapReduce。
简单说,HDFS解决了分布式系统不少问题,特别是数据副本replication和恢复recovery问题,它相似于UNIX系统,提供了不少文件系统的抽象接口,这样广大熟悉UNIX系统的人可以很快上手。那么MapReduce是如何与HDFS配合的呢?以下图:
首先,在Map阶段以前,Map程序的输入须要进行及部分的操做。HDFS在存储文件的时候,并无把一个文件当作一个总体,而是利用按照必定大小(默认为64MB)的chunk来保存文件,每个chunk可能有一个或者多个文件,好比chunk1含有文件一、2和3的一部分,chunk2含有文件3的另外一部分,以及其余文件。因此在从chunk读入输入文件以前,须要对这些chunk里面的文件进行split,即将同一文件在不一样chunk中的部分split到一块儿,再经过RecordReader来将文件读成Key Value Pair的输入交给Map程序。
以后,获得了每一台机器上的Map程序的输出,须要将这些机器的输出结果shuffling到不一样机器的Reduce程序上进一步运算。首先一步就是进行Partition,或者理解为将不一样台机器的输出数据Group-By-Key,在对同一Key中全部数据Sort,以后的结果会被分配到不一样机器上的Reduce程序中,这样会进一步加快Reduce程序的速度。
咱们以前所讨论的内容,其实是第一代的MapReduce,基本是基于Google的论文实现的。在1.0中,Master负责了任务调度的所有工做,这样的后果就是Master会很臃肿(功能太多),以及在同一个集群cluster上Master只能负责MapReduce相关的分布式计算的调度,没法负责别的程序。而如今更流行的是MapReduce 2.0,在1.0的基础上进行了很多的改动,最大的变化就是YARN的引入。YARN全称为Yet Another Resource Negotiator,主要功能就是替代NameNode的任务调度功能,主要的好处就是简化了Master的工做量使得其再也不过与臃肿,另外一方面就是除了MapReduce以外,还能够在同一个集群上运行别的application,好比如今很流行的Spark。
而Spark,你们都说比MapReduce快不少,可是其底层的实现仍是相似于MapReduce分布式的计算方式,但更多的是作出了不少的性能优化,特别就是RDD(Resilient Distributed Dataset)的引入,一种对分布式数据的抽象。传统的MapReduce须要大量的磁盘读写操做和网络的传输,好比Split、RR、Partition等等,都会涉及将中间计算结果在不一样机器之间网络传输并存到disk上做为以后pipeline的输入的操做。可是Spark之因此快,是由于Spark采起的更多的是将RDD,也就是分布式数据保存到Memory里进行计算,并且是一种lazy evaluation计算方式,也就是必要的时候一口气将内存中的某个计算过程pipeline执行完毕,而不是像MapReduce同样,一步一步计算、每步都将中间结果保存到到磁盘上、以后下一步再读入的方式来进行,这样会节省大量的disk IO时间。若是pipeline的某一个中间步骤失败了,Spark有一个RDD的workflow图,用来找回以前失败的RDD重新计算,即使重新计算也极可能比磁盘IO的开销要小不少,毕竟内存要比disk快不少。
可是Spark也并不必定能彻底替代MapReduce,相比于MapReduce,Spark更适合real-time的数据处理,由于须要较快的响应速度,或者iterative算法好比K-means,即不断地对同一组数据进行同一个算法的迭代处理,然而MapReduce更适合于数据量很是大的batch process,由于Spark对内存要求的确是比较的高。固然Spark并不必定须要依赖于HDFS上边运行,也能够在别的distributed storage layer上。
总之,MapReduce从第一代,到第二代再到以后其余相似平台的发展,能够看出MapReduce的生命力,以及对分布式处理的巨大贡献。而但愿读完这篇文章,你们也对MapReduce的前世此生有了大体的理解。
其它细节补充
对于互联网crawler程序,之因此又叫作爬虫spider,由于程序就好像在爬(traverse)互联网。但存在一些独立的网页没法检索到(好比公司内部网络)。并且爬网站须要选好seed网站,好比新浪门户,由于有不少连接指向外部网络,可是百度可能就不适合爬网站的seed网站,由于缺乏外部的连接。
分布式数据库的CAP理论,针对不一样领域须要有不一样的取舍。好比银行转帐,须要保证一个cluster中,各个机器node之间银行数据信息是consistent的,好比不管访问哪一个node的银行帐单数据,结果都须要是同样的,不然用户可能获得错误帐单。然而search engine更强调available,就是要有在必定时间内有结果返回,不要让用户等待过久,虽然每次查询的结果可能不都是consistent的数据。
设立于硅谷,专一于编程、数据分析、UIUX设计的在线学习平台:BitTiger。