码迷,mamicode.com
首页 > 其他好文 > 详细

Spark与Hadoop的区别

时间:2015-04-12 22:21:15      阅读:541      评论:0      收藏:0      [点我收藏+]

标签:

【适用场景不同】

? ?

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是面向批量分析应用的这类特定系统,提供一种高效的编程模型,而不是这类异步应用程序。

? ?

Spark与Hadoop的区别

标签:

原文地址:http://www.cnblogs.com/keedor/p/4420586.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!