版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
RDDInfo用于描述RDD的信息,RDDInfo提供的信息如下:
- id:RDD的id。
- name:RDD的名称。
- numPartitions:RDD的分区数量。
- storageLevel:RDD的存储级别(即StorageLevel)。
- parentIds:RDD的父亲RDD的id序列。这说明一个RDD会有零到多个父RDD。
- callSite:RDD的用户调用栈信息。
- scope:RDD的操作范围。scope的类型为RDDOperationScope,每一个RDD都有一个RDDOperationScope。RDDOperationScope与Stage或Job之间并无特殊关系,一个RDDOperationScope可以存在于一个Stage内,也可以跨越多个Job。
- numCachedPartitions:缓存的分区数量。
- memSize:使用的内存大小。
- diskSize:使用的磁盘大小。
- externalBlockStoreSize:Block存储在外部的大小。
RDDInfo还提供了以下方法:
- isCached:是否已经缓存。isCached的实现见代码清单1。
代码清单1 isCached的实现
def isCached: Boolean = (memSize + diskSize > 0) && numCachedPartitions > 0
- compare:由于RDDInfo继承了Ordered,所以重写了compare方法以用于排序。compare的实现见代码清单2。
代码清单2 compare的实现
-
override def compare(that: RDDInfo):
Int = {
-
this.id - that.id
-
}
此外,RDDInfo的伴生对象中定义了fromRdd方法,用于从RDD构建出对应的RDDInfo,其实现见代码清单3。
代码清单3 RDDInfo伴生对象的fromRdd方法
-
private[spark]
object RDDInfo {
-
def fromRdd(rdd: RDD[_]): RDDInfo = {
-
val rddName = Option(rdd.name).getOrElse(Utils.getFormattedClassName(rdd))
-
val parentIds = rdd.dependencies.map(_.rdd.id)
-
new RDDInfo(rdd.id, rddName, rdd.partitions.length,
-
rdd.getStorageLevel, parentIds, rdd.creationSite.shortForm, rdd.scope)
-
}
-
}
根据代码清单3,fromRdd方法的执行步骤如下:
- 获取当前RDD的名称(即name属性)作为RDDInfo的name属性,如果RDD还没有名称,那么调用Utils工具类的getFormattedClassName方法(见附录A)生成RDDInfo的name属性。
- 获取当前RDD依赖的所有父RDD的身份标识作为RDDInfo的parentIds属性。
- 创建RDDInfo对象。