首页 > 代码库 > Spark 个人实战系列(2)--Spark 服务脚本分析

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

前言:

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

脚本目录

start-all.sh 作用: 启动整个集群
stop-all.sh 作用: 关闭整个集群
start-master.sh 作用: 启动master节点
stop-master 作用: 关闭master节点
start-slaves.sh 作用: 启动整个集群的slave节点
start-slave.sh 作用: 启动单节点slave

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

*) 分析脚本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  fifi

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

*) 对start-slaves.sh的解析

# Launch the slavesif [ "$SPARK_WORKER_INSTANCES" = "" ]; then  exec "$sbin/slaves.sh" cd "$SPARK_HOME" \; "$sbin/start-slave.sh" 1 spark://$SPARK_MASTER_IP:$SPARK_MASTER_PORTelse  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 ))  donefi

评注:
# $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}"  fifi# By default disable strict host key checkingif [ "$SPARK_SSH_OPTS" = "" ]; then  SPARK_SSH_OPTS="-o StrictHostKeyChecking=no"fifor 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  fidone

评注:
# 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参数进行了设定