为什么Spark比MapReduce快

client 提交一个application可能包含多个job,mr中一个mr程序就是一个job,spark中一个DAG就是一个job。

程序运行方面

1)多个依赖关系的mr程序中,reduce产生的结果必须落盘,spark程序在没有shuffle时,数据不用落盘。

mr 中间产生的文件,哪怕1K,也都要落盘。而且多个任务串联,任务与任务之间都是独立的。独立的多个任务,在调度方面也要浪费时间,必须等到这个任务执行完了才能去执行下个任务。

2)Spark程序中多次触发action算子时,可以将反复用到的中间结果cache到内存+磁盘中,以后,就可以直接从内存中读取了。

3)mr 每一次shuffle都需要排序,Spark shuffle 时可以排序,也可以不排序。

4)spark中的有向无环图,在一定程度上减少了shuffle。

Spark采用的是延迟处理或是惰性计算,当遇到action算子时才会触发操作,将action算子之前的所有算子操作形成一个有向无环图的作业提交到集群中申请作业处理。这样的好处是操作序列可以进行连续计算,减少中间结果存储空间。

资源申请方面

spark是粗粒度资源申请,也就是当提交spark application的时候,application会将所有的资源申请完毕,如果申请不到资源就等待,如果申请到资源才执行application,task在执行的时候就不需要自己去申请资源,task执行快,当最后一个task执行完之后task才会被释放。

优点是执行速度快,代价是不能使集群得到充分的利用。

MapReduce是细粒度资源申请,当提交application的时候,task执行时,自己申请资源,自己释放资源,task执行完毕之后,资源立即会被释放,task执行的慢,application执行的相对比较慢。

优点是集群资源得到充分利用,代价是application执行的相对比较慢。

特别是spark在job任务过多的时候,不需要不断地去重新根据job开进程。spark由application统一申请资源,application提交时已经把所有资源申请好,只需要从线程池拿线程执行一个个job即可。

你可能感兴趣的:(大数据,spark,scala,mapreduce)