1. Spark为什么比Hadoop快
Spark比Hadoop快,由于Spark可以将中间结果缓存在内存中,避免频繁读取磁盘,因此在机器学习等需要对数据进行多次叠代计算的场景中,Spark比Hadoop快得多。然而即使在不使用内存缓存的场景中,Spark依然比Hadoop快,具体原因主要在以下方面:
1.1 进程与线程
Spark与Hadoop都会将程序分解成Task在节点运行,但Hadoop中的Task为进程,Spark中的Task为线程,因此在Task调度方面,Spark更轻更快。
1.2 编程语言
Spark原生支持Scala语言,Hadoop采用Java语言。Scala语言是一种函数式语言,函数式编程语言不需要考虑死锁,因为它不修改变量,所以根本不存在”锁”线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,实现并发编程。因此,Scala的并行性明显优于面向对象的Java语言。
1.3 Shuffle
Spark的shuffle和Hadoop有所不同。Hadoop MapReduce 将处理流程划分为:map, spill, merge, shuffle, sort, reduce等阶段,shuffle是位于map和reduce中间的一个阶段。在Spark中,没有这样功能明确的阶段。Spark将用户定义的计算过程转化为一个被称作Job逻辑执行图的有向无环图(DAG),图中的顶点代表RDD,边代表RDD之间的依赖关系。再将这个逻辑执行图转化为物理执行图,具体方法是:从逻辑图后往前推算,遇到 ShuffleDependency 就断开,最后根据断开的次数n,将其化分为(n+1)个stage。每个 stage 里面 task 的数目由该 stage 最后一个 RDD 中的 partition 个数决定。因此,Spark的Job的shuffle数是不固定的。
Spark只有在shuffle的时候才会将数据放在磁盘,而MR却不是。
1.4 工作流
典型的MR工作流是由很多MR作业组成的,他们之间的数据交互需要把数据持久化到磁盘才可以;而Spark支持DAG以及pipelining,在没有遇到shuffle完全可以不把数据缓存到磁盘。
1.5 缓存
虽然目前HDFS也支持缓存,但是一般来说,Spark的缓存功能更加高效,特别是在SparkSQL中,我们可以将数据以列式的形式储存在内存中。
2. Spark为什么采用延迟计算
- Spark使用惰性求值可以把一些操作合并到一起来减少计算数据的步骤。在类似 Hadoop MapReduce的系统中,开发者常常花费大量时间考虑如何把操作组合到一起,以减少MapReduce的周期数。
- 在Spark中,写出一个非常复杂的映射并不见得能比使用很多简单的连续操作获得好很多的性能。因此,用户可以用更小的操作来组织他们的程序,这样也使这些操作更容易管理。