Spark
Spark实现了Standalone作为其内置的资源管理和调度框架,因此不依赖第三方的资源管理和调度器。该模式下由于Master节点存在单点故障,要解决此问题需要借助Zookeeper并且启动至少两个Master节点来实现高可靠。
Spark与Hadoop
Spark比MapReduce快的原因
- Spark是基于内存进行数据处理的,MapReduce是基于磁盘进行数据处理的
MapReduce的中间结果落到磁盘,涉及多次磁盘IO。而Spark读取数据后,在内存中存储和运算,避免了大量的IO - Spark中具有DAG有向无环图
Spark 计算比 MapReduce 快的根本原因在于 DAG 计算模型。DAG 相比MapReduce 在大多数情况下可以减少 shuffle 次数。如果计算不涉及与其他节点进行数据交换,Spark 可以在内存中一次性完成这些操作,即中间结果无须落盘,减少了磁盘 IO 的操作 - RDD
Spark 是通过RDD算子来运算的,它拥有两种操作,transformation和action,支持懒加载。RDD还拥有容错机制血缘关系Linage,当数据丢失时可以恢复数据。Spark速度非常快的原因之一是Spark 支持将需要反复用到的数据给 Cache 到内存中,减少数据加载耗时,当持久化某个RDD后,可以在其他计算中重用 - 资源申请粒度不同
Spark是粗粒度资源申请,即当提交Application时,Application会将所有的资源申请完毕,如果申请不到资源就等待,如果申请到资源才执行Application,task在执行的时候就不需要自己去申请资源,task执行快,当最后一个task执行完之后task才会被释放
MapReduce是细粒度资源申请,当提交Application的时候,task执行时,自己申请资源,自己释放资源,task执行完毕之后,资源立即会被释放,task执行的慢,Application执行的相对比较慢
懒加载有什么好处
RDD使用延迟加载,即懒加载,只有当执行操作,例如写入存储、collect 等操作时才加载数据。好处:
① 提高可管理性。可以查看整个 DAG,并且可以使用该信息进行流水线优化。比如:两个连续的map操作,在源码里面是在记录级别连续执行的,而不是做完一个RDD再去map到下一个RDD(流水线优化)
② 降低时间复杂度和加快计算速度。只运算真正要计算的转换操作,并且可以根据 DAG 图,合并不需要与 drive 通信的操作(连续的依赖转换),例如在一个 RDD 上同时调用 map 和 filter 转换操作,Spark可以将 map 和 filter 指令发送到每个 executor 上,Spark程序在真正执行 map 和 filter 时,只需访问一次 record,而不是发送两组指令并两次访问分区。理论上相对于非惰性,将时间复杂度降低了一半。例如:
val list1 = list.map(i -> i * 3) // Transformation1
val list2 = list1.map(i -> i + 3) // Transformation1
val list3 = list1.map(i -> i / 3) // Transformation1
list3.collect() // ACTION
假设原始列表(list) 很大,其中包含数百万个元素。如果没有懒惰的评估,我们将完成三遍如此庞大的计算。如果我们假设一次这样的列表迭代需要 10 秒,那么整个评估就需要 30 秒。并且每个 RDD 都会缓存下来,浪费内存。使用惰性评估,Spark 可以将这三个转换像这样合并到一个转换中,如下:
val list3 = list.map(i -> i + 1)
它将只执行一次该操作。只需一次迭代即可完成,这意味着只需要 10 秒的时间。
Spark与Hadoop区别
Hadoop和Spark都是并行计算,两者都是用MapReduce模型进行计算。Hadoop一个作业称为一个Job,Job里面分为Map Task和Reduce Task阶段,每个Task都在自己的进程中运行,当Task结束时,进程也会随之结束。
Spark用户提交的任务称为application,一个application对应一个SparkContext,application中存在多个job,每触发一次action操作就会产生一个job。每个job中有多个stage,stage是shuffle过程中DAGScheduler通过RDD之间的依赖关系划分的,每个stage里面有多个task,组成taskset,由TaskScheduler分发到各个executor中执行。一个Application -> 多个job ->一个job多个stage -> 一个stage多个task
- Spark计算速度比Hadoop快。Hadoop是从HDFS读取数据,通过MR将中间结果写入HDFS;然后再重新从HDFS读取数据进行MR,再刷写到HDFS,这个过程涉及多次落盘操作,多次磁盘IO,效率并不高;而Spark是读取集群中的数据后,在内存中存储和运算,避免了大量的IO
- Spark中RDD一般存放在内存中,如果内存不够存放数据,会同时使用磁盘存储数据。Spark通过在内存中缓存处理的数据,提高了处理流式数据和迭代式数据的性能。通过RDD之间的血缘连接、数据存入内存中切断血缘关系等机制,可以实现灾难恢复,当数据丢失时可以恢复数据
- JVM 的优化: Hadoop 每次 MapReduce 操作,启动一个 Task 便会启动一次 JVM,基于进程的操作。而 Spark 每次 MapReduce 操作是基于线程的,只在启动 Executor 时启动一次 JVM,内存的 Task 操作是在线程

Spark比Hadoop更快,因为它基于内存计算,使用DAG模型减少shuffle次数,支持RDD的懒加载和容错机制。RDD是Spark的核心,通过Transformation和Action操作实现计算,并通过血缘关系实现容错。Spark还提供了更丰富的算子,支持数据缓存,可以灵活选择内存或磁盘存储。相比于Hadoop的细粒度资源申请,Spark采用粗粒度资源申请,任务执行更快。
最低0.47元/天 解锁文章
2689

被折叠的 条评论
为什么被折叠?



