大数据之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到下阶段运算)

在这里插入图片描述

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值