一、Spark vs MapReduce
- 数据处理方式:Spark基于内存处理数据,可以将计算的中间结果保存到内存中反复利用,提高了处理效率。相比之下,MapReduce基于磁盘处理数据,将中间结果保存到磁盘中,这减轻了内存的压力,但 sacrificed the computational performance.
- 计算模型:Spark构建了有向无环图(DAG),可以减少数据shuffle和落地磁盘的次数。其DAG计算模型是Spark快于MapReduce的主因。如果计算过程中涉及数据交换,Spark也会把shuffle的数据写入磁盘。
- 资源申请方式:Spark采用粗粒度资源申请,在提交作业时就会申请完所有需要的资源。而MapReduce相比之下是细粒度资源申请,每个Task任务需要自己申请资源,自身运行程序,然后自己释放资源。
- 执行单元:Spark的任务执行单元是线程,创建销毁的开销较小;而MapReduce的Task执行单元是进程,相应的开销较大。
二、Spark:优劣势
优势:
- 高效迭代:Spark可以将中间数据缓存到内存中,使得反复迭代的运算效率较高。
- 高容错性:Spark通过RDD(Resilient DistributedDataset)实现了高度的容错性,可以通过“血统”(即源自数据衍生过程)对丢失的数据部分进行重建。
- 通用性强:Spark提供了丰富的数据集操作类型,包括样本、分组、联合、连接等多种操作类型,极大增强了其处理复杂业务场景的能力。
劣势:
- 内存问题:由于Spark需要将大量数据缓存在内存中,因此其对内存资源的消耗较大,如果内存资源有限,可能会影响其运行效率。
- 性能问题:Spark因为需要管理大量的内存与线程,同时还需要处理JVM的垃 示回收,有时可能出现性能不稳定的问题。
三、MapReduce:优劣势
优势:
- 编程易用性:MapReduce的设计初衷就是使得编程人员可以容易地编写出分布式计算程序,并能够在大量的廉价设备上运行。
- 扩展性强:MapReduce可以通过直接增加更多的机器来水平扩展其计算能力。
- 高容错性:MapReduce采用了故障转移机制,当一台机器出现故障时,其上的任务可以被转移到其他节点上执行,确保了任务的持续运行。
- 大数据处理能力强:MapReduce可以处理PB级别以上的海量数据,适合大规模与复杂的离线数据处理任务。
劣势:
- 实时计算能力弱:由于MapReduce的计算模型限制,它不擅长毫秒级或者秒级的实时计算任务。
- 不支持流式计算:MapReduce的输入数据集必须是静态的,无法处理动态变化的流式数据。
- 不支持DAG计算:在处理有依赖关系的多个应用程序时,MapReduce需要将每个作业的输出结果都写入磁盘,这会造成大量的磁盘IO,降低处理效率。