《Spark Streaming实时流式大数据处理实战》 ——3.2 RDD存储结构

举报
华章计算机 发表于 2020/02/22 14:59:44 2020/02/22
【摘要】 本节书摘来自华章计算机《Spark Streaming实时流式大数据处理实战》 —— 书中第3章,第3.2节,作者是肖力涛 。

3.2  RDD存储结构

  RDD实现的数据结构核心是一个五元组,如表3.1所示。

表3.1  RDD实现的数据结构核心

image.png

  

  //RDD中的依赖关系由一个Seq数据集来记录,这里使用Seq的原因是经常取第一个元素或者遍历

  protected def getDependencies: Seq[Dependency[_]] = deps

  

  // 分区列表定义在一个数组中,这里使用Array的原因是随时使用下标来访问分区内容

  // @transient分区列表不需要被序列化

  protected def getPartitions: Array[Partition]

  

  // 接口定义,具体由子类实现,对输入的RDD分区进行计算

  def compute(split: Partition, context: TaskContext): Iterator[T]

  

  // 分区器

  // 可选,子类可以重写以指定新的分区方式,Spark支持Hash和Range两种分区方式 @transient

    val partitioner: Option[Partitioner] = None

  

  // 可选,子类可以指定分区的位置,如HadoopRDD可以重写此方法,让分区尽可能与数据在

    相同的节点上

  protected def getPreferredLocations(split: Partition): Seq[String] = Nil

  

  RDD设计的一个重要优势是能够记录RDD间的依赖关系,即所谓血统(lineage)。我们通过丰富的转移操作(Transformation),可以构建一个复杂的有向无环图,并通过这个图来一步步进行计算。RDD的这5个核心属性(见表3.1)起到了非常关键的作用,并且由Spark设计之初一直保存到现在。

  在讲解RDD属性时,我们多次提到了分区(partition)的概念。分区是一个偏物理层的概念,也是RDD并行计算的核心。数据在RDD内部被切分为多个子集合,每个子集合可以被认为是一个分区,我们的运算逻辑最小会被应用在每一个分区上,每个分区是由一个单独的任务(task)来运行的,所以分区数越多,整个应用的并行度也会越高。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。