Spark与Hadoop的区别

来源:互联网 发布:wp8.1部署软件 编辑:程序博客网 时间:2024/05/17 01:28

转自:http://www.mamicode.com/info-detail-565623.html


【适用场景不同】

Hadoop:分布式批处理计算,强调批处理,常用于数据挖掘、分析

Spark:是一个基于内存计算的开源的集群计算系统,那些在并行操作之间重用工作数据集(比如机器学习算法)的工作负载。为了优化这些类型的工作负载,Spark引进了内存集群计算的概念,可在内存集群计算中将数据集缓存在内存中,以缩短访问延迟,

目的是让数据分析更加快速

除了能够提供交互式查询外,它还可以优化迭代工作负载


【语言支持不同】

Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。

 Hadoop 不同,Spark  Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。


【数据操作不同】

Spark提供的数据集操作类型有很多,不像Hadoop只提供了MapReduce两种操作。比如map,filter, flatMap,sample, groupByKey, reduceByKey, union,join, cogroup,mapValues, sort,partionBy等多种操作类型,他们把这些操作称为Transformations同时还提供Count,collect, reduce, lookup, save等多种actions这些多种多样的数据集操作类型,给上层应用者提供了方便。各个处理节点之间的通信模型不再像Hadoop那样就是唯一的Data Shuffle一种模式。用户可以命名,物化,控制中间结果的分区等。可以说编程模型比Hadoop更灵活.


【容错机制不同】

一般来说,分布式数据集的容错性有两种方式:即数据检查点和记录数据的更新。

对于大规模数据分析,数据检查点操作成本很高(Hadoop用的就是数据检查点的容错方式):需要通过数据中心的网络连接在机器之间复制庞大的数据集,而网络带宽往往比内存带宽低得多,同时还需要消耗更多的存储资源(在内存中复制数据可以减少需要缓存的数据量,而存储到磁盘则会拖慢应用程序)。所以,RDD选择记录更新的方式。但是,如果更新太多,那么记录更新成本也不低。因此,RDD只支持粗粒度转换,即在大量记录上执行的单个操作。将创建RDD的一系列转换记录下来(Lineage),以便恢复丢失的分区。传统的MapReduce虽然具有自动容错、平衡负载和可拓展性的优点,但是其最大缺点是采用非循环式的数据流模型,这种数据流模型对两种应用的处理并不高效:

(1)机器学习和图应用中常用的迭代算法(每一步对数据执行相似的函数)

(2)交互式数据挖掘工具(用户反复查询一个数据子集)

这两种情况下,如果将数据输出到磁盘然后在每次查询时重新加载,会带来较大的开销。RDD正是解决这一缺点的抽象方法,通过实现RDD将数据保存在内存中能够极大地提高性能。

另外一方面海量数据处理中最重要也最难实现的是容错,因为海量数据中一旦有部分数据出错,排查以及恢复所需时间成本较高,因此RDD通过记录数据的更新将创建RDD的一系列转换记录下来(Spark中称之为Lineage,血统),以便恢复丢失的分区保证计算过程中即使有部分节点数据出错,最终也可以通过重构出错数据集得到计算结果。


接下来回答几个问题

【为什么会有Spark

SparkHadoop一样都是为适应海量数据计算提供了一个并行计算模型。

但传统的并行计算模型无法有效的解决迭代计算(每一步对数据执行相似的函数和交互式计算(用户反复查询一个数据子集)Spark可以高效的解决这种需要反复利用一个数据集的海量数据计算问题。


【为什么传统的并行计算模型无法解决上述两个问题】

大多数现有的集群计算系统都是基于非循环的数据流模型。即从稳定的物理存储(如分布式文件系统)中加载记录,对数据进行一组确定性操作,然后将数据写回稳定存储。而对于需要反复利用一个数据集,这种模型会造成大量的IO操作例如Hadoop本身的计算模型决定了它的所有工作都要转化成MapReduce等核心阶段,由于每次计算都要从磁盘读或者写数据,而且整个计算模型需要网络传输,这就导致越来越难以忍受的延迟性。


【为什么Spark能有效的解决迭代式计算问题】

其主要实现思想是RDD(弹性分布式数据集),通过RDD把所有计算的数据保存在分布式的内存中。迭代计算通常情况下都是对同一个数据集做反复的迭代计算,数据在内存中将大大减少IO操作,Spark通过RDD实现基于内存的计算。


【使用内存缓存数据集为什么快】

主要是几个方面:(1)首先是磁盘IO2)其次数据的序列化和反序列化的开销也节省了(3)最后相对其它内存数据库系统,粗颗粒度的内存管理机制减小了数据容错的代价(如典型的数据备份复制机制)


RDD不适用于那些场合】

RDD适用于具有批量转换需求的应用,并且相同的操作作用于数据集的每一个元素上。

在这种情况下,RDD能够记住每个转换操作,对应于Lineage图中的一个步骤,恢复丢失分区数据时不需要写日志记录大量数据。

RDD不适合那些通过异步细粒度地更新来共享状态的应用

例如增量抓取和索引Web数据的系统,这样的应用更适合使用一些传统的方法,例如数据库。

RDD是面向批量分析应用的这类特定系统,提供一种高效的编程模型,而不是这类异步应用程序。

1 0
原创粉丝点击