RDD(Resilient Distributed Datasets,弹性分布式数据集)代表可并行操作元素的不可变分区集合。对于Spark的初学者来说,这个概念会十分陌生。即便是对于一些有Spark使用经验的人,要想说清楚什么是RDD,以及为什么需要RDD还是一件比较困难的事情。在《深入理解Spark RDD——为什么需要RDD?》一文解释了第二个问题,本文将开启对第一个问题的解答。
有些读者可能对本文的标题感到困惑,这是因为RDD的API非常多,所以本文首先对RDD中与调度系统息息相关的API方法进行分析,转换API、动作API及检查点API将在后续文章中进行介绍。
抽象类RDD定义了所有RDD的规范,我们从RDD的属性开始,逐步了解RDD的实现。
- _sc:即SparkContext。_sc由@transient修饰,所以此属性不会被序列化。
- deps:构造器参数之一,是Dependency的序列,用于存储当前RDD的依赖。RDD的子类在实现时不一定会传递此参数。由于deps由@transient修饰,所以此属性不会被序列化。
- partitioner:当前RDD的分区计算器。partitioner由@transient修饰,所以此属性不会被序列化。
- id:当前RDD的唯一身份标识。此属性通过调用SparkContext的nextRddId属性生成。
- name:RDD的名称。name由@transient修饰,所以此属性不会被序列化。
- dependencies_:与deps相同,但是可以被序列化。
- partitions_:存储当前RDD的所有分区的数组。partitions_由@transient修饰,所以此属性不会被序列化。
- storageLevel:当前RDD的存储级别。
- creationSite:创建当前RDD的用户代码。creationSite由@transient修饰,所以此属性不会被序列化。
- scope:当前RDD的操作作用域。scope由@transient修饰,所以此属性不会被序列化。
- checkpointData:当前RDD的检查点数据。
- checkpointAllMarkedAncestors:是否对所有标记了需要保存检查点的祖先保存检查点。<