Mr、Spark、Flink的区别

编程入门 行业动态 更新时间:2024-10-13 02:15:50

Mr、Spark、Flink的<a href=https://www.elefans.com/category/jswz/34/1769972.html style=区别"/>

Mr、Spark、Flink的区别

1、spark和mr的区别

(1)计算速度

        MR与Spark的根本区别(关键优化)在于:Spark除了需要shuffle的计算,其他是将结果/中间结果持久化到内存中,而MR是都需要落地到磁盘(map.reduce落地都写),Mr势必造成磁盘IO,因此Spark格外适用于频繁读写中间结果的迭代计算。

        从任务的并行度看,Spark会增加任务的并行度从而提高速度:由于将中间结果写到磁盘与从磁盘读取中间结果属于不同的环节,MR只是将它们简单的通过串行执行衔接起来。而Spark把不同的环节抽象为Stage,允许多个Stage既可以串行执行,又可以并行执行。

(2)资源

MR是基于进程,Spark是基于线程。MR是多进程单线程模型,而Spark是多进程多线程模型

资源分配与共享

        MR应用程序由多个独立的Task进程组成,每个task相互独立,申请资源和申请数据,再到计算完成结果存储都是独立进行的;

        Spark应用程序的运行环境是由多个独立的executer进程构建的临时资源池构成的,而每个executer又分为多个task进程,拥有独立的map shuffle,reduce shuffle,而且同一个executer中的数据可以进行复用,大大提高了数据和资源的利用率,节省了大量的频繁申请资源,调用数据所浪费的性能。同节点的任务运行在一个进程中,也就是运行在一个JVM中,共享内存和资源,也就是数据和资源都可以共用,不必频繁的调用数据和申请注销资源,这就非常适合进行内存密集型任务和低延迟性作业;
        Spark在资源分配上,同节点中的多线程会存在资源争抢的现象,难以细粒度的控制每个任务所应用的资源。在资源控制上自然mr的单线程做的更好,毕竟它不存在争抢和控制。
资源申请与释放

        Spark的多个task跑在同一个进程上,这个进程会伴随spark应用程序的整个生命周期,即使没有作业进行,进程也是存在的。MR的每一个task都是一个进程,当task完成时,进程也会结束。

        在Application执行之前,所有的资源都会申请完毕,每一个task直接使用资源就可以了,不需要task在执行前自己去申请资源,task启动就快了,task执行快了,stage执行就快了,job就快了,application执行就快了。

        所以,Spark比MR快的原因也在这,MR启动就会进行更细粒度的资源申请,即需要时申请资源,用完就销毁。缺点就是申请销毁都需要时间,并且不存在任务的并行。但是spark把进程拿到以后,这个进程会一直存在,即使没有job在跑,所以后边的job可以直接启动,不需要再重新申请资源,但缺点也是Spark更加占用资源。

(3)容错

        Spark容错性更高,它通过弹性分布式数据集RDD来实现高效容错,RDD是一组分布式的存储在节点内存中的只读性质的数据集,这些集合是弹性的,某一部分丢失或者出错,可以通过整个数据集的计算流程的血缘关系来实现重建;MR的话也有容错,但是是以失败后重跑map task,reduce task的方式,成本相对较高
        Spark由于更细粒度的stage划分,也能够避免部分重复计算:当 Stage 中某个分区的 Task 执行失败后,Spark会重新对此 Stage 调度,但在重新调度的时候,会过滤已经执行成功的分区任务,所以不会造成重复计算和资源浪费。而MR如果task执行失败,就会重跑整个map/reduce task任务

(4)功能适用

        Spark更加功能更加丰富:Spark提供了transformation和action这两大类的多个功能的算子,另外还有流式处理Spark Streaming模块,离线计算Spark SQL、图计算GraphX等;MR只提供了map和reduce两种算子,流计算以及其他模块的支持比较缺乏。
(5)运行环境

        MR运行在YARN上,Spark支持多种运行模式:YARN、Local。

2、flink和sparkStreaming比较

(1)流(stream)和微批(micro-batching)

sparkStreaming是基于时间驱动的,flink是基于事件驱动的。

(2)数据模型不同

spark:采用RDD模型,spark streaming的DStream实际上也就是一组组小微批数据RDD的集合。flink:数据流,以及事件序列。

(3)运行时架构不同

spark:spark是批计算,将DAG划分为不同的stage,一个完成后才可以计算下一个。

flink:是标准的流执行模式,一个事件在一个节点处理完成后可以直接发往下一个节点进行处理。

3、mr shuffle和spark shuffle的区别

Mr的有一个Map完成,Reduce便可以去fetch数据了,不必等到所有Map任务完成,而Spark的必须等到父stage完成,也就是父stage的map操作全部完成才能去fetch数据。

Mr的Shuffle是sort-base的,那么不管是Map的输出,还是Reduce的输出,都是partion内有序的,而spark不要求这一点。

Mr的Reduce要等到fetch完全部数据,才将数据传入reduce函数进行聚合,而spark是一边fetch一边聚合。

4、spark shuffle的分类

HashShuffle:

每个shuffleFileGroup会对应一批磁盘文件,数量与下游stage的task数量相同。一个executor上有多少个CPU核数,就可以并行执行多少个task,而第一批并行执行的task,每个task就会创建一个shuffleFileGroup,并写入数据到磁盘文件中,下一批task会复用之前已有的shuffleFileGroup,包括其中的磁盘文件。简单的说就是下游有三个task,我确保每个executor生成3个文件。

 SortShuffleManager:

该模式下,数据会先写到一个内存数据结构中,根据不同的算子,可能选用不同的数据结构,如果是reduceBykey这种聚合类的算子,那么会选用Map数据结构,一边通过Map进行聚合,一边写入内存,如果是join类的shuffle算子,那么会选用Array数据结构,直接写入内存。每写一条到内存中,就会判断一下,是否达到某个阈值,当达到阈值是,会尝试把内存中的数据写入磁盘,然后清空数据结构。在溢写磁盘之前,会先根据key对内存中现有的数据进行排序。之后会分批写下数据,默认的batch大小为10000条,写入磁盘是通过BufferedOutputStream实现的。一个task在写入内存时,会发生多次溢写,也会产生多个临时文件,是会将之merge合并的。此外,由于一个task就是一个磁盘文件,也就意味着task为下游stage的task准备的数据都在这一个文件中,因此还会单独写一份索引文件,其中标识了数据在文件中的start和end offset。

 

更多推荐

Mr、Spark、Flink的区别

本文发布于:2024-03-23 23:35:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1744172.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:区别   Spark   Flink

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!