分布式计算就是将一个大的计算任务分解成多个小任务,然后分配给多台计算机分别计算,再上传运算结果后统一合并得出数据结论。本章详细介绍分布式计算。
在过去的20年里,互联网产生了大量的数据,比如,爬虫文档、Web请求日志等,也包括了计算各种类型的派生数据,比如,倒排索引、Web文档的图结构的各种表示、每台主机页面数量的概要、每天被请求数量最多的集合,等等。这些数据每天需要通过大量的计算产生,显然在单机上是无法做到的,必须使用分布式计算。
分布式计算在概念上非常容易理解。举例来说,工厂里面要生产一批货物,一个工人来干,则需要10天才能完成。那么,在工人的工作效率相当的情况下,把相同的活派给多个工人来干,显然能够缩短整个工期。分布式计算也是如此,当输入的数据量很大时,这些计算必须被分摊到多台机器上才有可能在可以接受的时间内完成。机器越多,所需要的总时间将会越短。这就是分布式计算所带来的优势——通过扩展机器数,就能实现计算能力的水平扩展。
所以,所谓分布式计算,就是将大量计算的项目数据分割成小块,由多台计算机分别计算,再上传运算结果后统一合并得出数据结论。
设计分布式计算平台需要面临非常多的挑战,比如,分布式平台是怎样来实现并行计算?是如何分发数据的?又是如何进行错误处理?等等。这些问题综合在一起,使得原本很简洁的计算,因为要大量的复杂代码来处理这些问题,而变得让人难以处理。
目前市面上已经有很多分布式计算产品可供选择,本文会对这些产品做一一介绍。
是否需要使用分布式计算,需要根据自己项目业务情况而定。虽然分布式计算可以使整体的计算能力实现水平扩展,但也并非所有的计算任务都需要分布式计算平台来解决。比如,在Oracle数据库中,有100万条工人的薪资单数据,我们要统计这些工人的薪资的总和。像这种情况,直接在PL/SQL执行SUM函数,显然要比导入分布式计算平台要快。但如果数据量是在TB级别,那么最好就采用分布式计算了,毕竟Oracle等关系型数据库并不擅长大数据的计算。
同时,使用分布式计算需要一定的学习成本,而一般的企业也不大可能具备拥有用于分布式计算的大规模的机器数。这个时候,使用现在的分布式计算云服务,则可能是最为经济的享受分布式计算的方式。比如阿里云、腾讯云、华为云等,都提供了类似的用于分布式计算的云服务。
作为世界领先的科技公司,Google公司为了应对大数据的处理,内部已经实现了数以百计的为专门目的而写的计算程序,其中MapReduce就是其著名的计算框架之一,与GFS、Bigtable一起被称为Google技术的“三宝”。而在开源界,基于MapReduce思想的分布式计算产品也大有所在,比较有名的有Apache Hadoop、Apache Spark、Apache Mesos等。
本文接下来将会对这些技术做详细的介绍。
1.MapReduce简介
MapReduce是一个编程模型,用于大规模数据集(TB级)的并行运算。有关MapReduce的论文介绍,最早可以追溯到由Google的JeffreyDean和Sanjay Ghemawat发表在2004年OSDI(USENIX Symposium onOperating Systems Design and Implementation)的MapReduce:SimplifiedData Processing on Large Clusters。这篇文章详细描述了Google如何分割、处理、整合它们令人难以置信的大数据集。随后,开源软件先驱Doug Cutting等人受到该论文的启发,开始尝试实现MapReduce计算框架,并将它与NDFS(Nutch Distributed File System)结合,以支持Nutch引擎的主要算法。由于NDFS和MapReduce在Nutch引擎中有着良好的应用,所以它们于2006年2月被分离出来,成为一套完整而独立的软件,并命名为Hadoop(有关Hadoop的内容会在后面章节介绍)。
到了2008年年初,Hadoop已成为Apache的顶级项目,包含众多子项目。它被应用到包括Yahoo!在内的很多互联网公司。现在的Hadoop版本已经发展成包含HDFS、MapReduce子项目,与Pig、ZooKeeper、Hive、HBase等项目相关的大型应用工程。MapReduce操作流程如图13-1所示。
图13-1 MapReduce操作流程
MapReduce程序模型应用的成功要归功于以下几个方面。首先,由于该模型隐藏了并行、容错、本地优化以及负载平衡的细节,所以即便是那些没有并行和分布式系统经验的程序员也能容易地使用该模型。其次,MapReduce计算可以很容易地表达大数据的各种问题。比如,MapReduce用于为Google的网页搜索服务生成数据,用于排序,用于数据挖掘,用于机器学习以及其他许多系统。再次,MapReduce的实现符合“由数千台机器组成的大集群”的尺度,有效地利用了机器资源,所以非常适合解决许多大型计算问题。
2.MapReduce的编程模型
MapReduce是一个用于大规模数据集(TB级)并行运算的编程模型,其基本原理就是将大的数据分成小块逐个分析,再将提取出来的数据汇总分析,最终获得我们想要的内容。从名字可以看出,“Map(映射)”和“Reduce(归约)”是MapReduce模型的核心,其灵感来源于函数式语言(比如Lisp)中的内置函数Map和Reduce:用户通过定义一个Map函数,处理key-value(键值对)以生成一个中间key-value集合,MapReduce库将所有拥有相同的key(key I)的中间状态key合并起来传递到Reduce函数;一个叫作Reduce的函数用于合并所有先前Map过后的有相同key(key I)的中间量。
map (k1,v1) -> list(k2,v2)
reduce (k2,list(v2)) -> list(k3, v3)
但上面的定义显然还是过于抽象。现实世界中的许多任务在这个模型中得到了很好的表达,Shekhar Gulati就在他的博客文章How Iexplained MapReduce to my Wife里举了一个洋葱辣椒酱制作过程的例子,来形象地描述MapReduce的原理,如下文所述。
洋葱辣椒酱制作的过程是这样的,先取一个洋葱和一根辣椒,把它们切碎,然后拌入盐和水,最后放进混合研磨机里研磨。这样就能得到洋葱辣椒酱了。
现在,假设你想用薄荷、洋葱、番茄、辣椒、大蒜弄一瓶混合辣椒酱。你会怎么做呢?你会取薄荷叶一撮,洋葱一个,番茄一个,辣椒一根,大蒜一颗,切碎后加入适量的盐和水,再放入混合研磨机里研磨,这样你就可以得到一瓶混合辣椒酱了。
现在把MapReduce的概念应用到食谱上,Map和Reduce其实是两种操作。
·Map:把洋葱、番茄、辣椒和大蒜切碎,是各自作用在这些物体上的一个Map操作。所以你给Map一个洋葱,Map就会把洋葱切碎。同样地,你把辣椒、大蒜和番茄一一地拿给Map,你也会得到各种碎块。所以,当你在切像洋葱这样的蔬菜时,你执行的就是一个Map操作。Map操作适用于每一种蔬菜,它会相应地生产出一种或多种碎块,在我们的例子中生产的是蔬菜块。在Map操作中可能会出现有个洋葱坏掉了的情况,你只要把坏洋葱丢了就行了。所以,如果出现坏洋葱了,Map操作就会过滤掉这个坏洋葱而不会生产出任何的坏洋葱块。
·Reduce:在这一阶段,你将各种蔬菜碎都放入研磨机里进行研磨,就可以得到一瓶辣椒酱了。这意味要制成一瓶辣椒酱,你得研磨所有的原料。因此,研磨机通常将Map操作的蔬菜碎聚集在了一起。
当然上面内容只是MapReduce的一部分,MapReduce的强大在于分布式计算。假设你每天需要生产10000瓶辣椒酱,你会怎么办呢?这个时候你就不得不雇佣更多的人和研磨机来完成这项工作了,你需要几个人一起切蔬菜。每个人都要处理满满一袋的蔬菜,而每一个人都相当于在执行一个简单的Map操作。每一个人都将不断地从袋子里拿出蔬菜来,并且每次只对一种蔬菜进行处理,也就是将它们切碎,直到袋子空了为止。这样,当所有的工人都切完以后,工作台(每个人工作的地方)上就有了洋葱块、番茄块和蒜蓉等。
MapReduce将所有输出的蔬菜碎都搅拌在了一起,这些蔬菜碎都是在以key为基础的Map操作下产生的。搅拌将自动完成,你可以假设key是一种原料的名字,就像洋葱一样。所以全部的洋葱key都会搅拌在一起,并转移到研磨洋葱的研磨机里。这样,你就能得到洋葱辣椒酱了。
同样地,所有的番茄也会被转移到标记着番茄的研磨机里,并制造出番茄辣椒酱。
Apache Hadoop是一个由Apache基金会开发的分布式系统基础架构,它可以让用户在不了解分布式底层细节的情况下,开发出可靠、可扩展的分布式计算应用。Apache Hadoop框架允许用户使用简单的编程模型来实现计算机集群的大型数据集的分布式处理。它的目的是支持从单一服务器到上千台机器的扩展,充分利用了每台机器所提供的本地计算和存储,而不是依靠硬件来提供高可用性。其本身被设计成在应用层检测和处理故障的库,对于计算机集群来说,其中每台机器的顶层都被设计成可以容错的,以便提供一个高度可用的服务。
Apache Hadoop的框架最核心的设计就是HDFS和MapReduce。
HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。
1.Apache Hadoop简介
正如13.3.1小节MapReduce所提到的那样,Apache Hadoop受到了Google的GFS和MapReduce的启发,前者产生了Apache Hadoop的分布式文件系统NDFS(Nutch Distributed File System),而后者也作为核心组件之一被纳入Apache Hadoop。
Apache Hadoop的雏形开始于2002年的Apache的Nutch。Nutch是一个开源Java实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具,包括全文搜索Web爬虫。
随后在2003年,Google发表了一篇关于Google文件系统(GFS)技术的学术论文。GFS也就是Google File System,是Google公司为了存储海量搜索数据而设计的专用文件系统。
2004年Nutch的创始人Doug Cutting(同时也是Apache Lucene的创始人)基于Google的GFS论文实现了分布式文件存储系统,命名为NDFS。
2004年Google又发表了一篇技术学术论文,向全世界介绍了MapReduce。2005年Doug Cutting又基于MapReduce,在Nutch搜索引擎中实现了该功能。2006年,Yahoo!雇用了Doug Cutting,Doug Cutting将NDFS和MapReduce升级并命名为Hadoop。Yahoo!建立了一个独立的团队给Goug Cutting,用于专门研究和发展Hadoop。
2008年1月,Hadoop成为Apache的顶级项目。之后Hadoop被成功地应用在了其他公司,其中包括Last.fm、《纽约时报》等。
2008年2月,Yahoo!宣布其搜索引擎产品部署在了一个拥有10000个内核的Hadoop集群上。
Apache Hadoop主要有以下5个优点。
·高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。
·高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
·高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
·高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
·低成本。Hadoop是开源的,因此项目的软件成本会大大降低。
2.Apache Hadoop核心组件
Apache Hadoop包含以下模块。
·Hadoop Common。常见实用工具,用来支持其他Hadoop模块。
·Hadoop Distributed File System(HDFS)。分布式文件系统,它提供对应用程序数据的高吞吐量访问。
·Hadoop YARN。一个作业调度和集群资源管理框架。
·Hadoop MapReduce。基于YARN的大型数据集的并行处理系统。
其他与Apache Hadoop相关的项目如下。
·Ambari。一个基于Web的工具,用于配置、管理和监控的ApacheHadoop集群,其中包括支持Hadoop HDFS、Hadoop MapReduce、Hive、HCatalog、HBase、ZooKeeper、Oozie、Pig和Sqoop。Ambari还提供了仪表盘用于查看集群的健康,如热图,并能够以用户友好的方式来查看MapReduce、Pig和Hive应用,方便诊断其性能。
·Avro:数据序列化系统。
·Cassandra:可扩展的、无单点故障的多主数据库。
·Chukwa:数据采集系统,用于管理大型分布式系统。
·HBase:一个可扩展的分布式数据库,支持结构化数据的大表存储。
·Hive:数据仓库基础设施,提供数据汇总以及特定的查询。
·Mahout:一种可扩展的机器学习和数据挖掘库。
·Pig:一个高层次的数据流并行计算语言和执行框架。
·Spark:Hadoop数据的快速和通用计算引擎。Spark提供了简单和强大的编程模型以支持广泛的应用,其中包括ETL、机器学习、流处理和图形计算(有关Spark的内容,会在13.3.3小节讲述)。
·TEZ:通用的数据流编程框架,建立在Hadoop YARN之上。它提供了一个强大而灵活的引擎来执行任意DAG任务,以实现批量和交互式数据的处理。TEZ正在被Hive、Pig和Hadoop生态系统中的其他框架采用,也可以通过其他商业软件(例如,ETL工具),以取代HadoopMapReduce作为底层执行引擎。
·ZooKeeper:一个高性能的分布式应用程序协调服务(有关ZooKeeper的内容会在15.3.4小节讲述)。
Apache Spark是一个快速和通用集群计算系统。它提供了Java、Scala、Python和R等语言的高级API,以及支持通用执行图计算的优化引擎。它还支持一组丰富的更高级别的工具,包括执行SQL和结构化数据处理的Spark SQL、机器学习的MLlib、进行图形处理的GraphX,以及Spark Streaming。
1.Apache Spark简介
2009年,Spark诞生于UC Berkeley AMP Lab,最初属于UC Berkeley大学的研究性项目。它于2010年正式开源,于2013年成为Apache基金会项目,并于2014年成为Apache基金的顶级项目,整个过程不到5年时间。
由于Spark出自UC Berkeley大学,其在整个发展过程中都烙上了学术研究的标记,对于一个在数据科学领域的平台而言,这也是题中应有之义,Spark的来源甚至决定了它的发展动力。Spark的核心弹性分布式数据集(Resilient Distributed Datasets,RDD),以及流处理、SQL智能分析、机器学习等功能,都脱胎于学术研究论文。
Apache Spark有以下特点。
·快速:Apache Spark具有支持循环数据流和内存计算的先进的DAG执行引擎,所以比Hadoop MapReduce在内存计算上快100倍,在硬盘计算上快10倍。
·易于使用:Apache Spark提供了Java、Scala、Python和R等语言的高级API,可以用于快速开发相关语言的应用。Apache Spark提供了超过80个高级的操作,可以轻松构建并行应用程序。
·全面:Apache Spark提供了Spark SQL、机器学习的MLlib、进行图形处理的GraphX,以及Spark Streaming等库。你可以在同一应用程序无缝地合并这些库。
·到处运行:可以使用它的standalone cluster mode运行EC2、HadoopYARN或者Apache Mesos。可以访问HDFS、Cassandra、HBase、Hive、Tachyon,以及任意的Hadoop数据源。
2.Apache Spark与Apache Hadoop的关系
从以下两方面来比较Apache Spark与Apache Hadoop。
·解决问题的层面不同:首先,Apache Spark与Apache Hadoop两者都是大数据框架,但是各自存在的目的不尽相同。Hadoop实质上更多是一个分布式数据基础设施:它将巨大的数据集分派到一个由普通计算机组成的集群中的多个节点进行存储,意味着我们不需要购买和维护昂贵的服务器硬件。同时,Hadoop还会索引和跟踪这些数据,让大数据处理和分析效率达到前所未有的高度。Spark则是一个专门用来对那些分布式存储的大数据进行处理的工具,它并不会进行分布式数据的存储。
·数据处理方式不同:Spark因其处理数据的方式不一样,会比Hadoop MapReduce快很多。Hadoop MapReduce是分步对数据进行处理的,先从集群中读取数据,进行一次处理,将结果写到集群,从集群中读取更新后的数据,再进行下一次的处理,将结果写到集群。而反观Spark,它会在内存中以接近“实时”的时间完成所有的数据分析,集群中读取数据,完成所有必需的分析处理,将结果写回集群,整个计算过程就完成了。所以Spark的批处理速度比Hadoop MapReduce快近10倍,内存中的数据分析速度则快近100倍。如果需要处理的数据和结果需求大部分情况下是静态的,而且你也有耐心等待批处理完成,HadoopMapReduce的处理方式也是完全可以接受的。但如果你需要对流数据进行分析,比如那些来自工厂的传感器收集回来的数据,又或者说你的应用是需要多重数据处理的,那么你也许更应该使用Spark进行处理。
大部分机器学习算法都是需要多重数据处理的。此外,通常会用到Spark的应用场景有4个方面:实时的市场活动、在线产品推荐、网络安全分析、机器日记监控等。
3.容灾处理
两者的灾难恢复方式迥异,但是都很不错。因为Hadoop将每次处理后的数据都写入磁盘,所以其天生就能很有弹性地对系统错误进行处理。Spark的数据对象存储在分布于数据集群中的弹性分布式数据集中。这些数据对象既可以放在内存中,也可以放在磁盘中,所以RDD同样也可以提供完整的灾难恢复功能。
4.两者各为互补
Hadoop除了提供我们熟悉的HDFS分布式数据存储功能,还提供了MapReduce的数据处理功能、YARN的资源调度系统。所以这里我们完全可以抛开Spark,使用Hadoop自身的MapReduce来完成对数据的处理。
相反,Spark也不是非要依附于Hadoop才能生存。但如上所述,毕竟它没有提供文件管理系统,所以,它必须和其他的分布式文件系统进行集成才能运作。这里我们可以选择Hadoop的HDFS,也可以选择其他的,比如Red Hat GlusterFS。当需要外部的资源调度系统来支持时,Spark可以跑在YARN上,也可以跑在Apache Mesos上(有关Mesos内容会在下面章节详细讲述),当然可以用Standalone模式。但Spark默认还是被用在Hadoop上面的,毕竟,大家都认为它们的结合是最好的。