IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Spark之RDD的五大特性 -> 正文阅读

[大数据]Spark之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),Spark中的基本抽象。表示不可变的,分区的可以并行操作的元素集合。

解释:

  • RDD是Resilient Distributed Dataset(弹性分布式数据集)的简称。RDD的弹性体现在计算方面,当Spark进行计算时,某一阶段出现数据丢失或者故障,可以通过RDD的血缘关系就行修复。

    ? ? ? ? ? ?1、内存的弹性:内存与磁盘的自动切换

    ????????????2、容错的弹性:数据丢失可以自动恢复

    ????????????3、计算的弹性:计算出错重试机制

    ????????????4、分片的弹性:根据需要重新分片?

  • RDD是不可变(immutable)的,一旦创建就不可改变。RDDA-->RDDB,RDDA经过转换操作变成RDDB,这两个RDD具有血缘关系,但是是两个不同的RDD,体现了RDD一旦创建就不可变的性质。
//RDD源码
abstract class RDD[T: ClassTag](
    @transient private var _sc: SparkContext,
    @transient private var deps: Seq[Dependency[_]]
  ) extends Serializable with Logging {...}

详情查看官网https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/rdd/RDD.scala

解读
1)抽象类(abstract):不能直接使用,需要借助于子类实现,使用时直接使用其子类即可

2)序列化:在分布式计算框架里,序列化框架性能的好坏直接影响整个框架性能的优劣

3)logging:日志记录,2.0版本后不自带,需要自己写一个

4)T:泛型 支持各种数据类型

5)sparkcontext

6)@transient

二、RDD的5大特点官网定义

解释:?

1)A list of partitions

RDD由很多partition构成,在spark中,计算式,有多少partition就对应有多少个task来执行,一个分区在一台机器上,一个分区其实就是放在一台机器的内存上, ?一台机器上可以有多个分区,?户可以在创建RDD时指定RDD的分?个数,如果没有指定,那么就会采?默认值。默认值就是程序所 分配到的CPU Core的数?。


2)A function for computing each split
? ?对RDD做计算,相当于对RDD的每个split或partition做计算,就是?个计算每个分区的函数。SparkRDD的计算是以分?为单位的,每个RDD都会实现compute函数以达到这个?的。compute函数会对迭代器进?复合,不需要保存每次计算的结果。

3)A list of dependencies on other RDDs
? ?RDD之间有依赖关系,可溯源 ?eg:rdd1.map(_*10).flatMap(..).map(..).reduceByKey(...)?????构建成为DAG,这个DAG会构造成很多个阶段,这些阶段叫做stage,RDDstage之间会有依赖关系,后面根据前面的依赖关系来构建,如果前面的数据丢了,?????它会记住前面的依赖,Spark可以通过这个依赖关系重新计算丢失的分区数据,?不是对RDD的所有分区进?重新计算。每一个算子都会产生新的RDD.?????textFile 与flatMap会产生两个RDD.?????spark中的DAG就是rdd内部的转换关系,这些转换关系会被转换成依赖关系,进而被划分成不同阶段,从而描绘出任务的先后顺序。?

?4 )a partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)

?个 Partitioner ,即 RDD 的分?函数。当前 Spark 中实现了两种类型的分?函数,?个是基于哈希的 HashPartitioner,另外?个是基于范围的 RangePartitioner 。只有对于 key-value RDD ,才会有 Partitioner,? key-value RDD Parititioner 的值是 None Partitioner 函数不但决定了 RDD 本身的分? 数量,也决定了parent RDD Shuffle 输出时的分?数量。也是分区器,决定数据落在哪个分区

????????????????????????????????????????????-?????????????????????????????????????

5 ) a list of locations to compute each split?on (e.g. locations for an HDFS file) ? ?

最优的位置去计算,也就是数据的本地性
????????计算每个分区时,在分区所在机器的本地上运行task是最好的,避免了数据的移动;分区有多个副本,所以preferred location不止一个数据在哪里,应优先把作业调度到数据所在机器上,减少数据的IO和网络传输,这样才能更好地减少作业运行时间(木桶原理:作业运行时间取决于运行最慢的task所需的时间),提高性能,不过数据进行最后汇总的时候就要走网络。(hdfs file的block块)

就是移动数据不如移动计算的理念,移动数据增加时间,不如移动计算方式到数据的节点计算

三、RDD5大特性在源码中的体现

特性1:getPartitions返回的必然是一系列Partition类型的数据组成的数组

/**
   * 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]

特性2:compute函数的入参必然是partition,因为对RDD做计算相当于对每个partition做计算

/**
   * :: DeveloperApi ::
   * Implemented by subclasses to compute a given partition.
   */
  @DeveloperApi
def compute(split: Partition, context: TaskContext): Iterator[T]

?特性3:RDD之间有依赖关系

 /**
   * 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

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

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

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

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

总结(RDD的五?特征):

  • .RDD可以看做是?些列partition所组成的
  • .RDD之间的依赖关系
  • .算?是作?在partition之上的
  • .分区器是作?在kv形式的RDD
  • .partition提供的最佳计算位置,利于数据处理的本地化即计算向数据移动?不是移动数据
注意 : RDD 本身是不存储数据 , 可以看做 RDD 本身是?个引?数据
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:28:56  更:2021-08-11 12:29:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 15:06:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码