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 graph | Task threads |
Scheduler | Block manager |
Block tracker | … |
Shuffle tracker | … |
- Spark Driver 和 Spark Executor之间通过Cluster manager进行控制
5.3 角度3
RDDObjects | DAGScheduler | TaskScheduler | Worker |
---|---|---|---|
build operator DAG | split graph into stages of tasks | launch tasks via cluster manager | execute tasks |
… | submit each stage as ready | retry failed or straggling tasks | store 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学习教材及实战资料