• 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
      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参数进行了设定

  • 相关阅读:
    Linux中find常见用法示例
    PHP写的异步高并发服务器,基于libevent
    Prototype原型模式
    抽象工厂模式
    工厂方法模式
    简单工厂模式
    记一次皮肤过敏
    Thread类线程结束会唤醒使用其对象做锁而睡眠的线程
    位运算符
    逻辑运算符
  • 原文地址:https://www.cnblogs.com/mumuxinfei/p/3848696.html
Copyright © 2020-2023  润新知