1. IO操作
MapReduce每次shuffle都必须写到磁盘中,而Spark的shuffle不一定写到磁盘中,而是可以缓存到内存中,
以便后续的其他迭代操作时直接使用。这样一来,如果任务复杂,需要很多次的shuffle才能完成,
那么Hadoop读写磁盘文件时花费在IO上的时间就会大大增加。
比如: select name,age from (select * from user where age >30 and age <40)
2. shuffer机制
通常每次MapReduce都会有一次shuffer;
而Spark基于RDD提供了丰富的算子操作,简单来说,spark遇到宽依赖才会出现shuffer。消除了冗余的MapReduce阶段
3. jvm优化
mapreduce的任务它是以进程的方式运行在yarn集群中,比如一个job有1024个MapTask,
这个时候就需要开启1024个进程去处理这个1024个task,可是启动一个task便会启动一次JVM。
spark的任务它是以线程的方式运行在进程中,只在启动Executor进程时启动一次JVM。每次执行一个task,
都是复用Executor进程中的线程(Executor中维护着一个线程池)。JVM的每次启动,
都将会花费几秒甚至是十几秒的时间.如果task多了,基于进程的MR便会频繁的启动JVM,也就花费了大量启动JVM的时间。
但是也有例外,像select month_id,sum(salas) from T group by month_id这样的查询,只发生了一次shuffle操作(group by),
Spark需要创建线程池,此时,Hive HQL的运行时间也许比Spark还要块。
综上所述:Spark快主要是因为它对MapReduce操作的优化以及对JVM使用的优化.
但Spark快并不是绝对的,在某些情况下,也有MapReduce比Spark快的情况。