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
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




