访问排行榜
谷歌广告
谷歌广告
Spark和MapReduce相比,都有哪些优势?
Author Albert陈凯 | Posted 2017-12-06 16:00:00

转载地址:www.jianshu.com/p/0dd03853b001

在实际应用中,由于MapReduce在大量数据处理时存在高延迟的问题,导致Hadoop无力处理很多对时间有要求的场景,越来越多的公司开始采用Spark作为与计算大数据的核心技术。
Spark和MapReduce相比,都有哪些优势?一个最明显的优点就是性能的大规模提升。
通俗一点说,我们可以将MapReduce理解为手工作坊式生产,每一个任务都是由作坊独立完成。涉及到大规模的生产时,由于每一个作坊都要独立处理原料采购、制作、存储、运输等等环节,需要花费大量的人力(计算资源)、物力(能源消耗)和运输(IO操作)。
而RDD则可以视为流水线式的生产,上一个环节生产的成品,可以作为下一个环节的原材料。通过这样的整合,大型的生产只需集中进行一次原料采购、存储和运输,从而节省大量时间。
2014年10月,Spark完成了一个DaytonaGray类别的Sort Benchmark测试,排序完全是在磁盘上进行的,与Hadoop之前的测试的对比结果如表格所示:


(表格来源: Spark officially sets anew record in large-scale sorting )
从表格中可以看出排序100TB的数据(1万亿条数据),Spark只用了Hadoop所用1/10的计算资源,耗时只有Hadoop的1/3 。


一、Spark核心RDD
Spark能够实现对MapReduce性能的直线超越,得益于Spark中一种名为RDD(Resilient Distributed DataSets)的数据处理模型。
传统的MapReduce虽然具有自动容错、平衡负载和可拓展性的优点,但是其最大缺点是采用非循环式的数据流模型(由于每一次MapReduce的输入/输出数据,都需要读取/写入磁盘当中,如果涉及到多个作业流程,就意味着多次读取和写入HDFS),使得在迭代计算式要进行大量的磁盘IO操作。


RDD抽象出一个被分区、不可变、且能并行操作的数据集;从HDFS读取的需要计算的数据,在经过处理后的中间结果会作为RDD单元缓存到内存当中,并可以作为下一次计算的输入信息。最终Spark只需要读取和写入一次HDFS,这样就避免了Hadoop MapReduce的大IO操作。


二、RDD容错机制
计算环节增加之后,数据的容错机制就变得十分重要。任何一个环节出现错误或发生数据丢失,都会导致最终的计算结果出现偏差。
一般来说,分布式数据集的容错性有两种方式:数据检查点和记录数据的更新。
面向大规模数据分析,数据检查点操作成本很高,需要通过数据中心的网络连接在机器之间复制庞大的数据集,而网络带宽往往比内存带宽低得多,同时还需要消耗更多的存储资源。
因此,Spark选择记录更新的方式。但是,如果更新粒度太细太多,那么记录更新成本也不低。
因此,RDD只支持粗粒度转换,即只记录单个块上执行的单个操作,然后将创建RDD的一系列变换序列(每个RDD都包含了他是如何由其他RDD变换过来的以及如何重建某一块数据的信息。因此RDD的容错机制又称“血统(Lineage)”容错)记录下来,以便恢复丢失的分区。
RDD在Lineage依赖方面分为两种:窄依赖(Narrow Dependencies)与宽依赖(Wide Dependencies,源码中称为Shuffle Dependencies),用来解决数据容错的高效性。


▲ 窄依赖是指父RDD的每个分区只被子RDD的一个分区所使用,子RDD分区通常对应常数个父RDD分区(O(1),与数据规模无关);
▲ 相应的,宽依赖是指父RDD的每个分区都可能被多个子RDD分区所使用,子RDD分区通常对应所有的父RDD分区(O(n),与数据规模有关)。
基于这样的设置窄依赖可以在某个计算节点上直接通过计算父RDD的某块数据计算得到子RDD对应的某块数据;宽依赖则要等到父RDD所有数据都计算完成之后,并且父RDD的计算结果进行hash并传到对应节点上之后才能计算子RDD。
当数据丢失时,对于窄依赖只需要重新计算丢失的那一块数据来恢复;对于宽依赖则要将祖先RDD中的所有数据块全部重新计算来恢复。所以在长“血统”链特别是有宽依赖的时候,需要在适当的时机设置数据检查点。也是这两个特性要求对于不同依赖关系要采取不同的任务调度机制和容错恢复机制。
在某些场景下,例如,在Spark Streaming中,针对数据进行update操作,或者调用Streaming提供的window操作时,就需要恢复执行过程的中间状态。此时,需要通过Spark提供的checkpoint机制,以支持操作能够从checkpoint得到恢复。
三、RDD的操作与执行
RDD本质上是一个内存数据集,在访问RDD时,指针只会指向与操作相关的部分。例如存在一个面向列的数据结构,其中一个实现为Int的数组,另一个实现为Float的数组。如果只需要访问Int字段,RDD的指针可以只访问Int数组,避免了对整个数据结构的扫描。
RDD将操作分为两类:transformation与action。无论执行了多少次transformation操作,RDD都不会真正执行运算,只有当action操作被执行时,运算才会触发。
在实现时,RDD针对transformation操作,都提供了对应的继承自RDD的类型,例如map操作会返回MappedRDD,而flatMap则返回FlatMappedRDD。
即Spark不会立刻计算结果,而只是简单的记住所有对数据集的转换操作。这些转换只有遇到action操作的时候才会开始计算。


四、其他
Spark的优势不仅体现在性能提升上的,Spark框架为批处理(Spark Core),交互式(Spark SQL),流式(Spark Streaming),机器学习(MLlib),图计算(GraphX)提供一个统一的数据处理平台,这相对于使用Hadoop有很大优势。

Android+GoLang+SprintBoot探讨群:186305789(疯狂的程序员),绝影大神在等你

个人兴趣网站:zero接码平台

个人兴趣网站:猿指


Comments

comments powered by zero