@[TOC](文章目录)
#RDD的算子的分类
Transformation: 即转换算子,调用转换算子会生成一个新的RDD, Transformation是 Lazy 的,不会触发job执行
Action: 行动算子,调用行动算子会触发job执行, 本质上是调用了sc.runJob方法, 该方法从最后一个RDD,根据
其依赖关系,从后往前,划分Stage,生成一个TaskSet
1.创建RDD的方法
(1)通过并行化方式,将Dirver端的集合转成RDD ,可以指定分区的数量
val rdd: RDD[Int] = sc.parallelize(arr)
rdd.partitions.length //查看分区数量
(2)从HDFS指定目录创建RDD ,也可以指定分区的数量
val lines: RDD[String] = sc.textFile("hdfs://linux01:8020/log")
rdd.partitions.length //查看分区数量
(2.1)从hdfs中读取数据分区数量 : 默认情况下 目录文件下所有文件的 totalSize(文件总大小)/NumSplits (切片数量) 得到 goalSize()
使用 文件大小/goalSize 结果大于1.1 就分为多个切片.
如果想要几个block块(文件)就有几个分区, 在创建rdd时指定计算goalSize的除数为1就可以了
val rdd1 = sc.textFile("hdfs://linux01:8020/wc",1)
#DAG 有向无环图
是对多个RDD转换过程和依赖关系的描述
触发Action就会形成一个完整的DAG,一个DAG就是一个Job
#shuffle
概念:需要通过网络将数据传输到多台机器,数据被打散,但是有网络传输,不一定就有shuffle
上游RDD的一个分区将数据给了下游RDD的多个分区,即是shuffle,需要注意的是,shuffle过程是下游的Task到上游拉取数据,不是上游Task发送给下游的
shuffle的功能是将具有一定规律的数据按照指定的分区器的分区规则,通过网络,传输到指定的一台机器的一个分区中即Task中
#strage
任务执行阶段
一个Stage对应一个TaskSet,有shuffle的时候就会划分Stage
一个TaskSet中的Task的数量取决于Stage中最后一个RDD分区的数量
Stage分为两种,第一种ShuffleMapStage:里面对应的Task叫ShuffleMapTask, 第二种ResultStage:里面对应的Task叫ResultTask(一定会产生结果)
#dependency
依赖关系,指的是父RDD和子RDD之间的依赖关系
窄依赖:没有shfuffle产生,多个算子会被合并到一个Task中,即在一个pipeline中
宽依赖:有shuffle产生,是划分Stage的依据
#JOB
Dirver向Executor提交的作业
触发一次Action形成一个完整的DAG,一个DAG对应一个job
一个job中有一到多个Stage,一个Stage对应一个TaskSet,一个TaskSet中有一到多个Task
#Task
spark中任务最小的执行单元
task分类两种 ShuffleMapTask(一定会有shuffleWrite) ResultTask(一个job中一定会有一个)
Task起始就是类的实例,有属性(从哪里读数据) 有方法(如何计算)
Task的数量决定并行,同时也要考虑可用额度cores
#TaskSet
保存同一种计算逻辑多份Task集合
一个TaskSet中的task计算逻辑都一样,计算的数据不一样
一个stage对应一个taskSet