一、初识spark(组成与原理)

一、概述spark来源

1、Spark特点
            用scala编写 底层是基于actor模式的akka框架 代码结构简洁
            基于DAG(有向无环图)的执行引擎 减少了计算时数据频繁读写到磁盘的开销
                **DAG有向无环图 : spark设计之初就考虑了 大量连续计算的需求 允许在对数据处理时 经由许多步算子 按序计算来实现处理 这些处理 是一个图的结构 但是要注意的是 图有向但是不能形成环 防止死循环 这样的有向无环的处理过程就称之为Spark的DAG有向无环图。
            建立在RDD(弹性分布式数据集)之上 可以以一致的结构应对不同的大数据处理需求 进行分布式的处理
                **RDD弹性分布式数据集 是spark处理数据的基本和统一的数据结构 本质上是一种分布式的数据结构 是spark分布式执行运算的基本的单位 - 将大量的数据切分为若干rdd 使其可以在统一的方式 和 格式下被spark处理 内部具有分区 基于分区分布在不同的节点中 实现分布式的运算。
            提供了Cache机制来实现数据共享进一步提高性能    
            生态圈越来越丰富能做的事越来越多 - SparkCore SparkSql SparkStreaming GraphX MLib
            支持的语言多 Java Python Scala

2、RDD(弹性分布式数据集):

(1)基本介绍:RDD与一般的数据结构不同它是分布式的,进行了分区Partition处理(例如:sc.parallelize(List(1,2,3),2)//指定分区个数),用于并行计算。是不可修改的,中间计算会不断地产生新的数据集,计算的时候数据集可以缓存存在内存或者磁盘中,它主要由三部分组成:数据分片、算子、血缘依赖(当某个节点计算错误时,只需要根据Lineage重新计算相关的操作而不必回滚整个程序,容错)

(2)RDD分类:PairRDD(键值对类型的RDD)与 RDD(普通类型的RDD),各种算子不做具体讲解。

二、Spark执行原理

1、懒执行(spark默认懒执行,为了流水线优化)

举例:val rdd1 = sc.makeRDD(List(1,2,3,4,5,6),2);
        val rdd2 = rdd1.map(x=>{println("abc");x+1;})//并没有产生任何的打印
        rdd2.collect//打印了abc 及 处理完的结果
        这个实验说明 默认 spark会有懒执行的机制 并不是每一步操作都会立即发生 可以能有延迟执行的效果,那么又是怎么区分呢?那就要讲解下算子的分类,算子分为transformation与action两类算子:如果一个方法是由RDD调用 执行后产生 另一个RDD 则这个方法属于Transformation方法, 如果一个方法是由RDD调用 执行后不是产生另一个RDD 而是产生一个非RDD的结果 则这个方法是Action类型的方法,Transformation类型的方法 会 懒执行, Action类型的方法 会 立即执行 执行当前操作和之前还未执行的懒执行操作。那么又是如何流水线优化呢?首先要介绍下宽依赖与窄依赖

2、窄依赖 / 宽依赖

rdd之间的依赖: 整个DAG有向无环图的执行 其实就是处理rdd为另一个rdd的过程 这个过程中父rdd和子rdd之间是有关系的这种关系称之为子rdd对父rdd依赖 这种依赖是通过在子rdd中保存父rdd的血缘关系了来实现。rdd之间的依赖又分为窄依赖和宽依赖。窄依赖:父RDD中的所有的分区都只面向一个子RDD中的分区;宽依赖:父RDD中有分区面向多个子RDD中的分区,窄依赖可以省略shuffle的过程 执行效率可以大大提高。而如果整个DAG中存在多个连续的窄依赖 则可以将这些连续的窄依赖整合到一起连续执行 中间不执行shuffle 从而提高效率 这样的优化方式称之为流水线优化。整个spark在执行DAG的过程中 提升性能的关键就是 尽力的去应用流水线优化 减少shuffle的过程

3、spark的处理rdd的过程,spark在遇到Transformation类型操作时都不会立即执行 而是懒执行 若干步的Transformation类型的操作后 一旦遇到Action类型操作时 必须要执行了 这时将所有之前的Transformation类型的操作和当前Action类型的操作组成一个DAG有向无环图 。再从Action方法向前回溯 如果遇到的是窄依赖则应用流水线优化 继续向前找 直到遇到宽依赖 无法实现优化 则将这一次段执行过程组装为一个stage 再从当前宽依赖开始继续向前找 重复刚才的步骤 从而将这个DAG划分为若干的stage。 在stage内部可以执行流水线优化 而在stage之间没办法执行流水线优化 必然会有shuffle 但是这种机制已经尽力的去避免了shuffle 最终 一个DAG对应一个Spark的Job  而其中划分出来的stage对应的就是job当中的task 而又由于rdd中可能有多个分区 这个task可能有多个实例来分布式的并发处理数据 这样 减少了 task的数量 减少了shuffle的过程 - 减少了数据落地的情况 和 由于shuffle的全局栅栏造成对性能的影响。这就是为什么spark比hadoop快的原因。

4.spark中的shuffle,spark中一旦遇到宽依赖就需要进行shuffle的操作,所谓的shuffle的操作的本质就是将数据汇总后重新分发的过程这个过程数据要汇总到一起 数据量可能很大所以不可避免的需要进行数据落磁盘的操作 会降低程序的性能,所以spark并不是完全内存不读写磁盘 只能说它尽力避免这样的过程来提高效率 。spark中的shuffle 在早期的版本中 会产生多个临时文件 但是这种多临时文件的策略 造成大量文件的同时的读写 磁盘的性能被分摊给多个文件 每个文件读写效率都不高 影响spark的执行效率所以在后续的spark中(1.5.0之后的版本)的shuffle中 只会产生一个文件 并且数据会经过排序 再附加索引信息 减少了文件的数量 并通过排序索引的方式提升了性能, 但是这种方式也有缺点 比如 排序 和查询索引都是需要时间消耗的 只能说是spark设计者的一种取舍 并不是完美的方案。

      
            

三、答疑解惑

1、有了Hadoop为什么还要Spark:
(1)从计算的方式来说:hadoop设计时 shuffle的过程中数据要频繁的落地到磁盘中 会大大的影响性能,而spark则是基于内存进行计算,数据尽量不落地,能有效提高效率 。(2)从shuffle来说,MR是每次计算都要进行shuffle过程,而spark则是可以进行流水线优化减少落地次数,提高效率。

2、为什么SPark要采用懒执行机制呢?
Spark会将所有连续的懒执行的操作都不立即执行 而是根据执行计划组建出一个执行的有向无环图 称为DAG 直到遇到Action类型的操作 整个DAG有向无环图 才真正去执行,这样的目的在于 在DAG有向无环图执行的内部可以执行流水线优化减少shuffle的过程 提高执行效率。

3、Spark的可靠性保证,spark具有可靠性的保证,这个可靠性的保证在RDD层面有所体现 体现在RDD中存在血缘信息 保存了父RDD相关的信息, 当子RDD在处理的过程中产生问题时 可以通过血缘关系回溯找到 最初的数据 来重新执行 保证数据不会丢失, 注意 并不是子RDD出现问题 找到当前子RDD的父RDD就可以的 因为父RDD中的数据 可能已经释放掉了 需要一直回溯到 最初的位置 重新计算,这样 重新计算时 整个DAG都要从头执行 效率低, 而如果在中间环节中设置过缓存 则在回溯时 找到缓冲中的数据 可以使用 就不需要再在向前寻找 提高效率, 这是缓存在可靠性保证中提升效率的体现

4、RDD 全称为 弹性分布式数据集 分布式的数据集合 好像给人的感觉是 所有的数据分布式的存储在集群不同节点的内存中进行运算 从逻辑上这样理解没有大问题 但事实上物理实现并不是这样    实际上 RDD从物理结构上来看 并不是一个分布式内存中存放完整数据的集合 真正的计算被转换为DAG有向无环图 执行时 数据不停的从来源流入 经由每个算子进行计算 最多写出到结果中 并不会真正的在内存中 存储全量的数据成为一个RDD 而是流式的处理 这样内存的消耗其实是非常小的  但是并不是所有的操作都可以按照如上的流式的方式执行,比如 groupBy join等操作 需要在全量数据上进行处理 这时只能将将全量数据 持久化后再处理 其实就是shuffle的过程,这其实就是流水线优化 和 shuffle的本质

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值