首先最核心的两点:内存和磁盘的区别;job中途失败重新计算的区别。
---spark最核心的概念是RDD(弹性分布式数据集),它的所有rdd在并行运算过程程中,可以做到数据共享,也就是可以重复使用mr在计算过程中
---mapr:一次数据过程包含从共享文件系统读取数据、进行计算、完成计算、写入计算结果到共享存储中,在计算过程中,不同计算节点之间保持高度并行,这样的数据流模型使得那些需要反复使用一个特定数据集的迭代算法无法高效地运行。
均是并行计算框架,Spark拥有HadoopMapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
---线程和进程的区别:子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU;进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源
a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
c.调度和切换:线程上下文切换比进程上下文切换要快得多。
从总体上来说,mr和spark都是基于多进程的并发计算模型,但是却采用了不同的并发计算机制,Spark拥有HadoopMapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。mr是多进程单线程模型,而spark是多进程多线程模型;mr应用程序由多个独立的Task进程组成,每个task相互独立,申请资源和申请数据,再到计算完成结果存储都是独立进行的;Spark应用程序的运行环境是由多个独立的executer进程构建的临时资源池构成的,而每个executer又分为多个task进程,拥有独立的mapshuffer,reduceshuffer,而且同一个executer中的数据可以进行复用,大大提高了数据和资源的利用率,节省了大量的频繁申请资源,调用数据所浪费的性能。
优点:基于线程和进程的区别,spark的任务启动速度很快,而mr的慢启动速度统常需要1s左右;,同节点的任务运行在一个进程中,也就是运行在一个JVM中,共享内存和资源,也就是数据和资源都可以共用,不必频繁的调用数据和申请注销资源,这就非常适合进行内存密集型任务和低延迟性作业;
缺点:同节点中的多线程会存在资源争抢的现象,难以细粒度的控制每个任务所应用的资源,在资源控制上自然mr的单线程做的更好,毕竟它不存在争抢和控制,
1、spark把运算的中间数据存放在内存,迭代计算效率更高,Spark中除了基于内存计算外,还有DAG有向无环图来切分任务的执行先后顺序;mapreduce的中间结果需要落地,需要保存到磁盘,这样必然会有磁盘io操做,影响性能。
2、spark容错性高,它通过弹性分布式数据集RDD来实现高效容错,RDD是一组分布式的存储在节点内存中的只读性质的数据集,这些集合是弹性的,某一部分丢失或者出错,可以通过整个数据集的计算流程的血缘关系来实现重建;mapreduce的话容错可能只能重新计算了,成本较高。
3、spark更加通用,spark提供了transformation和action这两大类的多个功能api,另外还有流式处理sparkstreaming模块、图计算GraphX等等;mapreduce只提供了map和reduce两种操作,流计算以及其他模块的支持比较缺乏。
4、spark框架和生态更为复杂,首先有RDD、血缘lineage、执行时的有向无环图DAG、stage划分等等,很多时候spark作业都需要根据不同业务场景的需要进行调优已达到性能要求;mapreduce框架及其生态相对较为简单,对性能的要求也相对较弱,但是运行较为稳定,适合长期后台运行。
Spark运行模式
1)Local:多用于本地测试,如在eclipse,idea中写程序测试等。该模式被称为Local[N]模式,是用单机的多个线程来模拟Spark分布式计算,用来验证开发出来的应用程序逻辑上有没有问题。其中N代表可以使用N个线程,每个线程拥有一个core。如果不指定N,则默认是1个线程(该线程有1个core)。不用启动Spark的Master、Worker守护进程( 只有集群的Standalone方式时,才需要这两个角色),也不用启动Hadoop的各服务(除非你要用到HDFS),这是和其他模式的区别哦,要记住才能理解。只会启动SparkSubmit进程又当爹、又当妈,既是客户提交任务的Client进程、又是Spark的driver程序、还充当着Spark执行Task的Executor角色。
2)Standalone:是Spark自带的一个资源调度框架,它支持完全分布式。
3)Yarn:Hadoop生态圈里面的一个资源调度框架,Spark也是可以基于Yarn来计算的。
4)Mesos
资源调度框架。
要基于Yarn来进行资源调度,必须实现AppalicationMaster接口,Spark实现了这个接口,所以可以基于Yarn。
总结,spark生态更为丰富,功能更为强大、性能更佳,适用范围更广;mapreduce更简单、稳定性好、适合离线海量数据挖掘计算。