spark 2.2 源码分析 Spark-shell 篇

Spark 2.2 任务提交流程
本文详细解析了Spark 2.2版本中任务提交的过程,从spark-shell的启动到spark-submit脚本的使用,再到SparkSubmit类的具体执行流程。

spark 2.2 源码分析 Spark-shell 篇
本文主要剖析了spark的任务提交过程。在用户写完scala脚本后,进行spark-submit的shell脚本的任务提交,其内部的调用原理:
/bin/spark-submit \
  --class org.apache.spark.examples.Helloworld \
  --master spark://207.184.161.138:7077 \
  --executor-memory 20G \
  --total-executor-cores 100 \
如上图 我们的任务一般提交过程如下,可以从源码了解,spark-submit是其启动shell脚本。
spark-shell在/bin目录下,下面简单分析一下spark-shell的启动。
spark-shell--------->spark-submit------------->spark-class
这是spark-shell启动时依次调用的三个shell脚本文件,最终在spark-class脚本里加载主类并执行。
而一般开发过程中,我们精彩会使用spar-submit进行任务的直接的提交。
spark-submit的重要

exec "${SPARK_HOME}"/bin/spark-class org.apache.spark.deploy.SparkSubmit "$@"
其本质是调用了spark-class, spark-class主要是准备JVM环境相关的参数,并最终执行

这个类是真正的执行者,我们好好看看这个真正的入口在哪里?

首先,依然是设置项目主目录:

if [ -z "${SPARK_HOME}" ]; then
  export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi

然后,配置一些环境变量:

. "${SPARK_HOME}"/bin/load-spark-env.sh

在spark-env中设置了assembly相关的信息。

然后寻找java,并赋值给RUNNER变量

# Find the java binary
if [ -n "${JAVA_HOME}" ]; then
  RUNNER="${JAVA_HOME}/bin/java"
else
  if [ `command -v java` ]; then
    RUNNER="java"
  else
    echo "JAVA_HOME is not set" >&2
    exit 1
  fi
fi

中间是一大坨跟assembly相关的内容。

最关键的就是下面这句了:

CMD=()
while IFS= read -d '' -r ARG; do
  CMD+=("$ARG")
done < <("$RUNNER" -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "$@")
exec "${CMD[@]}"

首先循环读取ARG参数,加入到CMD中。然后执行了"$RUNNER" -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "$@这个是真正执行的第一个spark的类。

org.apache.spark.launcher.Main的参考如下


 

1、首先在spark-class中通过Main [class] [classArgs]的方式将SparkSubmit或者Master、Worker以参数的方式传入

2、Main中的main方法获取到spark-class传过来的className,判断是否为SparkSubmit

3、如果是SparkSubmit就通过实例化SparkSubmitCommandBuilder并调用buildCommand方法来创建供spark-class中exec执行的command

4、如果是其他的类(例如Master或者Worker等)就会实例化SparkClassCommandBuilder并调用buildCommand方法来创建供spark-class中exec执行的command

5、3和4生成的command最终都会交给spark-class中的exec来执行,生成具体的进程:根据3生成的command创建的就是SparkSubmit进程,用来提交应用程序;根据4生成的command创建的就是Master、Worker等进程。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值