标签:
【适用场景不同】
? ?
Hadoop:分布式批处理计算,强调批处理,常用于数据挖掘、分析
? ?
Spark:是一个基于内存计算的开源的集群计算系统,那些在并行操作之间重用工作数据集(比如机器学习算法)的工作负载。为了优化这些类型的工作负载,Spark 引进了内存集群计算的概念,可在内存集群计算中将数据集缓存在内存中,以缩短访问延迟,
目的是让数据分析更加快速
? ?
除了能够提供交互式查询外,它还可以优化迭代工作负载
? ?
【语言支持不同】
? ?
Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。
? ?
与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。
? ?
【数据操作不同】
? ?
Spark提供的数据集操作类型有很多
? ?
不像Hadoop只提供了Map和Reduce两种操作。
? ?
比如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】
? ?
Spark和Hadoop一样都是为适应海量数据计算提供了一个并行计算模型。
但传统的并行计算模型无法有效的解决迭代计算(每一步对数据执行相似的函数) 和交互式计算(用户反复查询一个数据子集)。Spark可以高效的解决这种需要反复利用一个数据集的海量数据计算问题。
? ?
【为什么传统的并行计算模型无法解决上述两个问题】
? ?
大多数现有的集群计算系统都是基于非循环的数据流模型。即从稳定的物理存储(如分布式文件系统)中加载记录,对数据进行一组确定性操作,然后将数据写回稳定存储。而对于需要反复利用一个数据集,这种模型会造成大量的IO操作
例如Hadoop本身的计算模型决定了它的所有工作都要转化成Map和Reduce等核心阶段,由于每次计算都要从磁盘读或者写数据,而且整个计算模型需要网络传输,这就导致越来越难以忍受的延迟性。
? ?
【为什么Spark能有效的解决迭代式计算问题】
其主要实现思想是RDD(弹性分布式数据集),通过RDD把所有计算的数据保存在分布式的内存中。迭代计算通常情况下都是对同一个数据集做反复的迭代计算,数据在内存中将大大减少IO操作,Spark通过RDD实现基于内存的计算。
? ?
【使用内存缓存数据集为什么快】
? ?
主要是几个方面:(1)首先是磁盘IO(2)其次数据的序列化和反序列化的开销也节省了(3)最后相对其它内存数据库系统,粗颗粒度的内存管理机制减小了数据容错的代价(如典型的数据备份复制机制)
? ?
【RDD不适用于那些场合】
? ?
RDD适用于具有批量转换需求的应用,并且相同的操作作用于数据集的每一个元素上。
在这种情况下,RDD能够记住每个转换操作,对应于Lineage图中的一个步骤,恢复丢失分区数据时不需要写日志记录大量数据。
RDD不适合那些通过异步细粒度地更新来共享状态的应用
例如增量抓取和索引Web数据的系统,这样的应用更适合使用一些传统的方法,例如数据库。
RDD是面向批量分析应用的这类特定系统,提供一种高效的编程模型,而不是这类异步应用程序。
? ?
标签:
原文地址:http://www.cnblogs.com/keedor/p/4420586.html