Spark

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

  Spark实现了Standalone作为其内置的资源管理和调度框架,因此不依赖第三方的资源管理和调度器。该模式下由于Master节点存在单点故障,要解决此问题需要借助Zookeeper并且启动至少两个Master节点来实现高可靠。

Spark与Hadoop

Spark比MapReduce快的原因

  1. Spark是基于内存进行数据处理的,MapReduce是基于磁盘进行数据处理的
      MapReduce的中间结果落到磁盘,涉及多次磁盘IO。而Spark读取数据后,在内存中存储和运算,避免了大量的IO
  2. Spark中具有DAG有向无环图
      Spark 计算比 MapReduce 快的根本原因在于 DAG 计算模型。DAG 相比MapReduce 在大多数情况下可以减少 shuffle 次数。如果计算不涉及与其他节点进行数据交换,Spark 可以在内存中一次性完成这些操作,即中间结果无须落盘,减少了磁盘 IO 的操作
  3. RDD
      Spark 是通过RDD算子来运算的,它拥有两种操作,transformation和action,支持懒加载。RDD还拥有容错机制血缘关系Linage,当数据丢失时可以恢复数据。Spark速度非常快的原因之一是Spark 支持将需要反复用到的数据给 Cache 到内存中,减少数据加载耗时,当持久化某个RDD后,可以在其他计算中重用
  4. 资源申请粒度不同
      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

  1. Spark计算速度比Hadoop快。Hadoop是从HDFS读取数据,通过MR将中间结果写入HDFS;然后再重新从HDFS读取数据进行MR,再刷写到HDFS,这个过程涉及多次落盘操作,多次磁盘IO,效率并不高;而Spark是读取集群中的数据后,在内存中存储和运算,避免了大量的IO
  2. Spark中RDD一般存放在内存中,如果内存不够存放数据,会同时使用磁盘存储数据。Spark通过在内存中缓存处理的数据,提高了处理流式数据和迭代式数据的性能。通过RDD之间的血缘连接、数据存入内存中切断血缘关系等机制,可以实现灾难恢复,当数据丢失时可以恢复数据
  3. JVM 的优化: Hadoop 每次 MapReduce 操作,启动一个 Task 便会启动一次 JVM,基于进程的操作。而 Spark 每次 MapReduce 操作是基于线程的,只在启动 Executor 时启动一次 JVM,内存的 Task 操作是在线程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值