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