[scala-spark]8. RDD的实现和编程接口
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,这些接口包括:
- 分区信息:它们是数据集的最小分片。
- 依赖关系:指向其父RDD。
- 函数:基于父RDD计算方法。
- 划分策略和数据位置的元数据。
- 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的实现和编程接口相关推荐
- 10.Spark之RDD及编程接口
2019独角兽企业重金招聘Python工程师标准>>> 1.起点Hello World val sc = new SparkContext("spark://...&quo ...
- 第二章 Spark RDD以及编程接口
第二章 Spark RDD以及编程接口 目录 Spark程序"Hello World" Spark RDD 创建操作 转换操作 控制操作 行动操作 注:学习<Spark大数据 ...
- Spark RDD 论文详解(三)Spark 编程接口
前言 本文隶属于专栏<1000个问题搞定大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见1000个问题搞定大数据技 ...
- 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. ...
- 【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 ...
- Spark的RDD序列化
RDD序列化 1. 闭包检查 从计算的角度, 算子以外的代码都是在Driver 端执行, 算子里面的代码都是在 Executor端执行.那么在 scala 的函数式编程中,就会导致算子内经常会用到算子 ...
- Spark累加器实现原理及基础编程
Spark累加器实现原理及基础编程 实现原理 累加器用来把 Executor 端变量信息聚合到 Driver 端.在 Driver 程序中定义的变量,在Executor 端的每个 Task 都会得到这 ...
- Spark之RDD理论篇
Spark的基石RDD: RDD与MapReduce Spark的编程模型是弹性分布式数据集(Resilient Distributed Dataset,RDD),它是MapReduce的扩展和延申, ...
- Spark 基础 —— RDD(一)
1. Spark 为 RDD 提供的成员函数 .stats():包括(count:计数,mean:均值,stdev:标准差,max:最大,min:最小值) countByValue:执行统计计数 根据 ...
最新文章
- 中国顶级 AI 研究者数量仅为美国 1/5:美国智库最新全球 AI 实力报告
- Centos升级python
- Python 技术篇-用PIL库修改图片透明度实例演示,改变png图片色道为RGBA、RGB
- Python代码发送post请求接口测试--转载
- pythonc语言结构_C语言结构体笔记
- [大数据之Yarn]——资源调度浅学
- docker yum 安装
- 报表控件NCreport教程:子查询系统设计
- Java 原生 PCM 格式文件转 WAV
- 电脑播放SACD-ISO/DSD/DFF音乐
- 色彩搭配原理与技巧?
- IDEA连接kerberos环境的HDFS集群报错整理
- mysql undo表空间_MySQL 8.0.2起UNDO表空间管理更灵活
- 游戏项目开发的简单流程
- 2022年游戏出海行业研究报告
- 计算机在识别图像时“看到”了什么?
- 解决新版微信个人收款二维码在H5网页里不能长按识别支付
- ABAP HANA BP主数据批导
- Silvaco TCAD 2018在Windows系统的安装教程
- html5在线客服源码 websocket c#实现,可扩展 im 即时通讯 完整的源代码,在线聊天