RDD概述
1、什么是RDD
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合.
Dataset:它就是一个集合,可以存储很多的元素。
Distributed:它的数据是分布式存储的,方便后期进行分布式计算。
Resilient:它表示弹性,它表示的含义:RDD中的数据可以保存在内存中或者磁盘中。
2、RDD的五大属性
 *  - A list of partitions
 	一个分区列表
 *  - A function for computing each split
 	作用在每一个分区中的函数
 *  - A list of dependencies on other RDDs
     一个RDD会依赖于其他多个RDD,RDD与RDD之间的依赖关系
 *  - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
      (可选项)针对于KV类型的RDD才会有分区函数Partitioner,并且必须要产生shuffle
 *  - Optionally, a list of preferred locations to compute each split on (e.g. block locations for
 *    an HDFS file)
       (可选项) 数据的本地性和数据块位置最优
创建RDD
  • 1、通过sc.parallelize,需要一个已经存在scala集合,来生成一个RDD
    • val rdd1=sc.parallelize(List(1,2,3,4))
  • 2、读取外部数据源
    • val rdd2=sc.textFile(“/words.txt”)
  • 3、在已有RDD的基础上操作对应的算子生成新的rdd
    • val rdd3=rdd2.flatMap(_.split(" "))
RDD的算子分类
1、Transformation(转换)
  • 一个rdd转换之后生成新的RDD,并不会立即执行,得到结果,RDD中的所有转换都是延迟加载的 ,而是记录下当前rdd的一系列操作。
2、Action(动作)
  • 会触发任务的真正运行
RDD的依赖关系
  • 1、宽依赖

    窄依赖指的是每一个父RDD的Partition最多被子RDD的一个Partition使用
    总结:窄依赖我们形象的比喻为独生子女
    
  • 2、窄依赖

    宽依赖指的是多个子RDD的Partition会依赖同一个父RDD的Partition
    总结:宽依赖我们形象的比喻为超生 
    
血统
RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。
RDD的缓存

可以把rdd保存在内存或者磁盘,避免下次使用的时候,重头在来计算得到。可以通过调用rdd的cache和persist方法进行缓存设置

1、cache
  • 它是一个transformation操作,对RDD进行缓存,它不会立即执行,而是触发了action算子操作的时候才会缓存数据,后面如果用到了,该份数据,不需要在重复计算得到,调用cache的时候,其本质是调用了persist方法默认是存放在内存中的,persist(StorageLevel.MEMOEY_ONLY)
2、persist
  • 可以选择不同缓存级别来缓存数据
3 、使用说明
  • 都需要触发action算子操作,才会触发缓存执行
DAG有向无环图
1 什么是DAG
  • DAG(Directed Acyclic Graph)叫做有向无环图,原始的RDD通过一系列的转换就形成了DAG,根据RDD之间依赖关系的不同将DAG划分成不同的Stage(调度阶段)。
2 划分stage
  • 1、从最后一个rdd开始往前推,把当前rdd加入到一个stage中,它是最后一个stage。
  • 2、遇到窄依赖就把这个rdd加入到本stage中,遇到宽依赖就从宽依赖切开,最后一个stage就结束了。
  • 3、然后重新分配一个stage, 按照上面的规则继续向前推,直到最开始的那个rdd,整个划分stage就结束了。
3 stage内部
  • 每个stage里面都有一组task, 被保存在taskSet集合中,可以被并行的计算。
  • stage与stage之间也存在依赖关系,后面的stage会依赖于前面stage产生的结果,只有前面的stage计算完成后才能运行后面的stage。
checkpoint机制
  • 会对数据进行一个持久化操作,保存在hdfs
  • 使用的时候:
    • 需要sc.setCheckpointdir 来设置一个检查点目录
    • 对需要缓存的rdd调用checkpoint
    • 注意:同样在执行数据缓存的时候,需要有对应的action算子操作,才会真正触发持久化操作。
  • 在做checkpoint操作的时候,此时会先执行对应触发action算子的rdd结果,计算完成之后又会开辟一个新的job来计算设置了checkpoint的rdd的结果。
  • 在设置了checkpoint之后,RDD的lineage就改变了。
  • 数据恢复的一般顺序
    • 先从内存查找,如果设置了缓存,直接从缓存中获取得到,如果没有就从checkpoint中查找,如果也没有,这个时候只能够重新计算得到。
spark的运行架构

在这里插入图片描述

task并行运行个数与线程数量有关,与核数无关

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部