spark为什么快?
Spark SQL比Hadoop Hive快,是有一定条件的,而且不是Spark SQL的引擎比Hive的引擎快,相反,Hive的HQL引擎还比Spark SQL的引擎更快。
其实,关键还是在于Spark 本身快。
1,Spark是基于内存的计算,而Hadoop是基于磁盘的计算;Spark是一种内存计算技术。所谓的内存计算技术也就是缓存技术,把数据放到缓存中,减少cpu磁盘消耗。Spark和Hadoop的根本差异是多个任务之间的数据通信问题:Spark多个任务之间数据通信是基于内存,而Hadoop是基于磁盘。Hadoop每次shuffle操作后,必须写到磁盘,而Spark在shuffle后不一定落盘,可以cache到内存中,以便迭代时使用。如果操作复杂,很多的shufle操作,那么Hadoop的读写IO时间会大大增加。多个任务之间的操作也就是shuffle过程,因为要把不同task的相同信息集合到一起,这样内存的速度要明显大于磁盘了。
2、JVM的优化
Hadoop每次MapReduce操作,启动一个Task便会启动一次JVM,基于进程的操作。而Spark每次MapReduce操作是基于线程的,只在启动Executor是启动一次JVM,内存的Task操作是在线程复用的。
每次启动JVM的时间可能就需要几秒甚至十几秒,那么当Task多了,这个时间Hadoop不知道比Spark慢了多少。
考虑一种极端查询:Select month_id,sum(sales) from T group by month_id;
这个查询只有一次shuffle操作,此时,也许Hive HQL的运行时间也许比Spark还快。
结论:Spark快不是绝对的,但是绝大多数,Spark都比Hadoop计算要快。这主要得益于其对mapreduce操作的优化以及对JVM使用的优化。Spark比Hadoop的MR程序性能要高,正常在三到四倍左右,而并不是官网所说的高几百倍。
hadoop与spark的联系:
hadoop重在文件的存储,其核心也就是hdfs,分布式文件存储系统,其侧重点不在处理。而spark则是那么一个专门用来对那些分布式存储的大数据进行处理的工具,它并不会进行分布式数据的存储。
当然spark也不一定要依附于hadoop的文件系统,其他也是可以的。
在容错性方面,spark的处理要比hadoop强很多,spark提供了RDD,血缘关系图,DAG图,stage划分,在某一部分文件丢失时,可以根据从操作记录向前向后找回文件。而hadoop的某一文件出错就要从头再来了。
处理方法,spark提供了transformation和action这两大类的多个功能api,sparkStreaming流式算法,而hadoop的只有mapreducs。
最后hadoop比较稳定适合长期适合长期后台运行。