Spark RDD的定义和介绍

来源:互联网 发布:ubuntu安装教程14.04 编辑:程序博客网 时间:2024/06/06 16:01

RDD是resilient distributed dataset的缩写即弹性分布式数据集 ,是Spark的核心也是基本所在
RDD是只读的、分区记录的集合,它只能基于在稳定物理存储中的数据和其他已有的RDD执行特定的操作来创建,它是逻辑集中的实体,在集群中的多台机器上进行了数据的分区,通过RDD的依赖关系形成Spark的调度顺序,形成整个Spark行分区

RDD有以下几种创建方式:

  • 从hdfs文件系统或其他hadoop文件系统中持久化存储系统中进行创建,如hive,hbase等
  • 从父rdd中通过转换得到新的rdd
  • 通过已知的scala集合在SparkContext中创建,如sc.makeRDD 或sc.parallelize

RDD有两种算子操作

  • 转换(Transformations):转换算子是延迟计算的,惰性的,即从一个RDD转换生成另一个RDD的转换不是马上执行,他们只是记住这些转换的流程,等到真正出发这个系列转换的动作时才会进行计算
  • 行动(Actions):Actions算子会触发Spark提交作业,并将数据输出到Spark系统中

RDD的内部属性

  • 分区列表:partitions,即数据集的基本组成单位,对rdd来讲每个分区都会被一个计算任务处理,并决定并行计算的粒度,用户可以在创建rdd的时候指定rdd分区个数,如果没有指定,那么会采用默认值,即程序所分配到的core数目,
  • 计算每个分区的函数:
  • 对父RDD的依赖列表:即rdd之间的依赖关系,rdd每次转换都会生成新的rdd,所有rdd会有一个前后依赖关系,在有分区丢失数据时,Spark通过这个依赖关系重新计算丢失的分区数据,而不是对所有分区进行重新计算
  • 对Key/Value数据类型的RDD分区器,控制分区策略和分区数:Spark实现了两种分区函数HashPartitioner和RangePartitioner,只有key/value的rdd才会有Partitioner,非key/value的Partitioner值是None,Partitioner不但决定了rdd本身的分区数量,也决定了父rdd shuffle输出时的分区数量
  • 每个数据分区的地址列表(如hdfs上的数据块地址),对于一个hdfs文件来讲,这个列表保存的就是每个partition所在的块的位置,Spark在进行任务调度的时候会尽可能的将计算任务分配到其所要处理数据块的存储位置

宽依赖、窄依赖:

  • 窄依赖:每个父 RDD 的分区都至多被一个子 RDD 的分区使用,即为 OneToOneDependecies,列入map,filter
    这里写图片描述
  • 宽依赖:多个子 RDD 的分区依赖一个父 RDD 的分区,即为 OneToManyDependecies或者一个RDD有多个子RDD分区使用,如join,groupByKey,会产生shuffle
    这里写图片描述

参照《Spark大数据处理技术与应用优化》

原创粉丝点击