目录
一、Application
二、Job
三、DAG
四、Stage
五、Task
六、TaskSet
七、RDD
八、dependency
九、Shuffle
一、Application
- 使用SparkSubmit提交的个计算应用
- 一个Application中可以触发多次Action,触发一次Action形成一个DAG,一个DAG对应一个Job
- 一个Application中可以有一到多个Job
二、Job
- Driver向Executor提交的作业
- 触发一次Acition形成一个完整的DAG
- 一个DAG对应一个Job
- 一个Job中有多个Stage,一个Stage中有多个Task
三、DAG
- 概念:有向无环图
- 是对多个RDD转换过程和依赖关系的描述
- 触发Action就会形成一个完整的DAG,一个DAG就是一个Job
四、Stage
- 概念:任务执行阶段
- Stage执行是有先后顺序的,先执行前的,在执行后面的
- 一个Stage对应一个TaskSet
- 一个TaskSet中的Task的数量取决于Stage中最后一个RDD分区的数量
五、Task
1. 概念:Spark中任务最小的执行单元
2. Task分类两种
- 2-1) ShuffleMapTask:
- 2-1-1)可以读取各种数据源的读数据;
- 2-1-2)也可以读取shuffle后的数据;
- 3-1-3)专门为shuffle做准备
- 2-2) ResultTask:
- 2-2-1)可以读取各种数据源的读数据;
- 2-2-2)也可以读取shuffle后的数据;
- 2-2-3)专门为了产生计算结果
3. Task其实就是类的实例
- 有属性:从哪里读取数据
- 有方法:如何计算
4. Task的数量决定决定并行,同时也要考虑可用的cores
六、TaskSet
- 保存同一种计算逻辑多个Task的集合
- 一个TaskSet中的Task计算逻辑都一样,计算的数据不一样
七、RDD
1. 概念:分布式、弹性、可容错的抽象数据集
2. 特点
-
2-1) 有多个分区,分区数量决定任务并行数
-
2-1-1) 从HDFS中读取:
- 如果是从HDFS中读取数据,分区的数量由hdfs中数据的输入切片数量决定;
- sc.textFile可以指定rdd的分区数量;
- sc.textFile最小的分区数量为2 ;
- 如果一个大文件,一个小文件,大文件大于小文件的1.1倍,大文件会有2个输入切片 ;
- 当分区的数量大于切片的数量,多个Task可以读取一个输入切片;当分区的数量小于切片的而数量,RDD分区的数量由切切数量决定:
-
2-1-2) 将Driver端集合并行化成RDD
- RDD默认分区的数量由total-executor-cores决定
- 可以在sc.parallelize(arr, 6)指定分区的数量
-
-
2-2) 一个功能函数作用在分区上,函数决定计算逻辑
-
2-3) RDD和RDD存在依赖关系,可以根据依赖关系恢复失败的任务和划分Stage
-
2-4) 如果要发生Shuffle,要使用分区器,默认使用HashPartitioner,分区器决定数据到下游哪个分区
-
2-5) 最优位置,即将Executor调度到数据所在的节点上,要求Worker和DataNode部署在同一节点或OnYarn,通过访问NameNode获取数据块位置信息
3. 到底什么是RDD
- 是一个抽象数据集,RDD中不保存要计算的数据,保存的是元数据,即数据的描述信息和运算逻辑,比如数据要从哪里读取,怎么运算等
- RDD可以认为是一个代理,你对RDD进行操作,相当于在Driver端先是记录下计算的描述信息,然后生成Task,将Task调度到Executor端才执行真正的计算逻辑
八、dependency
- 概念:依赖关系,指的是父RDD和子RDD之间的依赖关系
- 窄依赖:没有shfuffle产生,多个算子会被合并到一个Task中,即在一个pipeline中
- 宽依赖:有shuffle产生,是划分Stage的依据
九、Shuffle
- 概念:需要通过网络将数据传输到多台机器,数据被打散,但是有网络传输,不一定就有shuffle
- 上游RDD的一个分区将数据给了下游RDD的多个分区,即是shuffle,需要注意的是,shuffle过程是下游的Task到上游拉取数据,不是上游Task发送给下游的
- Shuffle的功能是将具相一定规律的数据按照指定的分区器的分区规则,通过网络,传输到指定地一台机器的一个分区中即Task中