Spark中各种组件、概念之间具备一定的数量关系,本篇博文主要整理一下这些内容,并且从弹性、分布式、数据集这三个方面来解释RDD的概念。
目录
一、Spark数量关系
1. 分区数 Partition
(1)内存数据:
如果指定分区数量,就会使用指定的数量(setMaster("local[*]"));如果没有指定数量,会采取分区算法;
(2)文件数据:
文件源码底层与Hadoop有关,遵循Hadoop文件切片规则。
2. 阶段数量 Stage
Stage产生的标志是shuffle依赖(宽依赖),并且一定有一个resultStage阶段;
所以阶段数量 = 1 + shuffle依赖个数。
3. 任务数量 Task
map阶段:一个分区Partition对应一个任务Task,分区数决定了任务数量;
reduce阶段:默认情况下,分区数来自于上一个阶段,也可以自行配置,任务数取决于分区数。
4. Executor数量
一个worker中可以启动多个Executor;(Yarn模式下Executor在Container中)
启动应用程序时,依据参数total-executor-cores来指定。
5. 并行度数量
并行度指所有Executor可以同时执行的Task数,
每个Executor中的一个Core(线程,虚拟核数)同时只能执行一个Task,
所以最大并行度 = Executor数量 * 每个Executor的Core数;
eg:资源配置10个Executor节点,每个节点2个Core,那么同一时间可以并行计算的task数为20,
如果RDD有100个分区,那么需要5轮计算完毕,
如果RDD有2个分区,那么计算时只使用2个Core,其余18个Core空转,浪费资源,
所以Spark调优中会通过增大RDD分区数,增大任务并行度来提高效率。
二、RDD的概念剖析
RDD:Resilient Distributed Datasets弹性分布式数据集
它的特点:只读、分区、血缘、缓存、checkpoint
1. 弹性
RDD数据计算基于内存,但是会和文件联合使用,RDD数据的来源和存储可以是内存也可以是文件;
RDD分区是弹性的;
RDD具备容错性:
(1)可以通过RDDs的血缘关系进行回溯;
(2)如果Stage出错,可以通过DAG来重试;如果Task出错,任务也支持重试机制;
(3)Cache(memory不切断血缘、不安全) & CheckPoint(保存到持久化系统中、切断血缘、安全)
2. 分布式
RDD数据可以存放在分布式系统中,例如hadoop的HDFS;
另外RDD的数据计算也是分布式的,在多个Worker节点的多个Executor中分布式并行计算;
3. 数据集
RDD中存在分区,而分区是一种数据结构,所以RDD可以理解为数据集