本文结构如下:
- 基本概念
- 基本模块
- 基本架构
一、基本概念
- RDD(Resilient Distributed Datasets):弹性分布式数据集,只读分区记录的集合,Spark 对所处理数据的基本抽象。RDD 是 Spark 分发数据和计算的基础抽象类。一个 RDD 是一个不可改变的分布式集合对象,因此在使用 scala 编写时,前面加修饰符 val 。Spark 中 的计算可以简单抽象为对 RDD 的创建、转换和返回操作结果的过程:
- 创建
通过加载外部物理存储(如HDFS)中的数据集,或 Application 中定义的对象集合(如List)来创建。RDD 在创建后不可被改变,只可以对其执行下面两种操作。 - 转换(Transformation)
对已有的 RDD 中的数据执行计算进行转换,而产生新的 RDD,在这个过程中有时会产生中间 RDD。Spark 对于 Transformation 采用惰性计算机制,遇到 Transformation 时并不会立即计算结果,而是要等遇到 Action 时一起执行。 - 行动(Action)
对已有的 RDD 中的数据执行计算产生结果,将结果返回 Driver 程序或写入到外部物理存储。在 Action 过程中同样有可能生成中间 RDD。
- 创建
- DAG(Directed Acyclic Graph):有向无环图。在图论中,边没有方向的图称为无向图,如果边有方向称为有向图。在无向图的基础上,任何顶点都无法经过若干条边回到该点,则这个图就没有环路,称为有向无环图( DAG 图)。Spark 中使用 DAG 对 RDD 的关系进行建模,描述了 RDD 的依赖关系,这种关系也被称之为 lineage。
- Partition:分区。一个 RDD 在物理上被切分为多个 Partition,即数据分区,这些 Partition 可以分布在不同的节点上。Partition 是 Spark 计算任务的基本处理单位,决定了并行计算的粒度,而 Partition 中的每一条 Record 为基本处理对象。例如对某个 RDD 进行 map 操作,在具体执行时是由多个并行的 Task 对各自分区的每一条记录进行 map 映射。
- NarrowDependency:窄依赖。一个父 RDD 的 partition 最多被子 RDD 中的 partition 使用一次,一父对应一子。NarrowDependency 分为 OneToOneDependency 和 RangeDependency。
- ShuffleDependency(WideDependency):宽依赖。父 RDD