1、在一个完整的数据转换流程里往往涉及到多个具有衍生关系RDD,这些RDD其实是通过逻辑串联来利用装饰器模式层层包装扩展的的一堆对象,这些相邻RDD间必须有继承关系。并且比Java中的装饰器来的更彻底,借助Scala的抽象控制特性,这一系列RDD不代表任何实际数据,也不负责装载数据,描述的是纯粹的逻辑抽象DAG,只有调用了尾函数后才会触发逻辑DAG的执行。

2、弹性:分别表现在如下几个方面
血缘:可以使用cache、checkpoint等机制灵活改变血缘继承关系。
计算:计算时可以灵活的使用内存和磁盘(早期shuffle无磁盘参与,存在性能瓶颈和OOM风险,后期加入)。
分区:在创建RDD和转换过程中可以灵活的调整数据分区。
容错:利用checkpoint持久化机制,可以在流程不同点位实现容错。

3、分布式,可分区,每个分区发可以分配不同的Executor,实现对数据的并行计算。对于集合数据,用户可以利用并行度来指定分区大小,对于内容不可预知的文件数据,用户只能指定最小并行度,具体分多少区,由分区算法决定,Spark-RDD底层使用的是Hadoop的分区算法。

4、不可变,RDD类底层实现中没有向用户暴露修改的API,所以用户无法直接修改源RDD的内容,要实现数据在逻辑上的改变,就只能通过转换操作来实现,且转换结果必须是新的RDD对象。

5、迁移数据不如移动计算的位置,移动数据涉及网络IO,其成本往往较高,所以尽量让计算逻辑从本地取数据。所以Spark在分配任务时,优先将任务分配到源数据分片所在的节点上。
为了实现负载均衡,当某些Executor进程空闲下来后,首先会从进程本地获取数据,如果不成功就会从本机上其他Executor进程获取数据,如果仍拿不到,就会从本机架上的其他机器的Executor获取数据,最后才会从其他机架的机器上获取数据,总之就是一最小的IO代价为原则,从最近的地方获取数据。

6、算子:人类解决问题的思维模式一般是渐进式的,也就是从问题的初始局面到被解决的整个过程通常是被多步分解的,每个步骤的推进伴随着问题状态的改变,要改变问题的状态就需要做相应的操作,这些操作就统称为Operator即
算子。一个算子可以由一个命令、命令组合、函数、函数组合构成。所有的RDD方法都是算子,它们又可以分为做转换的TransformationOperator和促发计算的ActionOperator。

7、在一个Spark用户作业程序中,创建SparkContext对象所在的类的实例化对象,被称之为Driver对象。程序里只有算子中直接参与计算的代码才会被分配到Executor上去执行,负责真实数据的计算,其他部分【包括flatMap算子】均在Driver中执行。如rdd.flatMap(it => it * 2);这段代码,只有it * 2这段代码才承载着真正的计算逻辑,所以只有它会被分配到Executor上去执行。

8、创建:
1.从集合创建:sc.makeRDD(0 to 10, 4)
2.从别的RDD创建:RDD2 = RDD1.map()
3.从外部文件读取:sc.textFile("/opt/data/text.txt")

9、RDD.map、RDD.mapPartitions、RDD.mapPartitionsWithIndex三个算子的区别:
1.RDD.map(it => it * 2):会根据集合中元素的数量N,map算子在Driver中执行N次,也会分发真实计算逻辑task【it * 2】到Executor N次,会额外增加分发开销
2.RDD.mapPartitions(dataList => {dataList.foreach( { _ * 2 }):dataList代表的是一个分区上的所有数据元素的集合,会根据数据分区数量P,mapPartitions算子在Driver中执行P次,计算逻辑【 {dataList.foreach( { _ * 2 }】会分发到Executor P次,各个Executor上的真实计算逻辑执行次数与对应分片上的数据集元素个数相同,最终计算逻辑执行的总次数还是等于整个RDD元素的数量N。这样可以大大减少了计算逻辑分发的次数,由于分发过程涉及进程间通信,而进程间通信比内存中通信至少慢三个数量级,所以更高效。
但是也存在一个严重风险,在一个Executor上,一个算子的计算逻辑对一个分区数据的处理,执行持续的时间是以整个分区处理时间为生命周期,如果分区中数据源源不断地增加,整个处理过程就可能持续很久,程序对数据的引用一直没有断开,GC无法回收已处理数据占用的内存,对内存的占用势必不断增加,可能引发OOM。
3.RDD.mapPartitionsWithIndex{
case(pId, dataList) => {
dataList.map((_, "pId=" + pId))
}
在计算和性能上与mapPartitions算子是一样的,但它可以拿到分区的序号。

10、RDD分区与任务的分配:一个partition上的数只能由一个task来消费,通常一个分区就对应一个task,适当增加RDD分区数量能提高App的并行度,每个task可以灵活的分配到Executor上去执行。【与Flink类似,operator是DAG层面的东西,构成DAG的节点,属于逻辑执行计划。而task则属于物理执行计划,是operator在具体计算环境下的真实执行体,一个operator可能拥有代表其逻辑的多个task作为分身在集群中执行】

11、当上游RDD的一个分区中的元素被分散到多个下游RDD分区(宽依赖),必然经过Shuffle操作。如果上游分区中的元素以汇聚的形式流向下游分区,亦即保证了来自同一个上游分区的所有元素,到达下游RDD时仍然能团结在一个下游分区中就不会发生shuffle,此时下游有效分区数不会超过上游分区数。
***
12、一个SparkContext代表着一个App,执行流程每遇到一个Action算子形成一个新Job,在每个Job内每遇到一次Shuffle操作形成一个新Stage,在一个Stage中可以包含流水线的一或多个算子,这些算子形成OperatorChain,系统根据Stage中最后一个RDD的分区数N,并依照OperatorChain的计算逻辑建立N个Task。
在范围上大致关系:App > Job > Stage > Task,从左至右范围依次减小,呈现一对多的关系。

Spark之RDD本质的更多相关文章

  1. Spark操作算子本质-RDD的容错

    Spark操作算子本质-RDD的容错spark模式1.standalone master 资源调度 worker2.yarn resourcemanager 资源调度 nodemanager在一个集群 ...

  2. spark中RDD的转化操作和行动操作

    本文主要是讲解spark里RDD的基础操作.RDD是spark特有的数据模型,谈到RDD就会提到什么弹性分布式数据集,什么有向无环图,本文暂时不去展开这些高深概念,在阅读本文时候,大家可以就把RDD当 ...

  3. [转]Spark学习之路 (三)Spark之RDD

    Spark学习之路 (三)Spark之RDD   https://www.cnblogs.com/qingyunzong/p/8899715.html 目录 一.RDD的概述 1.1 什么是RDD? ...

  4. Spark学习之路 (三)Spark之RDD

    一.RDD的概述 1.1 什么是RDD? RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素 ...

  5. Spark之 RDD

    简介 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行计算的集合. Resilien ...

  6. Spark之RDD的定义及五大特性

    RDD是分布式内存的一个抽象概念,是一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,能横跨集群所有节点并行计算,是一种基于工作集的应用抽象. RDD底层存储原理:其数据分布存储于多台机器上 ...

  7. Spark 中 RDD的运行机制

    1. RDD 的设计与运行原理 Spark 的核心是建立在统一的抽象 RDD 之上,基于 RDD 的转换和行动操作使得 Spark 的各个组件可以无缝进行集成,从而在同一个应用程序中完成大数据计算任务 ...

  8. Spark之RDD

    Spark学习之路Spark之RDD 目录 一.RDD的概述 1.1 什么是RDD? RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数 ...

  9. Spark RDD :Spark API--Spark RDD

    一.RDD的概述 1.1 什么是RDD? RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素 ...

随机推荐

  1. [洛谷P4617] [COCI2017-2018#5] Planinarenje

    Description \(Mirko\) 和 \(Slavko\) 喜欢一起去远足. \(Mirko\) 偏好攀登山峰,而 \(Slavko\) 偏爱山谷.因此每次他们登上一座山峰后,\(Slavk ...

  2. TypeScript 源码详细解读(4)语法1-语法树

    在上一节介绍了标记的解析,就相当于识别了一句话里有哪些词语,接下来就是把这些词语组成完整的句子,即拼装标记为语法树. 树(tree) 树是计算机数据结构里的专业术语.就像一个学校有很多年级,每个年级下 ...

  3. 隐隐约约 听 RazorEngine 在 那里 据说 生成代码 很 美。

    这只是 一个开始 ....

  4. [ Python入门教程 ] Python中JSON模块基本使用方法

    JSON (JavaScript Object Notation)是一种使用广泛的轻量数据格式,Python标准库中的json模块提供了一种简单的方法来编码和解码JSON格式的数据.用于完成字符串和p ...

  5. widows 10 下解决在npm install python 环境报错的问题

    1.使用管理员打开cmd 2.安装 node-gyp; gyp是一种根据c++源代码编译的工具,node-gyp就是为node编译c++扩展的时候使用的编译工具. npm install -g nod ...

  6. 几种常见的排序方法总结(Python)

    几种常见的排序算法总结(Python) 排序算法:是一种能将一串数据依照特定顺序进行排序的一种算法. 稳定性:稳定排序算法会让原本有相等键值的记录维持相对次序.也就是如果一个排序算法是稳定的,当有两个 ...

  7. GPU与CPU

    GPU与CPU CPU CPU,也就是中央处理器,结构主要包括控制器(指挥各部分工作).运算器(实现数据加工).寄存器.高缓以及数据/控制/状态总线.计算机的性能很大程度上依赖于CPU,CPU的功能包 ...

  8. mac安装了anaconda但是在终端不能使用conda命令

    只需在终端输入如下命令即可 export PATH=~/anaconda3/bin:$PATH

  9. IDEA更换banner(娱乐专用)

    1.佛祖保佑 永无bug _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / ...

  10. spring源码系列(二):IOC接口设计分析

    这里主要对springIOC接口体系进行简单的概述和分析,具体每个接口详细分析在下面目录: 参考内容: <Spring技术内幕:深入解析 Spring架构与设计原理> 和 <Spri ...