大数据软件比较
分布式的简单理解
在分布式系统出现之前,只有通过不断增加单个处理机的频率和性能来缩短数据的处理时间,分布式则将一个复杂的问题切割成很多的子任务,分布到多台机器上并行处理,在保证系统稳定性的同时,最大限度提高系统的运行速度。
MapReduce
模型整体分析
关于MapReduce的内容参照即将发布的博文MapReduce
将大规模数据处理作业拆分成多个可独立运行的Map任务,分布到多个处理机上进行运行,通过shuffle机制处理并产生一定的中间结果,在通过Reduce任务混洗合并产生最终的输出文件。
优势与不足分析
优势分析:
- MapReduce编程模型使得任务执行和任务通信之间变得简单且规范,实现任务并行化,扩展性良好;
- 每次Map操作之后,产生的中间结果会保存在磁盘上,不会永久的留在内存中,这样减少内存的消耗,避免了内存溢出带来的数据丢失,同时可以更好的容错;
但是这种设计会产生一定的缺点:
一些不适合使用Map和Reduce操作来完成的问题,如处理图或者网络问题时,这些数据结构包含着各种隐性的关系:图的边、子树、节点之间的父子关系、权重等,而这些关系很难被分解为键值对在一次计算中完全表示,同时各任务依赖关系比较复杂时,会产生为了适应该处理模型对任务分解造成效率降低的情况。
另外MapReduce的明显不足: - 为了保证较好的扩展性,MapReduce任务之间相互独立,互不干扰,造成的后果是产生了大量的中间结果(这些结果保存在磁盘上)需要通过网络传输,占用网络资源,为了保证容错,所有的中间结果都保存在了磁盘上(Spark正是解决了此类问题从而提高了特定场景的效率),效率不高;2. 在MapReduce中只有等待所有的(可能在Map任务完成到一定阈值则可以开始启动Reduce任务,有待说明)Map任务结束后,Reduce任务才能进行计算,异步性差,导致资源利用率低。
Spark
关于Spark的内容参照即将发布的博文Spark
计算算法
Spark 是一种基于内存的开源计算框架,在 Spark 中,核心抽象概念就是弹性分布式数据集RDD(resilient distributed datasets) ,该抽象是分布在集群上的只读型可恢复数据集.用户可以利用 Spark 中的转换(transformation)和动作(action)对其进行操作,也可以长期保存在内存中不被回收,这样,再次使用这部分内容时,不需要再次创建此 RDD.这也是 Spark 在迭代问题中的性能表现要高于 MapReduce 的原因.RDD 通过一种血统(lineage)关系来完成容错:如果一个 RDD 丢失,那么这个丢失的RDD有充足的信息知道自己是如何从其他RDD转换而来的,这样便可以通过再次计算得到丢失的RDD.Spark 是由 Scala 语言实现的,而 Scala 是一种基于 JVM 的函数式编程语言,提供了类似DryadLINQ的编程接口.同时,Spark 还通过修改版的 Scala 解释器提供交互式编程,用户可以自由定义集群中的 RDD、函数、变量以及类.
应用场景
在处理迭代问题以及一些低延时问题时,Spark性能要优于MapReduce,而且在MapReduce之上做了很多改进与优化,使得在处理机器学习、图算法等迭代问题时,具有明显的优势。
具体应用场景:
.1. 迭代式算法:很多迭代式算法都会对相同的数据进行重复计算从而得到最优解.MapReduce 计算框架把每次迭代划分成一个或多个 MapReduce 作业(job),而每次迭代都要从磁盘重新加载数据,导致系统效率不高;而 Spark 可以把需要重复计算的数据缓存到内存中加快计算效率;
.2. 交互式数据分析:用户经常会用 SQL 对大数据集合做临时查询(ad-hoc query).Hive 把每次查询都当作一个独立的 MapReduce 作业,并且从磁盘加载数据,有很大的延迟;而 Spark 可以把数据加载到内存中,然后重复的查询;
.3. 流应用:即需要实时处理的应用,这类应用往往需要低延迟、高效率.
不足之处
Spark数据规模过大或内存不足时,会出现性能降低、数据丢失需要进行重复计算等缺点。
MapReduce和Spark对比总结
处理非迭代问题(如WordCount问题)时,MapReduce凭借自身的任务调度策略和shuffle机制,在中间数据传输数量以及文件数目方面性能优于Spark;
处理迭代问题(如PageRank问题)和一些低延迟问题时,Spark可以根据数据之间的依赖关系对任务进行合理的划分,相比于MapReduce有效的减少了中间数据传输数量和同步的次数,提高了系统的运行效率。
参考文献
吴信东,嵇圣硙.:MapReduce 与 Spark 用于大数据分析之比较[J].软件学报,2018,29(6):1770-1791.