概述
在我们编写 Spark Application 的的过程中,会涉及到很多概念,下面会介绍一些基本概念用于更好地理解 Spark 的设计以及应用开发。
RDD(Resillent Distributed Dataset)
弹性数据集。它是 Spark 的基本数据结构,Spark 中的所有数据都是通过 RDD 的形式进行组织。RDD 是不可变的数据集合,不可变的意思是 RDD 中的每个分区数据是只读的。RDD 数据集是要做逻辑分区的,每个分区可以单独在集群节点进行计算。
DAG(Directed Acycle Graph)
有向无环图。在图论中,如果一个有向图无法从有一个定点出发经过若干条边回到该点,则这个图是有向无环图。Spark 中用 DAG 来表示 RDD 之间的血缘关系。
NarrowDependency
窄依赖,子 RDD 依赖于父 RDD 中固定的 Partition。NarrowDependency 分为 OneToOneDependency 和 RangeDependency。
ShuffleDependency
Shuffle 依赖,也称作宽依赖,子 RDD 可能对父 RDD 中所有的 Partition 都有依赖。子 RDD 对父 RDD 各个 Partition 的依赖取决于分区计算器(Partitioner)的算法。
Job
所谓一个 Job,就是由一个 RDD 的 action 触发的动作,可以简单的理解为,当你需要执行一个 RDD 的 action 的时候,会生成一个 job。
Stage
Stage 是一个 Job 的组成单位,就是说,一个 Job 会被切分成 1 个或多个的 Stage,然后各个 Stage 会按照执行顺序依次执行。至于 Job 根据什么标准来切分 Stage,可以简单理解为按照是否需要 shuffle 来划分 stage。当一个操作需要 shuffle 时,Spark 就会将其划分为一个 Stage。具体细节后续会有文章单独介绍。
Task
Task 是 Spark 的执行单元,每个 Stage 都会包含一个或者一组 Task。一般来说,数据有多少个 partition 就会有多少个 Task。
Partition
Partition 类似 Hadoop 的 Split,是数据的一种划分方式,计算以 Partition 为单位进行的。Partition 的划分依据有很多,也可以自己定义。例如 HDFS 的文件的划分方式就是按照 HDFS Block 大小来划分的。
Shuffle
Shuffle 是 Spark Application 中一个非常重要的阶段。Shuffle 用于打通 map task(在 Spark 称为 ShuffleMapTask)的输出与 reduce task 的任务(在 Spark 中就是 ResultTask)的输入,map task 的输出结果按照指定的分区策略分配给某一个分区的 reduce task。