二、Spark RDD介绍

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

    • DAGScheduler构建Stage
    • 记录哪个RDD或者Stage输出被物化
    • 将TaskSet传给底层调度器
      • spark-cluster TaskScheduler
      • yarn-cluster YarnClusterScheduler
      • yarn-client YarnClientClusterScheduler
  • 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的是运算结果本身):
      • 结果足够小,这直接放在内存

扫码关注公众号

  • 后台回复“Spark学习资料”免费获取更多Spark学习教材及实战资料
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会给你解答关于Spark RDD实现次排序的问题。 首先,对于次排序(Secondary Sort),我们需要根据两个维度来对数据进行排序,比如要按照学生的学号(第一维)和成绩(第维)进行排序。在Spark,可以使用sortByKey函数对数据进行排序,但默认只能按照一个维度排序。 为了实现次排序,我们需要借助Scala的Tuple(元组)类型,将学生的学号和成绩组成一个元组,作为RDD的元素。然后,我们可以通过对元组进行比较,实现次排序的效果。 下面是一个Scala实现次排序的示例代码: ```scala // 生成包含元组的RDD val data = sc.parallelize(Seq( (1, 85), (2, 92), (3, 76), (1, 90), (2, 88), (3, 80) )) // 按照第一维升序、第维降序排序 val sortedData = data .sortByKey() // 按照第一维升序排序 .map(_.swap) // 交换元组的顺序,变成(成绩, 学号) .sortByKey(false) // 按照第维降序排序 .map(_.swap) // 再次交换元组的顺序,变成(学号, 成绩) // 输出排序结果 sortedData.foreach(println) ``` 在以上示例代码,我们首先生成一个包含元组的RDD,其第一维为学号,第维为成绩。然后,我们先按照第一维升序排序,再交换元组的顺序,变成(成绩, 学号),再按照第维降序排序,最后再次交换元组的顺序,得到最终的排序结果。 这就是Spark RDD实现次排序的基本方法,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值