目录

1 MapReduce

2 Spark

3 对比

3.1 性能

3.2 使用难度

3.3 成本

3.4 兼容性

3.5 数据处理

3.6 容错

3.7 安全性

3.8 处理速度

3.9 总结

4 相关概念

4.1 HDFS

4.2 MapReduce

4.3 YARN

4.4 SparkStreaming

4.5 SparkSQL

4.6 Hive

4.7 HBase

4.8 Flume


       

1 MapReduce

        首先大数据涉及两个方面:分布式存储系统分布式计算框架。前者的理论基础是GFS。后者的理论基础为MapReduce

        Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 Hadoop实现了一个分布式文件系统(Hadoop Distributed File System ,HDFS)。HDFS 有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。 Hadoop的框架最核心的设计就是:HDFS Map Reduce。HDFS为海量的数据提供了存储,则MapReduce更多情况下是一个编程框架,为海量的数据提供了计算。MapReduce是一种计算模型,用以进行大数据量的计算

        MapReduce框架有两个步骤(MapReduce 框架其实包含5 个步骤:Map、Sort、Combine、Shuffle 以及Reduce。这5 个步骤中最重要的就是MapReduce。这也是和Spark 最相关的两步,因此这里只讨论这两个步骤):一个是 Map,另一个是 Reduce。

       Map 步骤是在不同机器上独立且同步运行的,它的主要目的是将数据转换为 key-value 的形式;而 Reduce 步骤是做聚合运算,它也是在不同机器上独立且同步运行的。Map 和 Reduce 中间夹杂着一步数据移动,也就是 shuffle,这步操作会涉及数量巨大的网络传输(network I/O),需要耗费大量的时间。 由于 MapReduce 的框架限制,一个 MapReduce 任务只能包含一次 Map 和一次 Reduce,计算完成之后,MapReduce 会将运算结果写回到磁盘中(更准确地说是分布式存储系统)供下次计算使用。如果所做的运算涉及大量循环,比如估计模型参数的梯度下降或随机梯度下降算法就需要多次循环使用训练数据,那么整个计算过程会不断重复地往磁盘里读写中间结果。这样的读写数据会引起大量的网络传输以及磁盘读写,极其耗时,而且它们都是没什么实际价值的废操作。因为上一次循环的结果会立马被下一次使用,完全没必要将其写入磁盘。

         另:在MapReduce 框架下,数据的格式都是key-value 形式,其中key 有两个作用:一方面它被用作统计的维度,类似于SQL 语句里面的group by 字段,比如正文例子里的字符;另一方面它又被用作数据的“指南针”决定数据将被发送到哪台机器上。而后者是分布式计算框架的核心。在某些计算场景下,计算本身不需要key 值,或者说不需要Map 这一步,比如对一个数字数组求和。这种情况下,系统会自动地生成一个Map 用于将数据转换为key-value 形式,这时key 值就只被用作数据的“指南针”。

2 Spark

         Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark 是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark 拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘机器学习等需要迭代的 MapReduce 的算法。 

         Spark 是一个专门用来对那些分布式存储的大数据进行处理的工具没有提供文件管理系统自身不会进行数据的存储。它必须和其他的分布式文件系统进行集成才能运作。可以选择Hadoop的HDFS,也可以选择其他平台。

         作为一个开源的数据处理框架,Spark 是如何做到如此迅速地处理数据的呢?秘密就在于它是运行在集群的内存上的,而且不受限于 MapReduce 的二阶段范式。这大大加快了重复访问同一数据的速度。

         Spark 既可以单独运行,也可以运行在 Hadoop YARN 上(注:Hadoop第二代框架中的改进框架,用于将资源管理和处理组件分开,基于YARN的结构不受 MapReduce 约束),此时 Spark 可以直接从 HDFS (Hadoop Distributed File System 分布式文件系统)中读取数据。 诸如  Yahoo(雅虎)、Intel(因特尔)、Baidu(百度)、Trend Micro(趋势科技)和 Groupon(高朋)等公司已经在使用 Spark 了。

        Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。 
        Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。 尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 Hadoop 文件系统中并行运行。通过名为 Mesos 的第三方集群框架可以支持此行为。

        Spark 的重点在于数据的处理和计算能力,它并没有解决数据存储问题。换句话说它相当于Hadoop Mapreduce的升级版。通常Spark都是和Hadoop 一起使用的。因为Spark需要HDFS这样的存储系统,Spark又比Hadoop Mapreduce 更快,Api更丰富,对于机器学习算法来说更友好。
         当然Spark 可以不需要Hadoop ,Hadoop 也可以不需要Spark.
         Spark 还提供了Spark Sql, Spark Stream,Spark Mlib, Spark GraphX 一些丰富的功能,而且支持Java, Scala, Python,R等多种语言。

        Spark中最核心的概念是RDD(弹性分布式数据集),近年来,随着数据量的不断增长,分布式集群并行计算(如MapReduce、Dryad等)被广泛运用于处理日益增长的数据。这些设计优秀的计算模型大都具有容错性好、可扩展性强、负载平衡、编程方法简单等优点,从而使得它们受到众多企业的青睐,被大多数用户用来进行大规模数据的处理。 
  但是,MapReduce这些并行计算大都是基于非循环的数据流模型,也就是说,一次数据过程包含从共享文件系统读取数据、进行计算、完成计算、写入计算结果到共享存储中,在计算过程中,不同计算节点之间保持高度并行,这样的数据流模型使得那些需要反复使用一个特定数据集的迭代算法无法高效地运行。 
  SparkSpark使用的RDD就是为了解决这种问题而开发出来的,Spark使用了一种特殊设计的数据结构,称为RDDRDD的一个重要特征是,分布式数据集可以在不同的并行环境当中被重复使用,这个特性将Spark和其他并行数据流模型框架(如MapReduce)区别开。

         MapReduce的整个算法的瓶颈是不必要的数据读写,而Spark 主要改进的就是这一点。具体地,Spark 延续了MapReduce 的设计思路:对数据的计算也分为Map 和Reduce 两类。但不同的是,一个Spark 任务并不止包含一个Map 和一个Reduce,而是由一系列的Map、Reduce构成。这样,计算的中间结果可以高效地转给下一个计算步骤,提高算法性能。虽然Spark 的改进看似很小,但实验结果显示,它的算法性能相比MapReduce 提高了10~100 倍。

3 对比

3.1 性能

        Spark 在内存中处理数据,而 Hadoop MapReduce 是通过 mapreduce 操作在磁盘中处理数据。因此从这个角度上讲 Spark 的性能应该是超过 Hadoop MapReduce 的。

        然而,既然在内存中处理,Spark 就需要很大的内存容量。就像一个标准的数据库系统操作一样, Spark 每次将处理过程加载到内存之中,然后该操作作为缓存一直保持在内存中直到下一步操作。如果 Spark 与其它资源需求型服务一同运行在 Hadoop YARN 上,又或者数据块太大以至于不能完全读入内存,此时 Spark 的性能就会有很大的降低。

       与此相反, MapReduce 会在一个工作完成的时候立即结束该进程,因此它可以很容易的和其它服务共同运行而不会产生明显的性能降低。

        当涉及需要重复读取同样的数据进行迭代式计算的时候,Spark 有着自身优势。 但是当涉及单次读取、类似 ETL (抽取、转换、加载)操作的任务,比如数据转化、数据整合等时,MapReduce 绝对是不二之选,因为它就是为此而生的。

        小结:当数据大小适于读入内存,尤其是在专用集群上时,Spark 表现更好;Hadoop MapReduce 适用于那些数据不能全部读入内存的情况,同时它还可以与其它服务同时运行。

3.2 使用难度

       Spark 有着灵活方便的Java,Scala和 Python 的API,同时对已经熟悉 SQL 的技术员工来说, Spark 还适用 Spark SQL(也就是之前被人熟知的 Shark)。多亏了 Spark 提供的简单易用的构造模块,我们可以很容易的编写自定义函数。它甚至还囊括了可以即时反馈的交互式命令模式。

        Hadoop MapReduce 是用 Java 编写的,但由于其难于编程而备受诟病。尽管需要一定时间去学习语法,Pig 还是在一定程度上简化了这个过程, Hive也为平台提供了 SQL 的兼容。一些 Hadoop 工具也可以无需编程直接运行 MapReduce 任务。Xplenty 就是一个基于 Hadoop 的数据整合服务,而且也不需要进行任何编程和部署。

        尽管 Hive 提供了命令行接口,但 MapReduce 并没有交互式模式。诸如 Impala,Presto 和 Tez 等项目都在尝试希望为 Hadoop 提供全交互式查询模式。

        安装与维护方面, Spark 并不绑定在 Hadoop 上,虽然 在 Hortonworks(HDP 2.2 版) 和 Cloudera(CDH 5 版) 的产品中 Spark 和 Hadoop MapReduce 都包含在其分布式系统中。(注: Cloudera, Hortonworks 及 MapR 是 Hadoop 领域三大知名的初创公司,致力于打造更好的 Hadoop 企业版应用)。

        小结:Spark 更易于编程,同时也包含交互式模式Hadoop MapReduce 不易编程但是现有的很多工具使其更易于使用

3.3 成本

       Spark 和 Hadoop MapReduce 都是开源的,但是机器和人工的花费仍是不可避免的。

       这两个框架既可以在商用服务器上也可以运行在云端,下表可以看到它们有着相似的硬件需求:

框架                 Apache Spark                        Apache Hadoop balanced workload slaves

内核                      8–16                                                               4

内存                8 GB 到数百GB                                                24 GB

硬盘                       4–8                                                            4–6 1TB

网络                 10 GB 或更多                                                1 GB 以太网

        Spark 集群的内存至少要和需要处理的数据块一样大,因为只有数据块和内存大小合适才能发挥出其最优的性能。所以如果真的需要处理非常大的数据,Hadoop 绝对是合适之选,毕竟硬盘的费用要远远低于内存的费用。

        考虑到 Spark 的性能标准,在执行相同的任务的时候,需要的硬件更少而运行速度却更快,因此应该是更合算的,尤其是在云端的时候,此时只需要即用即付。

        在技术人员方面,即使 Hadoop 从 2005 年就开始普及,但是 MapReduce 方面的专家仍然存在着短缺。而对于从 2010 年才开始普及的 Spark ,这又意味着什么呢? 或许投身 Spark 学习的人正在快速增加,但是相比于 Hadoop MapReduce 仍然存在着更大的技术人才的缺口。

        进一步讲,现存了大量的 Hadoop 即服务的资料和基于 Hadoop 的服务(比如我们 Xplenty 的数据整合服务),这些都降低对技术人员能力和底层硬件知识的要求。相比之下,几乎没有现有可选的 Spark 服务,仅有的那些也是新产品。

        小结:根据基准要求, Spark 更加合算, 尽管人工成本会很高。依靠着更多熟练的技术人员和 Hadoop 即服务的供给, Hadoop MapReduce 可能更便宜。

3.4 兼容性

        Spark 既可以单独运行,也可以在 Hadoop YARN 上,或者在预置 Mesos 上以及云端。它支持实现 Hadoop 输入范式的数据源,所以可以整合所有 Hadoop 支持的数据源和文件格式。 根据 Spark 官方教程, 它还可以通过 JDBC 和 ODBC 同 BI(商业智能) 工具一起运行。 Hive 和 Pig 也在逐步实现这样的功能。

        小结: Spark 和 Hadoop MapReduce 具有相同的数据类型和数据源的兼容性。

3.5 数据处理

        除了平常的数据处理,Spark 可以做的远不止这点:它还可以处理图和利用现有的机器学习库。高性能也使得 Spark 在实时处理上的表现和批处理上的表现一样好。这也催生了一个更好的机遇,那就是用一个平台解决所有问题而不是只能根据任务选取不同的平台,毕竟所有的平台都需要学习和维护。

        Hadoop MapReduce 在批处理上表现卓越。如果需要进行实时处理,可以利用另外的平台比如  Storm 或者 Impala,而图处理则可以用 Giraph。MapReduce 过去是用 Mahout 做机器学习的,但其负责人已经将其抛弃转而支持 Spark 和 h2o(机器学习引擎)。

       小结:Spark 是数据处理的瑞士军刀;Hadoop MapReduce 是批处理的突击刀。

3.6 容错

       和 MapReduce 一样, Spark 会重试每个任务并进行预测执行。然而,MapReduce 是依赖于硬盘驱动器的,所以如果一项处理中途失败,它可以从失败处继续执行,而 Spark 则必须从头开始执行,所以 MapReduce 这样节省了时间。

      小结:Spark 和 Hadoop MapReduce 都有着较好的容错能力,但是 Hadoop MapReduce 要稍微更好一点。

3.7 安全性

       在安全性上, 此时的 Spark 还略显不足。 授权验证由共享秘钥机制支持,网络用户接口则通过 servlet 过滤器和事件日志保护。Spark 可以运行在 YARN 上并配合使用 HDFS, 这也就意味着它同时还拥有 Kerberos 认证授权验证,HDFS 文件许可机制和节点间的加密机制。

        Hadoop MapReduce 拥有所有 Hadoop 支持的安全机制,同时也整合了其它基于 Hadoop 的安全项目, 比如  Knox 网关和  Sentry。志在解决 Hadoop 安全的  Rhino 项目也只是在添加 Sentry 支持时添加了 Spark 支持。否则 Spark 开发者们只能自己去提升其安全性了。

        小结: Spark 的安全机制仍处在发展期。 Hadoop MapReduce 拥有更多安全控制机制和项目。

3.8 处理速度

        Hadoop是磁盘级计算,计算时需要在磁盘中读取数据;其采用的是MapReduce的逻辑,把数据进行切片计算用这种方式来处理大量的离线数据.

       Spark,它会在内存中以接近“实时”的时间完成所有的数据分析。Spark的批处理速度比MapReduce快近10倍,内存中的数据分析速度则快近100倍。

       比如实时的市场活动,在线产品推荐等需要对流数据进行分析场景就要使用Spark

3.9 总结

        Spark 是大数据领域冉冉升起的新星,但是 Hadoop MapReduce 仍有着较广的应用领域。

       在内存中进行数据处理使得 Spark 具有较好的性能表现,也比较高效合算。它兼容所有 Hadoop 的数据源和文件格式, 支持多种语言的简单易用的 API 也使人们更快速的可以上手。 Spark 甚至实现了图处理和机器学习工具

       Hadoop MapReduce 是一个更加成熟的平台,为进行批处理而生。当遇到确实非常大的数据以至于无法完全读入内存,又或是依靠着大量对该平台有经验的技术人员,它可能会比 Spark 更加合算。 而且围绕 Hadoop MapReduce 的衍生系统正在依靠着更多的支撑项目、工具和云服务而更加壮大。

       但是即使看上去 Spark 像是最终的赢家,问题在于我们永远不会单独使用它—我们需要 HDFS 存储数据,或许还会需要用到 HBase,Hive,Pig,Impala 或其他 Hadoop 项目。这意味着在处理非常大的数据的时候,Spark 仍然需要同 Hadoop 和 MapReduce 共同运行。

4 相关概念

4.1 HDFS

        (Hadoop Distributed File System,Hadoop分布式文件系统)是Hadoop体系中数据存储管理的基础。它是一个高度容错的系统,能检测和应对硬件故障,用于在低成本的通用硬件上运行。HDFS简化了文件的一致性模型,通过流式数据访问,提供高吞吐量应用程序数据访问功能,适合带有大型数据集的应用程序。 HDFS存储相关角色与功能: Client:客户端,系统使用者,调用HDFS API操作文件;与NN交互获取文件元数据;与DN交互进行数据读写。 Namenode:元数据节点,是系统唯一的管理者。负责元数据的管理;与client交互进行提供元数据查询;分配数据存储节点等。 Datanode:数据存储节点,负责数据块的存储与冗余备份;执行数据块的读写操作等。

4.2 MapReduce

        MapReduce是一种计算模型,用以进行大数据量的计算。HadoopMapReduceCommon 和 HDFS一起,构成了Hadoop发展初期的三个组件。MapReduce将应用划分为Map和Reduce两个步骤,其中Map对数据集上的独立元素进行指定的操作,生成键-值对形式中间结果。Reduce则对中间结果中相同“键”的所有“值”进行规约,以得到最终结果。MapReduce这样的功能划分,非常适合在大量计算机组成的分布式并行环境里进行数据处理。

4.3 YARN

        YARN是Hadoop最新的资源管理系统。除了Hadoop MapReduce外,Hadoop生态圈现在有很多应用操作HDFS中存储的数据。资源管理系统负责多个应用程序的多个作业可以同时运行。例如,在一个集群中一些用户可能提交MapReduce作业查询,另一些用户可能提交Spark 作业查询。资源管理的角色就是要保证两种计算框架都能获得所需的资源,并且如果多人同时提交查询,保证这些查询以合理的方式获得服务。

4.4 SparkStreaming

        SparkStreaming是一个对实时数据流进行高通量、容错处理的流式处理系统,可以对多种数据源(如Kdfka、Flume、Twitter、Zero和TCP 套接字)进行类似Map、Reduce和 Join 等复杂操作,并将结果保存到外部文件系统、数据库或应用到实时仪表盘。

4.5 SparkSQL

        SparkSQL是Hadoop中另一个著名的SQL引擎,正如名字所表示的,它以Spark作为底层计算框架,实际上是一个Scala程序语言的子集。Spark基本的数据结构是RDD(弹性分布式数据集),一个分布于集群节点的只读数据集合。传统的MapReduce框架强制在分布式编程中使用一种特定的线性数据流处理方式。MapReduce程序从磁盘读取输入数据,把数据分解成键/值对,经过混洗、排序、归并等数据处理后产生输出,并将最终结果保存在磁盘。Map阶段和Reduce阶段的结果均要写磁盘,这大大降低了系统性能。也是由于这个原因,MapReduce大都被用于执行批处理任务。

4.6 Hive

        Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

4.7 HBase

        HBase 是一个结构化数据的分布式存储系统。 HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。 HBase是一个针对结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。和传统关系数据库不同,HBase采用了BigTable的数据模型:增强的稀疏排序映射表(Key/Value),其中,键由行关键字、列关键字和时间戳构成。HBase提供了对大规模数据的随机、实时读写访问,同时,HBase中保存的数据可以使用MapReduce来处理,它将数据存储和并行计算完美地结合在一起。

4.8 Flume

        Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量 日志 采集、聚合和传输的系统。Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
 

 

http://blog.jobbole.com/97150/

https://www.zhihu.com/question/53354580

https://www.zhihu.com/question/26007361