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阶段划分的作用?
  1. spark会产生DAG图
  2. DAG图会基于分区和宽窄依赖关系划分阶段
  3. 一个阶段的内部都是窄依赖, 窄依赖内, 如果形成前后1:1的分区对应关系, 就可以产生许多内存迭代计算的管道
  4. 这些内存迭代计算的管道, 就是一个个具体的执行Task
  5. 一个Task事一个具体的线程, 任务跑在一个线程内, 就是走内存计算了

面试题2:

  1. spark的算子丰富, MapReduce算子匮乏, MapReduce这个编程模型, 很难在一套MR种处理复杂的任务, 很多的复杂任务, 事需要写多个MapReduce进行串联, 多个MR串联通过磁盘交互数据
  2. spark可以执行内存迭代, 算子之间形成DAG基于依赖划分阶段后, 再阶段内形成内存迭代管道, 但是MapReduce的Map和Reduce之间的交互依旧事通过磁盘来交互的
posted @ 2022-01-25 15:31  帅爆太阳的男人  阅读(92)  评论(0编辑  收藏  举报