深入理解Spark RDD——RDD信息对象

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://beliefer.blog.csdn.net/article/details/99291781

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

代码清单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)
  }
}

根据代码清单3fromRdd方法的执行步骤如下:

  1. 获取当前RDD的名称(即name属性)作为RDDInfo的name属性,如果RDD还没有名称,那么调用Utils工具类的getFormattedClassName方法(见附录A)生成RDDInfo的name属性。
  2. 获取当前RDD依赖的所有父RDD的身份标识作为RDDInfo的parentIds属性。
  3. 创建RDDInfo对象。
展开阅读全文

没有更多推荐了,返回首页