05-RDD五大特性

这篇具有很好参考价值的文章主要介绍了05-RDD五大特性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RDD简介

A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. Represents an immutable,

partitioned collection of elements that can be operated on in parallel.

RDD(Resilient Distributed Dataset)即弹性分布式数据集,是一个容错的、并行的数据结构,是Spark中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性的、不可变可分区、里面的元素可并行计算的集合。

  • 弹性
    • 存储的弹性:内存与磁盘的自动切换;
    • 容错的弹性:数据丢失可以自动恢复;
    • 计算的弹性:计算出错重试机制;
    • 分片的弹性:可根据需要重新分片。
  • 分布式:数据存储在大数据集群不同节点上
  • 数据集:RDD封装了计算逻辑,并不保存数据
  • 数据抽象:RDD是一个抽象类,需要子类具体实现
  • 不可变 immutable:RDD封装了计算逻辑,是不可以改变的,想要改变,只能产生新的RDD,在新的RDD里面封装计算逻辑
  • 可分区 partitioned:RDD中的数据被划分为很多部分,每部分称为分区 partition
  • 并行计算 parallel:RDD中的数据可以被并行计算的处理,每个分区的数据被一个Task处理

类比:

​ RDD的数据处理方式类似于IO流,也有装饰者设计模式

​ RDD的数据只有在调用行动算子(例如,collect())时,才会真正执行业务逻辑操作。

​ RDD是不保存数据的,但是IO可以临时保存一部分数据

可以认为RDD是分布式的列表List或数组Array,抽象的数据结构,RDD是一个抽象类Abstract

Class和泛型Generic Type:

// RDD类声明
abstract class RDD[T: ClassTag](
    @transient private var _sc: SparkContext,
    @transient private var deps: Seq[Dependency[_]]
  ) extends Serializable with Logging {

RDD将Spark的底层的细节都隐藏起来(自动容错、位置感知、任务调度执行,失败重试等), 让开发者可以像操作本地集合一样以函数式编程的方式操作RDD这个分布式数据集,进行各种并行计算,RDD中很多处理数据函数与列表List中相同与类似。

RDD五大特征

RDD 数据结构内部有五个特性(摘录RDD 源码):

Internally, each RDD is characterized by five main properties:

  - A list of partitions
  - A function for computing each split
  - A list of dependencies on other RDDs
  - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
  - Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)

前三个特征每个RDD都具备的,后两个特征可选的。

A list of partitions

  • 分区列表(a list of partitions)
  • 每个RDD被分为多个分区(partitions),这些分区运行在集群中的不同节点,每个分区都会被一个计算任务处理,分区数决定了并行数的数量
  • 创建RDD时可以指定RRD分区的个数。如果不指定分区数量,当RDD从集合创建时,默认分区数量为该程序所分配到的资源的CPU核数(每个Core可以承载2~4个Partition),如果是从HDFS文件创建,默认为文件的Block数。
/**
* Implemented by subclasses to return the set of partitions in this RDD. This method will only
* be called once, so it is safe to implement a time-consuming computation in it.
*
* The partitions in this array must satisfy the following property:
*   `rdd.partitions.zipWithIndex.forall { case (partition, index) => partition.index == index }`
*/
protected def getPartitions: Array[Partition]

A function for computing each split

  • 每个分区都有一个计算函数(A function for computing each split):一个函数会被作用在每一个分区
  • Spark的RDD的计算函数是以分片为基本单位的,每个RDD都会实现compute函数,对具体的分片进行计算。
  • 简单来说,Spark在计算时,是使用分区函数对每一个分区进行计算
/**
 * :: DeveloperApi ::
 * Implemented by subclasses to compute a given partition.
 */
@DeveloperApi
def compute(split: Partition, context: TaskContext): Iterator[T]

A list of dependencies on other RDDs

一个RDD会依赖于其他多个RDD(A list of dependencies on other RDDs)

RDD是计算模型的封装,当需求中需要将多个计算模型进行组合时,就需要将多个RDD建立依赖关系。

RDD的每次转换都会生成新的RDD,所以RDD之间会形成类似于流水线一样的前后依赖关系在部分分区数据丢失时,Spark可通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所以分区进行重新计算。(Spark的容错机制)

/**
 * Implemented by subclasses to return how this RDD depends on parent RDDs. This method will only
 * be called once, so it is safe to implement a time-consuming computation in it.
 */
protected def getDependencies: Seq[Dependency[_]] = deps

Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)

(Key,Value)数据类型的RDD分区器(a Partitioner for Key-Value RDDs)

当前Spark中实现了两种类型的分区函数,一个是基于哈希的 HashPartitioner,另外一个是基于范围的 RangePartitioner

只有对于(Key,Value)的RDD,才会有Partitioner(分区),非于(Key,Value)的RDD的Partitioner 的值是None。

Partitioner函数不但决定了RDD本身的分区数量,也决定了parent RDD Shuffle 输出时的分区数量。

注意:只要K-V类型的数据才存在分区器的概念

/** Optionally overridden by subclasses to specify how they are partitioned. */
@transient val partitioner: Option[Partitioner] = None

Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)

每个分区都有一个优先位置列表(a list of perferred locations to compute each split on)

优先位置列表会存储每个Partition的优先位置

对于一个HDFS文件来说,就是每个Partition块的位置。

按照 “移动数据不如移动计算” 的理念,Spark在进行任务调度时,会尽可能地将计算任务分配到其所要处理数据块的存储位置。(数据本地性)

简单来说,就是判断计算发送到哪个节点,效率最优,数据移动不如移动计算

/**
 * Optionally overridden by subclasses to specify placement preferences.
 */
protected def getPreferredLocations(split: Partition): Seq[String] = Nil

RDD 是一个数据集的表示,不仅表示了数据集,还表示了这个数据集从哪来、如何计算,主要属性包括五个方面(必须牢记,通过编码加深理解,面试常问):

  • 数据集怎么来的:
    • 计算函数
    • 依赖关系
  • 数据集在哪,在哪计算更合适,如何分区:
    • 分区列表
    • 分区函数
    • 最佳位置

RDD 设计的一个重要优势是能够记录 RDD 间的依赖关系,即所谓血统(lineage)。 通过丰富的转移操作(Transformation),可以构建一个复杂的有向无环图,并通过这个图来一步步进行计算。

RDD执行原理

​ 从计算的角度来讲,数据处理过程中需要计算资源(内存 & CPU)和计算模型(逻辑)。执行时,需要将计算资源和计算模型进行协调和整合。

Spark框架在执行时,先申请资源,然后将应用程序的数据处理逻辑分解成一个一个的计算任务。然后将任务发到已经分配资源的计算节点上, 按照指定的计算模型进行数据计算。最后得到计算结果。

RDD是Spark框架中用于数据处理的核心模型,下面是在Yarn环境中,RDD的工作原理:

  • ​ 1)启动Yarn集群环境
  • ​ 2)Spark通过申请资源创建调度节点和计算节点
  • ​ 3)Spark框架根据需求将计算逻辑根据分区划分成不同的任务
  • ​ 4)调度节点将任务根据计算节点状态发送到对应的计算节点进行计算

从以上流程可以看出RDD在整个流程中主要用于将逻辑进行封装,并生成Task发送给Executor节点执行计算文章来源地址https://www.toymoban.com/news/detail-698129.html

到了这里,关于05-RDD五大特性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Spark 【RDD编程(一)RDD编程基础】

            在Spark中,RDD是弹性分布式数据集(Resilient Distributed Dataset)的缩写。通俗来讲,RDD是一种抽象的数据结构,用于表示分布式计算中的数据集合。它是Spark中最基本的数据模型,可以看作是一个不可变的、可分区、可并行处理的数据集合。这个数据集的全部或部分可

    2024年02月09日
    浏览(11)
  • 【Spark】RDD转换算子

    【Spark】RDD转换算子

    目录 map mapPartitions mapPartitionsWithIndex flatMap glom groupBy shuffle filter sample distinct coalesce repartition sortBy ByKey intersection union subtract zip partitionBy reduceByKey groupByKey reduceByKey 和 groupByKey 的区别 aggregateByKey foldByKey combineByKey reduceByKey、foldByKey、aggregateByKey、combineByKey 的区别 join leftOuterJoin

    2024年02月12日
    浏览(14)
  • Spark RDD 缓存机制

    Spark RDD 缓存是在内存存储RDD计算结果的一种优化技术。把中间结果缓存起来以便在需要的时候重复使用,这样才能有效减轻计算压力,提升运算性能。 当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的partition持久化到内存中,并且在之后对该RDD的反复使用中,直接

    2024年03月25日
    浏览(7)
  • Spark---RDD依赖关系

    Spark---RDD依赖关系

    1.1 RDD依赖关系 在Spark中,一个RDD的形成依赖于另一个RDD,则称这两个RDD具有依赖关系(一般指相邻的两个RDD之间的关系) ,RDD的依赖关系对于优化Spark应用程序的性能和可靠性非常重要。通过合理地设计RDD的转换和动作操作,可以避免不必要的Shuffle操作,提高计算效率。 words的

    2024年01月19日
    浏览(12)
  • SPARK-RDD

    分区列表 RDD 数据结构中存在分区列表,用于执行任务时并行计算,是实现分布式计算的重要属性。 分区计算函数 Spark 在计算时,是使用分区函数对每一个分区进行计算 RDD之间的依赖关系 RDD 是计算模型的封装,当需求中需要将多个计算模型进行组合时,就需要将多个 RDD 建

    2024年02月04日
    浏览(11)
  • Spark核心--RDD介绍

    rdd  弹性分布式数据集  是spark框架自己封装的数据类型,用来管理内存数据 数据集: rdd数据的格式  类似Python中 []     。 hive中的 该结构[] 叫 数组 rdd提供算子(方法)  方便开发人员进行调用计算数据 在pysaprk中本质是定义一个rdd类型用来管理和计算内存数据 分布式 : r

    2024年01月16日
    浏览(19)
  • Spark---RDD序列化

    Spark---RDD序列化

    1 什么是序列化 序列化是指 将对象的状态信息转换为可以存储或传输的形式的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。 以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 2.RDD中的闭包检查 从计算的角度, 算子以外的代码

    2024年01月25日
    浏览(12)
  • 【Spark练习】RDD分区操作

    【Spark练习】RDD分区操作

    2.1 textFile 对于textFile而言,如果 没有在方法中指定分区数 ,则sc.defaultMinPartitions默认为 min(defaultParallelism,2) ,其中,defaultParallelism对应的就是spark.default.parallelism,如果是从HDFS中读取文件,则分区数为文件分片数(比如,128MB/片) rdd的分区数 = max(本地file的分片数, sc.default

    2024年02月02日
    浏览(10)
  • Spark-RDD详解

    RDD 弹性分布式数据集合 是Spark中的一种数据类型,管理spark的内存数据 [1,2,3,4] spark中还有dataframe,dataset类型 拓展:开发中可以通过类的形式自定以数据类型 同时还提供各种计算方法 弹性 可以对海量数据根据需求分成多份(分区),每一份数据会有对应的task线程执行计算

    2024年01月22日
    浏览(38)
  • Spark RDD编程基本操作

    Spark RDD编程基本操作

    RDD是Spark的核心概念,它是一个只读的、可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,可在多次计算间重用。Spark用Scala语言实现了RDD的API,程序员可以通过调用API实现对RDD的各种操作,从而实现各种复杂的应用。 Spark采用textFile()方法来从文件系统中加

    2024年02月06日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包