RDD概念
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,是spark core的底层核心,它代表一个不可变、可分区、里面的元素可并行计算的集合。
- Dataset:就是一个集合,存储很多数据.
- Distributed:它内部的元素进行了分布式存储,方便于后期进行分布式计算.
- Resilient:表示弹性,rdd的数据是可以保存在内存或者是磁盘中.
RDD 五大属性
- A list of partitions RDD 是 一组Partition的列表。 在Spark中任务是以task线程的方式运行,一个Partition就对应一个task线程。
- A function for computing each split Spark 中 RDD 的计算是以 Partition 为单位的,每个 RDD 都会实现compute()函数以达到这个目的。 compute()函数会对迭代器进行复合,不需要保存每次计算的结果。
- A list of dependencies on other RDDs RDD之间存在依赖关系。由于 RDD 是只读的数据集,如果对 RDD 中的数据进行改动,就只能通过 Transformation 操作,由一个或多个 RDD 计算生成一个新的 RDD,所以 RDD 之间就会形成类似 Pipeline的前后依赖关系,前面的称为parent RDD,后面的称为child RDD。当计算过程中出现异常情况导致部分 Partition 数据丢失时,Spark 可以通过这种依赖关系从父 RDD 中重新计算丢失的分区数据,而不需要对 RDD 中的所有分区全部重新计算,以提高迭代计算性能。
- A Partitoner for key-value RDDs 可选,针对 Key-Value 型 RDD 的 Partitioner(分区函数)。只有对于 Key-Value 型的 RDD,才会有 Partitioner,非 Key-Value 型的 RDD 的 Partitioner 值是 None。 当前,SPARK实现了两种类型的Partitioner,可控制Key分到哪个Reducer:
- 基于Hash的HashPartitioner
- 基于Range的RangePartitioner
- A list of preferred locations to compute each split on 可选,一个存储每个 Partition 的Preferred Location(优先位置)的列表。 对于每个 HDFS 文件来说,这个列表保存的就是每个 Partition 所在 block 的位置。 按照“移动数据不如移动计算”的理念,Spark 在进行任务调度的时候,会尽可能地优先将计算任务分配到其所要处理的 block 的存储位置,减少数据的网络传输,提升计算效率。
RDD 核心结构
- Partition RDD 内部的数据集在逻辑上和物理上都被划分为了多个 Partitions。
- Dependency RDD 之间的依赖关系又分为Narrow Dependency(窄依赖)和Wide Dependency(宽依赖)。
- Narrow Dependency:parent RDD中的每个Partition数据最多只能被child RDD中的一个Partition所使用,例如map、filter、union等操作都会产生Narrow Dependency。
- Wide Dependency:parent RDD中的每个Partition数据可以被child RDD中的多个Partition所使用, 例如 groupByKey、reduceByKey、sortByKey 等操作都会产生Wide Dependency。
- Partitioner 针对 Key-Value 型 RDD 的 Partitioner(分区函数)。
- Stage 当 Spark 执行作业时,会根据 RDD 之间的宽窄依赖关系,将 DAG 划分成多个相互依赖的 Stage。
Spark 划分 Stage 的整体思路是,按照倒序从后往前推:
如果遇到 RDD 之间为窄依赖,由于 Partition 依赖关系的确定性,Transformation 操作可以在同一个线程里完成,窄依赖就被划分到同一个 Stage 中;
如果遇到 RDD 之间为宽依赖,则划分到一个新的 Stage 中,且新的 Stage 为之前 Stage 的 Parent,然后依次类推递归执行,Child Stage 需要等待所有的 Parent Stages 执行完成后才可以执行。
这样每个 Stage 内的 RDD 都尽可能在各个节点上并行地被执行,以提高运行效率。
- Preferred Location Preferred Location(优先位置)是用于存储每个 Partition 优先位置的列表。
- CheckPoint CheckPoint 是 Spark 提供的一种基于快照的缓存容错机制。
RDD算子
RDD的算子可以分为两类
- Transformation:对已有的 RDD 进行转换生成新的 RDD,转换的过程采用惰性求值计算机制,不会立即触发执行实际的转换,而是先记录 RDD 之间的转换关系,只有当触发 Action 操作时才会真正地执行转换,并返回计算结果,以避免所有操作都执行一遍运算,减少数据计算步骤,提高 Spark 运算效率。常用的方法有 map、filter、flatmap、union、groupByKey 等。
- Action:强制执行求值必须用到的 RDD 的转换操作,对数据集执行实际的计算,并将最终的计算结果返回给 Driver 程序,或者写入到外部存储中。常用到方法有 reduce、collect、count、countByKey、 saveAsTextFile 等。
惰性求值计算机制
Transformation 操作具有 Lazy 特性,是一种惰性求值计算机制。也就是说,调用 Transformation 操作时,Spark 不会立即开始执行真正的计算,而是在内部记录下所要执行的操作的相关信息,待执行 Action 操作时,Spark 才会真正的开始计算。
可见,RDD 不仅可以看作是一个存放分布式数据的数据集,也可以当作是通过 Transformation 操作构建出来的、记录计算指令的列表。
惰性求值计算机制优势
惰性求值计算机制避免了对所有的 RDD 操作都进行一遍运算,其可以将很多操作结合在一起,以减少运算的步骤,使 Spark 的计算运行更高效。
更多关于RDD算子的介绍可看:
RDD的算子说明及操作
版权归原作者 秦岭小和尚 所有, 如有侵权,请联系我们删除。