大数据之spark_spark的执行流程简介及初始Task数量的生成规则

spark的执行流程简介

1.类加载,通过反射调用指定类的main方法
2.创建SparkContext,跟Master通信,申请资源
3.Master跟Worker进行通信启动Executor
4.启动Eexcutor,并创建线程池
5.Executor向Driver反向注册
(前5步完成准备工作)
6.创建原始的RDD.例如textFile()
7.调用RDD中的Transformations算子
8.调用RDD中的Action算子,Action中会调用sc.runJob方法
9.构建DAG,根据shuffle切分stage,生成TaskSet
10.通过TaskScheduler将Task序列化,然后通过网络发送给Executor
(6-10步都是在Driver端构建完成的,都是构建的逻辑,还未开始真正的运算)
11.Executor接收到Task后进行反序列化,然后用实现了Runable的包装类包装一层,最后提交到线程池进行运算

注意:spark运算时,读取和运算运算数据都是以迭代器的形式,边读边运算,每读取一条就运算一条,类似于工厂的流水线作业,所以这种运算方式又称之为流式运算,最后当处理的文件达到一定大小或全部处理完了之后再写出到hdfs中(或进行shuffle到下阶段运算)

大数据之spark_spark的执行流程简介及初始Task数量的生成规则

初始分区数量及Task数量分析

首先分区的数量是Driver端在进行任务切分的时候,按切分的数量所决定的分区数量的,然后初始分区数量又决定了初始Task的数量,产生shuffle时,可以重新指定Task的数量,如果不指定,就默认按上游的Task数量重新分同等数量的区

那么初始的任务切分是按何种规则切分的呢?
首先按文件个数切分,当文件大小不足128M的时候,每个文件都会切分成一个分区,但是当众多文件中出现文件大小出现严重倾斜的情况,就会导致某个Task的执行速度变慢,影响整个任务执行的速度,此时spark会按一定的规则将这个大文件切分成多个分区,切分规则如下:
当我们使用textFile(“文件路径”)读取某个路径下的文件时,实际上该方法的括号内有第二个隐藏的参数,我们可以选择写或不写,不写的时候默认值为2,写的时候至少要大于等于1,该参数是切分的最小分区数,当我们只有一个文件时,就至少分成两个区,当我们有多个文件时,会按以下公式计算分区:
以默认最小分区数设置为2为例
首先用所有文件总大小 / 最小分区数 得到一个平均数
然后每个文件用它自己的文件大小 / 这个平均数 如果小于1.1,该文件就为一个区,如果大于1.1,就将该文件分成2个区(第一个区的偏移量为0-平均数大小,第二个区的偏移量为平均数大小到文件大小)
最后加总所有文件运算出来的分区结果,就是总分区数,也就是初始的Task数