spark---RDD
RDD
分布式计算需要:
- 分区控制
- Shuffle控制
- 数据存储\序列化\发送
- 数据计算API
- 等一系列功能
这些功能, 不能简单的通过python内置的本地集合对象(如List\字典等)去完成, 我们在分布式框架中, 需要有一个统一的数据抽象对象, 来实现上述分布式计算所需要功能, 这个抽象对象, 就是RDD.
RDD定义:
- RDD叫做弹性分布式数据集, 是spark中最基本的数据抽象, 代表一个不可变, 可分区, 里面元素可并行计算的集合
- Dataset: 一个数据集合, 用于存放数据的,
- Distributed: RDD中的数据是分布式存储的, 可用于分布式计算(RDD的数据是跨越机器存储的)
- Resilient: RDD中的数据可以存储在内存中或者磁盘中
RDD的五大特性:
- RDD是又分区的
- 计算方法都会作用到每一个分片(分区)之上
- RDD之间是有相互依赖的
- K,V型RDD可以有分区器
- RDD分区数据的读取会尽量靠近数据所在地(计算向数据移动)
RDD算子:
- 算子: 分布式集合对象上的API称之为算子
- 方法\函数: 本地对象的API,叫做算子
算子分类
- Transformation: 转换算子
- 定义: RDD的算子, 返回值仍旧事一个RDD, 称之为转换算子
- 特性: 这类算子事lazy 懒加载的, 如果没有action算子, Transformtion算子是不工作的
- Action: 动作(行动)算子
- 定义: 返回值不适RDD的就是action算子
DAG:
- 有方向,没有闭环的流程图
- 一个Action会产生一个job(一个应用程序的子任务), 每个job有各自的DAG图
宽窄依赖
- 窄依赖: 父RDD的一个分区, 全部将数据发给子RDD的一个分区
- 宽依赖: 父RDD的一个分区, 全部将数据发给子RDD的多个分区
阶段划分:
- 从后向前, 遇到宽依赖, 就划分出一个阶段, 称之为stage
内存计算管道:
弹性分布数据集
- RDD是spark最基本的抽象,是对分布式内存的抽象使用,实现了以操作本地集合的方式来操作分布式数据集的抽象实现, RDD是spark最核心的东西,它表示已被区分,不可变的并能够被并行操作的数据集合,不同的数据集格式对应不同的RDD实现,RDD必须是可序列化的,RDD可疑cache到内存中,每次对RDD数据集的操作之后的结果, 都可以存放到内存中,下一个操作可疑直接从内存中获取,省去了MapReduce大量的磁盘IO操作,这对于迭代运算比较常见的及其学习算法,交互数据挖掘来说,效率提升比较大.
面试题1:
- spark事怎么做内存计算的?DAG的作用?stage阶段划分的作用?
- spark会产生DAG图
- DAG图会基于分区和宽窄依赖关系划分阶段
- 一个阶段的内部都是窄依赖, 窄依赖内, 如果形成前后1:1的分区对应关系, 就可以产生许多内存迭代计算的管道
- 这些内存迭代计算的管道, 就是一个个具体的执行Task
- 一个Task事一个具体的线程, 任务跑在一个线程内, 就是走内存计算了
面试题2:
- spark的算子丰富, MapReduce算子匮乏, MapReduce这个编程模型, 很难在一套MR种处理复杂的任务, 很多的复杂任务, 事需要写多个MapReduce进行串联, 多个MR串联通过磁盘交互数据
- spark可以执行内存迭代, 算子之间形成DAG基于依赖划分阶段后, 再阶段内形成内存迭代管道, 但是MapReduce的Map和Reduce之间的交互依旧事通过磁盘来交互的