与 Hadoop 的 MapReduce 相比, Spark 基于内存的运算是 MapReduce 的 100 倍.基于硬盘的运算也要快 10 倍以上.
Spark 实现了高效的 DAG 执行引擎, 可以通过基于内存来高效处理数据流
那Spark为什么快呢?
1、消除了冗余的HDFS读写
Hadoop每次shuffle操作后,必须写到磁盘,而Spark在shuffle后不一定落盘,可以cache到内存中,以便迭代时使用,而且针对于spark-shuffle spark使用的是bypass的sortshuffle机制,进一步提高效率。如果操作复杂,很多的shufle操作,那么Hadoop的读写IO时间会大大增加,相对的spark就很快。
2、消除了冗余的MapReduce阶段
Hadoop的shuffle操作一定连着完整的MapReduce操作,冗余繁琐。而Spark基于RDD提供了丰富的算子操作,且reduce操作产生shuffle数据,可以缓存在内存中。
3、JVM的优化
Hadoop每次MapReduce操作,启动一个Task便会启动一次JVM,基于进程的操作。而Spark每次MapReduce操作是基于线程的,只在启动Executor是启动一次JVM,内存的Task操作是在线程复用的。每次启动JVM的时间可能就需要几秒甚至十几秒,那么当Task多了,这个时间Hadoop不知道比Spark慢了多少。
4.序列化方式
Spark序列化方式提供了kryo序列化–是一种轻量级的序列化,MR只有java的序列化–重量级。
5. DAG Scheduler
Spark 计算比 MapReduce 快的根本原因在于 DAG 计算模型。一般而言,DAG 相比MapReduce 在大多数情况下可以减少 shuffle 次数。Spark 的 DAGScheduler 相当于一个改进版的 MapReduce,如果计算不涉及与其他节点进行数据交换,Spark 可以在内存中一次性完成这些操作,也就是中间结果无须落盘,减少了磁盘 IO 的操作。
补充spark与mr的对比:
从计算模型来看,Hive是基于磁盘的,而Spark是基于内存的。
这就意味着在处理数据时,Spark可以减少shuffle的次数,因此通常比Hive更快。然而,由于Spark将中间结果写到内存中,因此对于需要频繁读写中间结果的迭代计算,Spark格外适用。
而Spark则是基于多线程模型,可以更好地利用多核CPU,提高处理效率。
1 本质区别:Spark除了需要shuffle的计算,其他是将结果/中间结果持久化到内存中,而MR是都需要落地到磁盘(map.reduce落地都写),因此Spark格外适用于频繁读写中间结果的迭代计算
2 资源:MR是基于进程,Spark是基于线程。MR是多进程单线程模型,而Spark是多进程多线程模型;
3 并行度:此外,速度区别之二在于任务的并行度不同:
Spark会增加任务的并行度从而提高速度:由于将中间结果写到磁盘与从磁盘读取中间结果属于不同的环节,MR只是将它们简单的通过串行执行衔接起来。而Spark把不同的环节抽象为Stage,允许多个Stage既可以串行执行,又可以并行执行。
saprk on hive 和 hive on spark
spark on hive:hive只负责存储角色,spark负责解析sql优化 执行
hive on spark:hive既作为存储又负责sql的解析优化,spark负责执行.
mrshuffle和sparkshuffle区别
区别:
1 本质上相同,都是把map端数据分类处理后交给reduce过程
2 数据流有所区别,mr是map/spill/merge/shuffle/sort/reduce 等各阶段逐一实现,spark是基于DAG数据流,可以实现更为复杂的数据流操作(宽窄依赖)
窄依赖不需要对分区数据进行 shuffle (父子一一对应),而宽依赖需要(父子一对多,也叫shuffle依赖)。所以窄依赖都会在一个 stage 中, 而宽依赖会作为 stage 的交界处。
对于宽依赖是划分Stage的依据,产生Shuffle。例如GroupByKey,reduceByKey,join,sortByKey等操作。
Spark中的DAG
DAG:全称为 Directed Acyclic Graph 中文为:有向无环图。在spark中,使用DAG来描述我们的计算逻辑。
DAG是一组顶点与边的组合,顶点代表RDD,边代表对RDD的一系列操作。