Spark-submit提交流程

Spark-submit提交流程

    • 代码层面提交
    • Spark-submit提交资源分配

代码层面提交

1.用户传递参数执行spark-submit.sh脚本,查询SPARK_Home是否设置。如果没有设置先执行find-spark-home文件设置,已经设置传递参数 和org.apache.spark.deploy.SparkSubmit类执行spark-class.sh脚本
2.spark-class.sh中检查spark环境变量、java环境变量、spark的jars包路径,加载load-spark-env.sh脚本加载一些环境变量
3.定义build_command()传递参数执行org.apache.spark.launcher.Main
4.Main方法执行获取参数解析,构建SparkSubmitCommandBuilder实例解析构建MainClassOptionParser实例解析,解析参数正常结束否则抛出异常 返回执行结果无误后返回第二步
5.执行org.apache.spark.deploy.SparkSubmit类文件,传递参数main方法执行match判断,调用submit()方法
6.submit()方法通过代理设置执行runmain()方法,runMain()方法通过反射机制执行我们提交的类

Spark-submit提交资源分配

1.启动进程创建SparkContext,SparkContext创建DAGScheduler和TaskScheduler(DAGScheduler划分stage,提交stage会在submitMissingTasks()方法中生成对应Task,而TaskScheduler在启动SparkContext时便已经启动,生成的Tasks会调用SubmitTask()提交)
2.客户端连接master申请application,master接受申请,根据调度算法(FIFO、FAIR)在worker上启动多个executor
3.通知worker启动executor,所有启动好的executor反向注册TaskScheduler,此时资源准备完成结束SparkContext初始化
4.SparkContext开始执行处理业务逻辑,每执行到一个action算子,即创建一个job,并且把job提交给DAGScheduler
5.DAGScheduler将job划分成多个stage,划分依据:宽依赖。每个stage对应一个TaskSet。并提交给TaskScheduler
6.TaskScheduler将task任务,分发到Executor执行

注意:1.调度算法FIFO是先进先出,后面任务等待前面任务执行完在执行; FAIR是公平调度,按照调度池权重来决定任务执行顺序

FAIR公平调度是在公平共享下,spark轮循方式在作业之间分配任务,使得所有job分配相等资源,减少作业等待时间。
还支持将job分组到不同的调度池,并为每个池设置不同的调度选项,相当于设置权重,权重大的优先创建。

stage划分
一般情况下DAGScheduler会根据RDD的依赖关系来划分,RDD的依赖关系分为两种宽依赖和窄依赖:
1.宽依赖:会产生shuffle,有分区的操作,rdd依赖两个及以上rdd会在不同stage,落地磁盘计算
2.窄依赖:不会产生shuffle,无分区操作,rdd依赖一个rdd在同一stage中,基于内存计算

宽依赖算子:sortBy、sortByKey、reduceByKey、join、leftOuterJoin、rightOuterJoin、fullOuterJoin、union、distinct、
cgroup、repartition、zipWithIndex、groupByKey
窄依赖算子:filter、map、flatMap、sampled、mapToPair、intersection、mapPartitionsWithIndex、zip

你可能感兴趣的:(大数据,大数据,spark)