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. 学习 lind api 十月 第一弹

    step one 我们来看一下代码的结构

  2. .net core之编辑json配置文件

    .net core之编辑json配置文件 引言 最近在具体项目开发应用中,项目采用的json格式配置文件,配置文件的加载采用的IConfiguration接口对象进行的管理,这是.net standa ...

  3. C#数字图像处理(十四)击中击不中变换 (Hit-miss)

    击中击不中变换定义 击中击不中变换(HMT)需要两个结构元素B1和B2,合成一个结构元素对B=(B1,B2) 一个用于探测图像内部,作为击中部分;另一个用于探测图像外部,作为击不中部分.显然,B1和B ...

  4. linux 命令全名

    su:Swith user  切换用户,切换到root用户cat: Concatenate  串联uname: Unix name  系统名称df: Disk free  空余硬盘du: Disk u ...

  5. Horizontal Pod Autoscaler(Pod水平自动伸缩)

    Horizontal Pod Autoscaler 根据观察到的CPU利用率(或在支持自定义指标的情况下,根据其他一些应用程序提供的指标)自动伸缩 replication controller, de ...

  6. DOCKER 学习笔记8 Docker Swarm 集群搭建

    前言 在前面的文章中,已经介绍如何在本地通过Docker Machine 创建虚拟Docker 主机,以及也可以在本地Windows 创建虚拟主机,也是可以使用的.这一节,我们将继续学习 Docker ...

  7. 接口自动化CSV文件生成超长随机字符串--java接口方法

    public class STR { private static String Builderrud(int a){ StringBuilder builder= new StringBuilder ...

  8. POJ_2342_树状dp

    http://poj.org/problem?id=2342 第一道树状dp,入门题,用vector构建有向图. #include<iostream> #include<cstrin ...

  9. symfony传参,接收参数,twig方法记录

    呜呜呜,很烦,让我自己完成一个在线学习系统后端,和前端整合一下,我把接口参数搞了半天(学习symfony太久远),记录一下屈辱历史,以后注意,不然上线了一堆bug,很烦 下面是几种返回的数据的格式 1 ...

  10. OpenCV3入门(九)图像几何变换

    1.图像缩放 假设图像x轴的缩放因子Sx, y轴方向的缩放因子Sy,相应的变换表达式为: 函数原型为: CV_EXPORTS_W void resize( InputArray src, Output ...