Spark 个人实战系列(2)--Spark 服务脚本分析

前言:

  spark最近非常的火热, 本文不讲spark原理, 而是研究spark集群搭建和服务的脚本是如何编写的, 管中窥豹, 希望从运行脚本的角度去理解spark集群. 研究的spark为1.0.1版. spark集群采用standalone模式搭建, 其基础架构为master-slave(worker模式, 单master+多slave(worker)节点构成.

脚本目录
Spark 个人实战系列(2)--Spark 服务脚本分析
start-all.sh 作用: 启动整个集群
stop-all.sh 作用: 关闭整个集群
start-master.sh 作用: 启动master节点
stop-master 作用: 关闭master节点
start-slaves.sh 作用: 启动整个集群的slave节点
start-slave.sh 作用: 启动单节点slave

总体脚本的依赖关系图如下:

Spark 个人实战系列(2)--Spark 服务脚本分析

*) 分析脚本start-all.sh

# Load the Spark configuration

. "$sbin/spark-config.sh"

# Start Master

"$sbin"/start-master.sh $TACHYON_STR

# Start Workers

"$sbin"/start-slaves.sh $TACHYON_STR

评注:
# 1. 载入执行spark-config.sh
# 2. 启动Master节点
# 3. 启动各个slave(worker)节点

*) 先来研究下sbin/spark-config.sh脚本

export SPARK_PREFIX=`dirname "$this"`/..

export SPARK_HOME=${SPARK_PREFIX}

export SPARK_CONF_DIR="$SPARK_HOME/conf"

评注:
# spark-config.sh的作用是常用的环境变量SPARK_HOME, SPARK_CONF_DIR的导出

*) 脚本start-master.sh分析

. "$sbin/spark-config.sh" 

. "$SPARK_PREFIX/bin/load-spark-env.sh"



"$sbin"/spark-daemon.sh start org.apache.spark.deploy.master.Master 1 \

	--ip $SPARK_MASTER_IP --port $SPARK_MASTER_PORT \

	--webui-port $SPARK_MASTER_WEBUI_PORT

评注:
# source spark-config.sh, load-spark-env.sh之后
# 借助spark-daemon.sh脚本, 启动Master服务, 并传入相关的参数, Master绑定IP/Port, 以及webui的端口

*) 对load-spark-env.sh脚本进行解读

if [ -z "$SPARK_ENV_LOADED" ]; then

  export SPARK_ENV_LOADED=1

  # Returns the parent of the directory this script lives in.

  parent_dir="$(cd `dirname $0`/..; pwd)"

  use_conf_dir=${SPARK_CONF_DIR:-"$parent_dir/conf"}

  if [ -f "${use_conf_dir}/spark-env.sh" ]; then

    # Promote all variable declarations to environment (exported) variables

    set -a

    . "${use_conf_dir}/spark-env.sh"

    set +a

  fi

fi

评注:
# 很重要的一步是导入了conf/spark-env.sh, 把用户自定义的变量参数全部生效,替换默认值

*) 对start-slaves.sh的解析

# Launch the slaves

if [ "$SPARK_WORKER_INSTANCES" = "" ]; then

  exec "$sbin/slaves.sh" cd "$SPARK_HOME" \; "$sbin/start-slave.sh" 1 spark://$SPARK_MASTER_IP:$SPARK_MASTER_PORT

else

  if [ "$SPARK_WORKER_WEBUI_PORT" = "" ]; then

    SPARK_WORKER_WEBUI_PORT=8081

  fi

  for ((i=0; i<$SPARK_WORKER_INSTANCES; i++)); do

    "$sbin/slaves.sh" cd "$SPARK_HOME" \; "$sbin/start-slave.sh" $(( $i + 1 )) \

	    spark://$SPARK_MASTER_IP:$SPARK_MASTER_PORT \

	    --webui-port $(( $SPARK_WORKER_WEBUI_PORT + $i ))

  done

fi

评注:
# $SPARK_WORKER_INSTANCES指定单机运行多个slave(worker)进程数
# 具体流程, 每个worker实例执行sbin/slaves.sh, 该脚本的执行参数是执行"sbin/start-slave.sh", 同时每个slave(worker)节点都指定了自己的WEB UI端口

*) sbin/slaves.sh

. "$SPARK_PREFIX/bin/load-spark-env.sh"



if [ "$HOSTLIST" = "" ]; then

  if [ "$SPARK_SLAVES" = "" ]; then

    export HOSTLIST="${SPARK_CONF_DIR}/slaves"

  else

    export HOSTLIST="${SPARK_SLAVES}"

  fi

fi



# By default disable strict host key checking

if [ "$SPARK_SSH_OPTS" = "" ]; then

  SPARK_SSH_OPTS="-o StrictHostKeyChecking=no"

fi



for slave in `cat "$HOSTLIST"|sed "s/#.*$//;/^$/d"`; do

  ssh $SPARK_SSH_OPTS $slave $"${@// /\\ }" \

    2>&1 | sed "s/^/$slave: /" &

  if [ "$SPARK_SLAVE_SLEEP" != "" ]; then

    sleep $SPARK_SLAVE_SLEEP

  fi

done

评注:
# sbin/slaves.sh脚本, 载入了conf/slaves文件(配置slaves节点), 详见上一篇
# 同时为每个slave节点执行
# sbin/start-slave.sh $(( $i + 1 )) spark://$SPARK_MASTER_IP:$SPARK_MASTER_PORT \
#      --webui-port $(( $SPARK_WORKER_WEBUI_PORT + $i ))

*) sbin/start-slave.sh脚本解析

"$sbin"/spark-daemon.sh start org.apache.spark.deploy.worker.Worker "$@"

评注:
# 借助spark-daemon.sh, 运行org.apache.spark.deploy.worker.Worker即可

*) sbin/spark-daemon.sh脚本分析
spark-daemon.sh 脚本最后还是借助bin/spark-class来实现, 对jvm参数进行了设定

 

你可能感兴趣的:(spark)