1. RDD的实现

  • 作业调度

当对RDD执行“转换操作”时,调度器(DGAScheduler)会根据RDD的血统来构建由若干调度阶段(State)组成的有向无环图(DAG),每个调度阶段包含尽可能多的连续“窄依赖”转换。调度器按照有向无环图顺序进行计算,并最终得到目标RDD。

调度器(TaskScheduler)向各节点分配任务采用延时调度机制并根据数据存储位置来确定(数据本地性:移动计算而非移动数据)。若一个任务需要处理的某个分区刚好存储在某个节点的内存中,则该任务会分配给该节点;如果在内存中不包含该分区,调度器会找到包含该RDD的最佳位置,并把任务分配给所在节点。

  • 内存管理

Spark从大的方向上提供了两种持久化RDD的存储策略:一是存在内存中;二是存储在磁盘中。

对于内存使用LRU回收算法来进行管理,当计算得到一个新的RDD分区,但没有足够空间来存储时,系统会从最近最少使用的RDD中回收其一个分区的空间。除非该RDD是新分区对应的RDD,这种情况下Spark会将旧的分区继续保留在内存中,防止同一个RDD的分区被循环调入和调出。这点很关键,因为大部分的操作会在一个RDD的所有分区上进行,那么很有可能已经存在内存中的分区将再次被使用。

  • 检查点支持

虽然血统可以用于错误后RDD的恢复,但是对于很长的血统的RDD来说,这样的恢复耗时比较长,因此需要通过检查点操作保存到外部存储中。

Spark提供为RDD设置检查点操作的API,可以让用户自行决定需要为哪些数据设置检查点操作。另外由于RDD的只读特性,使得不需要关心数据一致性问题。

2. RDD编程接口

Spark中提供了通用接口来抽象每个RDD,这些接口包括:

  1. 分区信息:它们是数据集的最小分片。
  2. 依赖关系:指向其父RDD。
  3. 函数:基于父RDD计算方法。
  4. 划分策略和数据位置的元数据。
  • RDD分区-partitions

一个RDD划分成很多的分区(partition)分布在集群的节点中,分区的多少涉及对这个RDD进行并行计算的粒度。在RDD操作中用户可以使用partitions方法获取RDD划分的分区数,当然用户也可以设定分区数目。如果没有指定将使用默认值,而默认数值是该程序所分配到CPU核数,如果是从HDFS文件创建,默认为文件的block数(有一点我们必须要注意,当我们显示的设置分区数时,分区数不允许小于HDFS文件的block数)。

/ 使用textFile方法获取指定路径的文件,未设置分区数
val rdd = sc.textFile("/app/spark/workcount.txt")
// 使用partitions方法获取分区数,假设默认的分区数为2,那么将返回2
val partitionSize = rdd.partitions.size// 显示地设置RDD为6个分区
rdd = sc.textFile("/app/spark/wordcount.txt", 6)
// 获取分区数,此时返回6
partitionSize = rdd.partitions.size
  • RDD首选位置(preferred locations)

在Spark形成任务有向无环图(DAG)时,会尽可能地把计算分配到靠近数据的位置,减少数据网络传输。当RDD产生的时候存在首选位置,如HadoopRDD分区的首选位置就是HDFS块所在的节点。当RDD分区被缓存,则计算应该发送到缓存分区所在的节点进行,再不然回溯RDD的血统,一直找到具有首选位置属性的父RDD,并据此决定子RDD的位置。

  • RDD依赖关系

在RDD中将依赖关系分成了两种类型:窄依赖(Narrow Dependencies)和宽依赖(Wide Dependencies)。其中窄依赖是指每个父RDD的分区都至多被一个子RDD的分区使用,而宽依赖是多个子RDD的分区依赖一个父RDD分区。 这两种依赖的区别从两个方面来说比较有用。第一:窄依赖允许在单个集群节点上流水线式执行,这个节点可以计算所有父级分区。相反,宽依赖需要所有的父RDD数据可用,并且数据已经通过Shuffle完成。第二:在窄依赖中,节点的恢复更加高效,因为只有丢失的父级分区需要重新计算,并且这些丢失的父级分区可以并行地在不同节点上重新计算。相反,在宽依赖的继承关系中,单个失败的节点可能导致一个RDD的所有先祖RDD中的一些分区丢失,导致计算的重新执行。

[scala-spark]8. RDD的实现和编程接口相关推荐

  1. 10.Spark之RDD及编程接口

    2019独角兽企业重金招聘Python工程师标准>>> 1.起点Hello World val sc = new SparkContext("spark://...&quo ...

  2. 第二章 Spark RDD以及编程接口

    第二章 Spark RDD以及编程接口 目录 Spark程序"Hello World" Spark RDD 创建操作 转换操作 控制操作 行动操作 注:学习<Spark大数据 ...

  3. Spark RDD 论文详解(三)Spark 编程接口

    前言 本文隶属于专栏<1000个问题搞定大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见1000个问题搞定大数据技 ...

  4. Spark:RDD编程总结(概述、算子、分区、共享变量)

    目录 1.RDD概述 1.1.RDD是什么 1.2.RDD的弹性 1.3.RDD的特点 1.3.1.分区 1.3.2.只读 1.3.3.依赖 1.3.4.缓存 1.3.5.检查点 2.RDD编程 2. ...

  5. 【Spark】RDD入门编程实践(完整版)

    文章目录 1 RDD创建 1.1 从文件系统中加载数据 1.2 通过并行集合 2 RDD的操作 2.1 转换 2.1.1 filter 2.1.2 map 2.1.3 flatMap 2.1.4 gr ...

  6. Spark的RDD序列化

    RDD序列化 1. 闭包检查 从计算的角度, 算子以外的代码都是在Driver 端执行, 算子里面的代码都是在 Executor端执行.那么在 scala 的函数式编程中,就会导致算子内经常会用到算子 ...

  7. Spark累加器实现原理及基础编程

    Spark累加器实现原理及基础编程 实现原理 累加器用来把 Executor 端变量信息聚合到 Driver 端.在 Driver 程序中定义的变量,在Executor 端的每个 Task 都会得到这 ...

  8. Spark之RDD理论篇

    Spark的基石RDD: RDD与MapReduce Spark的编程模型是弹性分布式数据集(Resilient Distributed Dataset,RDD),它是MapReduce的扩展和延申, ...

  9. Spark 基础 —— RDD(一)

    1. Spark 为 RDD 提供的成员函数 .stats():包括(count:计数,mean:均值,stdev:标准差,max:最大,min:最小值) countByValue:执行统计计数 根据 ...

最新文章

  1. 中国顶级 AI 研究者数量仅为美国 1/5:美国智库最新全球 AI 实力报告
  2. Centos升级python
  3. Python 技术篇-用PIL库修改图片透明度实例演示,改变png图片色道为RGBA、RGB
  4. Python代码发送post请求接口测试--转载
  5. pythonc语言结构_C语言结构体笔记
  6. [大数据之Yarn]——资源调度浅学
  7. docker yum 安装
  8. 报表控件NCreport教程:子查询系统设计
  9. Java 原生 PCM 格式文件转 WAV
  10. 电脑播放SACD-ISO/DSD/DFF音乐
  11. 色彩搭配原理与技巧?
  12. IDEA连接kerberos环境的HDFS集群报错整理
  13. mysql undo表空间_MySQL 8.0.2起UNDO表空间管理更灵活
  14. 游戏项目开发的简单流程
  15. 2022年游戏出海行业研究报告
  16. 计算机在识别图像时“看到”了什么?
  17. 解决新版微信个人收款二维码在H5网页里不能长按识别支付
  18. ABAP HANA BP主数据批导
  19. Silvaco TCAD 2018在Windows系统的安装教程
  20. html5在线客服源码 websocket c#实现,可扩展 im 即时通讯 完整的源代码,在线聊天

热门文章

  1. C++走向远洋——26(项目二,2,构造函数与析构函数)
  2. Android测试中被测应用挂了怎么办?
  3. Oracle 游标使用全解
  4. POJ 3255 Roadblocks 次短路
  5. 屌丝程序员的返京历险记
  6. 树的更多相关算法-3
  7. hdu 4991(树状数组优化dp)
  8. #define 和 const 区别
  9. nyoj239月老的难题
  10. Python获取控制台输入