暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spark的RDD介绍(Spark快速大数据学习笔记)

程序猿小P 2021-05-28
453

1. 什么是RDD

  • RDD(Resilient Distributed Dataset)叫做分布式数据集,是spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。
  • RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。
  • RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大的提升了查询速度。

2. RDD的属性

  • 一组分片(Partition),即数据集的基本组成单位。(某个节点中的具体数据)

    • 对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度。
    • 用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序分配到的CPU Core的数目。
  • 一个计算每个分区的函数

    • Spark中RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到目的。
    • compute函数会对迭代器进行复合,不需要保存每次计算的结果。
  • RDD之间的依赖关系

    • RDD的每次转换都会产生一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系。
    • 在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。
  • 4.一个Partitioner,即RDD的分片函数。

    • 当前Spark中实现了两种类型的分片函数,一个基于哈希的HashPartitioner,另外一个基于范围的RangePartitioner。
    • 只有对于key-value的RDD,才会有Partitioner,非key-value的RDD的Parititioner的值是None.
    • 非key-value的RDD的Partitioner的值是None。Partitioner函数不但决定了RDD本身的分片数量,也决定了parent RDD Shuffle输出时的分片数量。
  • 5.一个列表,存储存取每个Partition的优先位置(preferred location)。

    • 对于一个HDFS文件来说,这个列表保存的就是每个Partition所在的块的位置。
    • 按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置。

3. 总结:RDD五大特性

  • partitions分区
  • compute函数,计算每一个分区的函数
  • RDDs间的依赖关系
  • Partitioner分区函数,注意key-value的区别
  • prefered location 优先位置

4. 宽窄依赖

4.1 窄依赖

  • 子RDD的每个分区依赖于常数个父分区(既与数据规模无关)
  • 结果RDD的分区不变:
map,flatMap

  • 结果RDD的分区发生了变化:
union,coalesce

  • 从输入中选择部分元素的算子
filter,distnct,substract,sample

4.2 宽依赖

  • 子RDD的每个分区依赖于所有的父RDD分区
  • 对单个RDD基于key进行重组和reduce
groupByKey,reduceByKey,

  • 两个RDD或多个RDD基于key进行join或重组,如join,cor

  • Spark Application Stage 的划分算法: 从action 往前走遇到一个宽依赖,就是一个stage,stage从stage0开始

  • Job(作业):包含多个Task组成的并行计算,往往由Spark action催生。

  • Stage(步骤):Job的调度单位,对应于TaskSet

  • TaskSet:一组关联的、相互之间没有shuffle依赖关系的任务组成的任务集。

  • Task: 被送到executor上的工作单元

5.spark运行架构

从下面三个角度看spark运行架构

5.1 角度1

Application:
    - Driver Program
    - executor:
        - Job1
            - Stage1:
              - Task1
              - ...
              - Taskn
            - ...
            - Stagen:
              - Task1
              - ...
              - Taskn
        - ...
        - Jobn
            - Stage1:
              - Task1
              - ...
              - Taskn
            - ...
            - Stagen:
              - Task1
              - ...
              - Taskn

5.2角度2

Spark Driver(app master)Spark Executor
RDD graphTask threads
SchedulerBlock manager
Block tracker...
Shuffle tracker...
  • Spark Driver 和 Spark Executor之间通过Cluster manager进行控制

5.3 角度3

RDDObjectsDAGSchedulerTaskSchedulerWorker
build operator DAGsplit graph into stages of taskslaunch tasks via cluster managerexecute tasks
...submit each stage as readyretry failed or straggling tasksstore and serve blocks
  • DAGScheduler

    • spark-cluster TaskScheduler
    • yarn-cluster YarnClusterScheduler
    • yarn-client YarnClientClusterScheduler
    • DAGScheduler构建Stage
    • 记录哪个RDD或者Stage输出被物化
    • 将TaskSet传给底层调度器
  • TaskScheduler

    • 为每一个TaskSet构建一个TaskSetManager实例管理这个TaskSet的生命周期
    • 数据本地性决定每个Task最佳位置(process-local,node-local,rack-local and then any)
    • 提交taskset(一组task)到集群运行并监控
    • 推测执行,遇到straggle任务需要放到别的节点上重试
    • 出现shuffle输出lost要报告fetch failed错误
  • Task:

    • 结果足够小,这直接放在内存。
    • 两种Task:shuffleMapTask和ResultTask,被执行的task多数都是shuffleMapTask。
    • Resulttask(FinalStage所对应的任务,返回给driver的是运算结果本身):


文章转载自程序猿小P,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论