您的位置:首页 > 其它

Spark 任务调度之Submit Driver

2017-04-01 15:50 127 查看

概要

本篇博客是Spark 任务调度概述详细流程中的第一部分,介绍在Standalone模式下,从命令行使用spark-submit提交任务开始,到将Driver提交到Master的过程。

详细流程

spark-submit提交任务

下面是Spark doc中的一个命令行提交的例子,也是我们分析任务调度的起点



注意,上图中的deploy-mode为cluster,查看spark-submit脚本内容



spark-submit中调用shell spark-class,spark-class中对Java环境变量等做了校验,最后一行处,调用exec执行命令,如下



下图是exec执行的具体命令,图中红色竖线内的部分是SPARK_ASSEMBLY_JAR,这段命令使用java -cp运行SparkSubmit中main方法,后面的参数就是命令行传入的参数,SparkSubmit类所属的jar包就在SPARK_ASSEMBLY_JAR中



org.apache.spark.deploy.SparkSubmit

shell中调用了SparkSubmit的main函数,main函数主要逻辑在处理传入的配置信息并设置为环境变量(Driver、RestSubmissionClient或Client通过环境变量读取此配置)、使用类加载器加载配置的jar等,当deploy-mode为cluster时,会借助于RestSubmissionClientClient提交Driver,如下



然后使用反射,启动childMainClass,如下(三段单独代码)







deploy-mode为client时,上面的childMainClass为用户自己编写的Main函数,即Driver启动在执行spark-submit命令的节点。最后SparkSubmit中主要逻辑如下



org.apache.spark.deploy.Client

如SparkSubmit中最后的流程图所示,我们选择其中的Client这条执行路径,SparkSubmit使用反射运行Client的main方法,Client的main方法先处理传入的参数(和SparkSubmit中处理参数相似),然后创建RpcEnv对象,如下



如上图注释所示,ClientEndpoint的onStart发送消息给Master,注册Driver,如下



接下来看下Driver信息的格式,如下



上图中信息除了command外均容易理解,查看Command的内容



如上图注释,Spark使用DriverWrapper启动用户APP的main函数,而不是直接启动,这是为了Driver程序和启动Driver的Worker程序共命运(源码注释中称为share fate),即如果此Worker挂了,对应的Driver也会停止。至此,Client提交Driver流程结束了。

Master处理RequestSubmitDriver消息

Master的receiveAndReply方法接收Client发送的消息RequestSubmitDriver,将收到的Driver注册到waitingDrivers,如下



总结

介绍了deploy-mode=cluster模式下,从命令行提交任务,到Master端接收并注册Driver的过程,完整流程如下

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息