Spark-Core源码学习记录
该系列作为Spark源码回顾学习的记录,旨在捋清Spark分发程序运行的机制和流程,对部分关键源码进行追踪,争取做到知其所以然,对枝节部分源码仅进行文字说明,不深入下钻,避免混淆主干内容。
本文为Spark源码系列的开篇,主要内容包括对集群启动相关脚本的流程分析。
Spark配置文件
本文以官方的spark安装方式为基础,CDH及其他版本可自行查阅相关配置文件位置。
$SPARK_HOME/conf/
├── log4j.properties.template
├── slaves
├── spark-defaults.conf
└── spark-env.sh
在 spark-defaults.conf和 spark-env.sh 中配置了一些默认属性,在slaves中配置了 worker的hostname。
Spark启动脚本
$SPARK_HOME/sbin/ $SPARK_HOME/bin/
├── start-all.sh ├── spark-class
├── spark-config.sh ├── spark-shell
├── start-master.sh ├── spark-submit
├── spark-daemon.sh
├── start-slaves.sh
└── start-slave.sh
首先来看 start-all.sh 内容,仅仅是加载 spark-config.sh 的内容,同时分别调用 start-master.sh 和 start-slaves.sh 。
#!/usr/bin/env bash
if [ -z "${SPARK_HOME}" ]; then
export SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi
# Load the Spark configuration
. "${SPARK_HOME}/sbin/spark-config.sh"
# Start Master
"${SPARK_HOME}/sbin"/start-master.sh
# Start Workers
"${SPARK_HOME}/sbin"/start-slaves.sh
先来看 start-master.sh 的内容,可以看到就是调用 spark-daemon.sh,并传入一些参数,关键参数为CLASS
。
#!/usr/bin/env bash 省略部分源码,仅保留主干内容
# NOTE: This exact class name is matched downstream by SparkSubmit.
# Any changes need to be reflected there.
CLASS="org.apache.spark.deploy.master.Master"
# 默认初始化端口 SPARK_MASTER_PORT=7077 #SPARK_MASTER_WEBUI_PORT=8080
# SPARK_MASTER_HOST="`hostname -f`"
"${SPARK_HOME}/sbin"/spark-daemon.sh start $CLASS 1 \
--host $SPARK_MASTER_HOST --port $SPARK_MASTER_PORT --webui-port $SPARK_MASTER_WEBUI_PORT \
$ORIGINAL_ARGS
进入 spark-daemon.sh,可以看到最终将所有参数传递给了"${SPARK_HOME}"/bin/spark-class
,daemon脚本内部会区别submit和start及stop等不同操作,作为一个统一的入口。根据注释# Runs a Spark command as a daemon.
可以知道作为一个daemon(守护线程)来运行。
#!/usr/bin/env bash 仅保留部分关键逻辑代码
# Runs a Spark command as a daemon.
option=$1 #option等于上面代码传入的第一个参数start
case $option in
(submit)
run_command submit "$@"
(start) #匹配到此处
run_command class "$@"
run_command() {
mode="$1" #mode=class
case "$mode" in
(class)
execute_command nice -n "$SPARK_NICENESS" "${SPARK_HOME}"/bin/spark-class "$command" "$@"
(submit)
execute_command nice -n "$SPARK_NICENESS" bash "${SPARK_HOME}"/bin/spark-submit --class "$command" "$@"
}
下面查看/bin/spark-class
内容,简单来看最终就是运行了java -Xmx128m -cp $PATH org.apache.spar