Spark、Hadoop和MapReduce三者存在的问题

(1)Spark能否替换Hadoop?

首先,Spark只是一个计算平台,本身没有提供分布式文件系统,即没有提供分布式存储和管理。现在大多Spark计算都依赖于Hadoop的分布式文件系统HDFS,以及集群资源管理器YARN。

Hadoop工作原理:将作业分解成更小的任务,将数据进行分区,每一个任务实例处理一个不同的分区,任务实例并行执行。它的核心是分布式文件系统HDFS和MapReduce框架,HDFS为数据提供存储,MapReduce框架为数据提供并行计算。

MapReduce框架存在一些局限性,它仅支持Map和Reduce操作,处理效率低,Map中间结果写入磁盘,Reduce写入HDFS,多个MapReduce之间通过HDFS交换数据,任务调度和启动开销大;同时,Map和Reduce均需要排序,不适合迭代计算(机器学习、图计算)、交互式处理和流处理。

Spark是轻量的、基于内存计算的计算框架且计算速度比Mapreduce块10~100倍。Spark采用与MapReduce类似的编程模型,同时支持Scala、Java、Python、R等多种语言;在Spark中,数据被高度抽象存储在弹性分布式数据集RDD,对RDD的操作称为算子,如map、reduce、filter、join、groupby等;同时RDD可以缓存在内存中,每次RDD数据集的操作结果保存在内存中,下一次操作直接从内存中读取数据,省去了MapReduce中大量的I/O操作;同时,也提高了迭代算法和交互式运行速度。Spark还提供了丰富的API,代码量比MapReduce少2~5倍。

Spark的计算速度快,最主要的原因是它可以将数据缓存在内存中,但是内存是主要的短板。而Haddoop,在大规模数据的应用场景中很受欢迎;而且由于Spark没有分布式存储系统,又不得不依赖像Hadoop HDFS这类分布式文件存储和管理系统。

另一方面,从设计理念上,Hadoop的设计初衷是使得客户在不了解分布式底层的细节的情况下开发分布式程序,能够充分利用集群的威力进行高速运算和存储实现数据的大规模批量处理,是一款真正意义上的大数据处理平台。而Spark的开发者对于Spark的定位是“one stack to rule themall”,也就是全栈多计算范式的高效数据流水线,使得 Spark能够完成多种复杂的任务,加之Spark是基于内存计算,使得Spark能够更高效地处理数据。但是由于内存的限制,Spark 是一款轻量级的大数据处理平台。正因为上述设计理念的不同,二者的应用场景不同。

Hadoop方面:
1、ETL 
MapReduce作为针对处理批量数据的大数据计算框架,在面对需要批量处理的数据时表现出理想的效果,最主要的应用场景是在构建数据仓库时,针对存入数据仓库数据进行预处理,即数据的抽取、转换和装载(ETL)。
2、数据采集与处理场景
由于 Spark 不支持异步细粒度更新,使得其不能够有效地支持爬虫技术,而 MapReduce则能够有效地支持爬虫技术,包括增量爬虫的实现。

Spark方面:
1、流数据处理场景
流数据是一种顺序、快速、连续到达的数据序列,因此流数据是一种具有较强的实时性数据。但是 MapRedcue 作为一种高延迟的计算框架,针对海量流数据时处理结果的实时性无法保证,而其他针对流数据的技术如 Storm 等则无法处理海量数据,Spark 则凭借其内存计算优势有效解决了流数据的处理分析问题,特别是 Spark 生态系统中的 Spark streaming,它克服了MapReduce 与 Strom 的缺点,在保证实时性的前提下还保证了高吞吐性与高容错性,实现了对海量流数据的处理。
2、多轮迭代问题
MapReduce 在计算过程中会将计算的中间数据输出到磁盘中,因此在针对数据的重用与迭代方面拥有较低的执行效率;而 Spark 则弥补了这种不足,Spark 内存计算的特性以及核心技术 RDD 和 DAG,避免了将多次计算的中间结果写到HDFS 的开销,同时提供 cache 机制来支持需要反复迭代计算或者多次数据共享,减少数据读取的 IO 开销,因此在需要多次操作特定数据、进行多轮迭代的应用场景中,Spark 要明显优于MapReduce,且针对特定数据,反复操作的次数越多,所需读取的数据量越大,受益越大。
3、快速查询与实时推荐场景
在 Spark 之前,Hive 因其以 MapReduce 为计算引擎,使得在大数据查询领域得到了广泛应用;在 Spark 出现之后,凭借内存计算优势,使得其针对特定数据的快速查询优势明显,特别是在查询性能上,要优于 Hive 210 倍。而 Spark SQL 的提出更加增强了 Spark 这种优势。因此 Spark 以及 Spark SQL 在数据的快速查询领域逐渐得到广泛的应用。
4、图计算应用场景

综上,Hadoop与Spark有着不同的特点,使得二者拥有不同的应用场景,因而Spark无法取代Hadoop。

(2)Spark能否替换MapReduce?

1、大数据评估指标下的对比
(1)运行时间
在 MapReduce 与 Spark 架构上运行不同的算法,其运行时间差异也较大.因为 Spark 是轻量级的、基于内存计算的开源的集群计算平台,在默认情况下,Spark 中的数据都会基于内存进行存储;而 MapReduce 每一步 Map 或 Reduce 操作的结果都需要存入磁盘.所以相对而言,在一般情形中,基于内存存储的 Spark 运行速度较快.但是过多的内存需求也会带来相应的问题,如在内存资源紧缺或者数据规模较大的情况下,Spark 的性能会出现大幅下降甚至无法完成计算。
(2)资源消耗
在不同问题中,磁盘读写速度、CPU 速度和网络带宽都可能是限制算法性能的瓶颈.当解决同一问题时,MapReduce 在内存、网络
以及磁盘的占用率上都要低于 Spark.更低的资源消耗不仅可以降低系统对硬件的要求,也保证 MapReduce 可以在同一集群中与其他应用协作计算互不干扰。
(3)容错性能
在 MapReduce中,每一步操作的结果都会被存入磁盘,虽然需要大量的磁盘 I/O操作,但是在计算出现错误时可以很好地从磁盘进行恢复;而 Spark 所有计算都基于内存存储,因为内存中的数据会不定期进行清理,所以当某一步计算出现数据丢失时,Spark 需要根据 RDD 中的信息进行数据的重新计算,会耗费一定的资源。

2、不同场景下的对比
(1)问题类型
•  批处理问题与交互式问题
批处理问题通常指针对静态离线的数据进行处理,在处理过程中,用户需求及数据不会产生变化的问题;而交互式问题则要求在处理问题过程中用户可以和系统进行交互式访问并及时响应.针对批处理问题,通常可以选择 MapReduce 模型进行处理,Spark 则更多地应用在交互式问题上.因为 MapReduce 作业划分策略以及中间结果必须存入磁盘等特性,无法在很短的时间内对交互访问进行响应;而 Spark 的任务调度策略减少了大量不必要的磁盘操作,可以较好地进行交互式操作。
•  迭代问题与非迭代问题
迭代问题与非迭代问题的主要区别在于迭代问题需要对某部分数据进行重复的操作以得到最终的结果,如在 PageRank 问题中每次迭代都需要对 Link 和 Rank 数据进行相同的操作.由于 MapReduce 处理迭代问题时每次迭代过程都需要磁盘读取操作,效率较低;而 Spark 每次迭代结果无需存入磁盘,并且允许用户将常用数据存入内存,使得 Spark 在处理迭代问题时效率要高于 MapReduce。
(2)数据类型
•  键值对数据
在 MapReduce 模型中,所有的数据都被转化为键值对类型进行分布式处理,所有的 Map 和 Reduce 操作都是建立在键值对形式的基础上.如果待处理数据能很好地以键值对形式进行表现和处理,那么 MapReduce 可以较好地胜任这类问题。
•  图数据
在社交网络和商品推荐场景中,数据通常是以图的形式表现出来,数据内部关联度可能较高,如社交网络不同用户之间的相关性.在对这样的数据进行处理时,如果转化成键值对形式会引入大量的聚集(aggregation)和连接(join)操作,带来大量的计算和数据迁移,导致效率不高.针对此类问题,Spark的高效图计算模型 GraphX.GraphX 利用 Spark 框架提供的内存缓存 RDD、任务调度策略以及基于依赖关系的容错等特性,实现了高效健壮的图计算框架.Spark GraphX 定义了图的数据模型以及一系列针对图的并行计算操作,使得图数据可以方便快速地进行存储与计算.
•  流数据
在一些特定的场景中(如实时用户推荐、用户行为分析)对实时性要求很高,要求系统能够快速地处理实时的数据流,通常每次数据处理的时间间隔在数百毫秒到数秒之间.显然,MapReduce 基于磁盘的计算模型不能满足这种实时的需求.而基于 Spark 的流式框架 Spark Streaming 则是专门用来处理此类问题.其原理是:将流数据分割成数据片段封装到 RDD 中,然后以类似批处理的方式对这些数据片段进行操作.Spark Streaming 在本质上仍然是一种批处理方式,但由于 Spark 可以基于内存达到较快的速度从而获得准实时的特性.
(3) 数据规模
在 MapReduce 中,一个完整的问题会被划分为一个或多个作业,每个作业运行时只会占用少量内存,且运行完成后会将结果写入磁盘并释放内存中的数据.而 Spark 在运行过程中会产生大量的 RDD,所有 RDD 都会默认先存入内存中.由于 RDD 只读不可修改的特性,随着计算的进行不断会有新的 RDD 生成并存入内存,所以在处理相同问题时,Spark 内存的需求量会远远大于 MapReduce.并且,Spark 的内存需求会随着问题的数据规模增大而增加,甚至在数据规模过大时,Spark 会无法正常完成运行过程,但是 MapReduce 可以很好地应对这种问题 .所以在数据规模较大时,考虑到系统的稳定性以及内存消耗问题,应该选择对内存需求更小的MapReduce 框架;而在处理轻量级数据时,Spark 可以根据其内存运算的优势达到更好的效果.
综上,不同的应用场景下,二者各有千秋,所以具体情况还是得具体处理。

(3)Spark能否处理非常大的数据集?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值