上节解析了start-master.sh脚本的内容并进行了debug:start-master.sh脚本解析,这节分析spark-daemon.sh脚本的内容并进行debug

1. spark-daemon.sh脚本内容

usage="Usage: spark-daemon.sh [--config <conf-dir>] (start|stop|submit|status) <spark-command> <spark-instance-number> <args...>"# 如果没有提供参数,则打印usage使用说明并中断脚本
if [ $# -le 1 ]; thenecho $usageexit 1
fi# 判断是否配置了SPARK_HOME,如果没有则手动设置
if [ -z "${SPARK_HOME}" ]; thenexport SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi# 通过.加上文件名临时执行spark-config.sh脚本
## 设置SPARK_HOME、SPARK_CONF_DIR以及python的一些环境变量
. "${SPARK_HOME}/sbin/spark-config.sh"# 检查参数中是否包含--config,如果该参数的值不为目录则退出
if [ "$1" == "--config" ]
then# 移除第一个参数shiftconf_dir="$1"if [ ! -d "$conf_dir" ]thenecho "ERROR : $conf_dir is not a directory"echo $usageexit 1elseexport SPARK_CONF_DIR="$conf_dir"fishift
fi# 分别对option、command、instance进行赋值
option=$1
shift
command=$1
shift
instance=$1
shiftspark_rotate_log ()
{log=$1;num=5;if [ -n "$2" ]; thennum=$2fiif [ -f "$log" ]; then # rotate logswhile [ $num -gt 1 ]; doprev=`expr $num - 1`[ -f "$log.$prev" ] && mv "$log.$prev" "$log.$num"num=$prevdonemv "$log" "$log.$num";fi
}# 通过.加上文件名临时执行load-spark-env.sh脚本
## 设置SPARK_HOME、SPARK_SCALA_VERSION环境变量. "${SPARK_HOME}/bin/load-spark-env.sh"if [ "$SPARK_IDENT_STRING" = "" ]; thenexport SPARK_IDENT_STRING="$USER"
fi# 设置SPARK_PRINT_LAUNCH_COMMAND环境变量
export SPARK_PRINT_LAUNCH_COMMAND="1"# 日志相关
if [ "$SPARK_LOG_DIR" = "" ]; thenexport SPARK_LOG_DIR="${SPARK_HOME}/logs"
fi
mkdir -p "$SPARK_LOG_DIR"
touch "$SPARK_LOG_DIR"/.spark_test > /dev/null 2>&1
TEST_LOG_DIR=$?
if [ "${TEST_LOG_DIR}" = "0" ]; thenrm -f "$SPARK_LOG_DIR"/.spark_test
elsechown "$SPARK_IDENT_STRING" "$SPARK_LOG_DIR"
fi# 设置spark进程目录
if [ "$SPARK_PID_DIR" = "" ]; thenSPARK_PID_DIR=/tmp
fi# 定义log和pid变量
log="$SPARK_LOG_DIR/spark-$SPARK_IDENT_STRING-$command-$instance-$HOSTNAME.out"
pid="$SPARK_PID_DIR/spark-$SPARK_IDENT_STRING-$command-$instance.pid"# 设置默认的调度优先级
if [ "$SPARK_NICENESS" = "" ]; thenexport SPARK_NICENESS=0
fi# 该方法
execute_command() {# 看不懂+set是啥意思...不过debug的时候会进这个条件判断if [ -z ${SPARK_NO_DAEMONIZE+set} ]; then# 后台执行脚本命令,此处是获取传入该方法的所有参数,进行运行nohup -- "$@" >> $log 2>&1 < /dev/null &# 获取最新的后台运行的pid,即上条命令所占用的pidnewpid="$!"echo "$newpid" > "$pid"# 共等待5秒来等待上述程序的运行for i in {1..10}doif [[ $(ps -p "$newpid" -o comm=) =~ "java" ]]; thenbreakfisleep 0.5done# 再等待2秒sleep 2# 当程序正常运行时,打印日志if [[ ! $(ps -p "$newpid" -o comm=) =~ "java" ]]; thenecho "failed to launch: $@"tail -2 "$log" | sed 's/^/  /'echo "full log in $log"fielse"$@"fi
}# 该方法主要判断是否能继续进行,并做一些预处理
run_command() {# 获取第一个参数赋值给modemode="$1"shift# 创建进程目录mkdir -p "$SPARK_PID_DIR"# 判断进程文件是否存在,如果存在则给出提示:进程已存在,请先停止if [ -f "$pid" ]; thenTARGET_ID="$(cat "$pid")"if [[ $(ps -p "$TARGET_ID" -o comm=) =~ "java" ]]; thenecho "$command running as process $TARGET_ID.  Stop it first."exit 1fifi# 如果spark_master不为空,则在masters(master高可用的情况)中同步删除部分文件if [ "$SPARK_MASTER" != "" ]; thenecho rsync from "$SPARK_MASTER"rsync -a -e ssh --delete --exclude=.svn --exclude='logs/*' --exclude='contrib/hod/logs/*' "$SPARK_MASTER/" "${SPARK_HOME}"fispark_rotate_log "$log"echo "starting $command, logging to $log"# 使用mode变量进行匹配case "$mode" in(class)# 当变量为class时调用execute_command,传入参数execute_command nice -n "$SPARK_NICENESS" "${SPARK_HOME}"/bin/spark-class "$command" "$@";;(submit)# 当变量为submit时调用execute_command,传入参数execute_command nice -n "$SPARK_NICENESS" bash "${SPARK_HOME}"/bin/spark-submit --class "$command" "$@";;(*)echo "unknown mode: $mode"exit 1;;esac}# 使用option变量进行匹配
case $option in# 如果变量为submit则执行run_command方法,并将submit作为第一个参数传入(submit)run_command submit "$@";;# 如果变量为start则执行run_command方法,并将start作为第一个参数传入(start)run_command class "$@";;# 如果变量为stop,则执行kill命令,并删除进程文件  (stop)if [ -f $pid ]; thenTARGET_ID="$(cat "$pid")"if [[ $(ps -p "$TARGET_ID" -o comm=) =~ "java" ]]; thenecho "stopping $command"kill "$TARGET_ID" && rm -f "$pid"elseecho "no $command to stop"fielseecho "no $command to stop"fi;;# 如果变量为status,则打印状态信息(status)if [ -f $pid ]; thenTARGET_ID="$(cat "$pid")"if [[ $(ps -p "$TARGET_ID" -o comm=) =~ "java" ]]; thenecho $command is running.exit 0elseecho $pid file is present but $command not runningexit 1fielseecho $command not running.exit 2fi;;# 如果变量未匹配上上述情况,则打印脚本使用方法(*)echo $usageexit 1;;esac

2. debug spark-daemon.sh脚本

因为start-master.sh脚本内部调用了spark-daemon.sh脚本,并传入了参数,所以可以通过外部传入参数并进行debug

sh -x /usr/local/spark/sbin/spark-daemon.sh start org.apache.spark.deploy.master.Master 1 --host s101 --port 7077 --webui-port 8080

+ usage='Usage: spark-daemon.sh [--config <conf-dir>] (start|stop|submit|status) <spark-command> <spark-instance-number> <args...>'# 如果没有提供参数,则打印usage使用说明并中断脚本
+ '[' 9 -le 1 ']'# 判断是否配置了SPARK_HOME,如果没有则手动设置
+ '[' -z /usr/local/spark ']'# 通过.加上文件名临时执行spark-config.sh脚本
## 设置SPARK_HOME、SPARK_CONF_DIR以及python的一些环境变量
+ . /usr/local/spark/sbin/spark-config.sh
++ '[' -z /usr/local/spark ']'
++ export SPARK_CONF_DIR=/usr/local/spark/conf
++ SPARK_CONF_DIR=/usr/local/spark/conf
++ '[' -z '' ']'
++ export PYTHONPATH=/usr/local/spark/python:
++ PYTHONPATH=/usr/local/spark/python:
++ export PYTHONPATH=/usr/local/spark/python/lib/py4j-0.10.7-src.zip:/usr/local/spark/python:
++ PYTHONPATH=/usr/local/spark/python/lib/py4j-0.10.7-src.zip:/usr/local/spark/python:
++ export PYSPARK_PYTHONPATH_SET=1
++ PYSPARK_PYTHONPATH_SET=1# 检查参数中是否包含--config,如果该参数的值不为目录则退出
+ '[' start == --config ']'# 分别对option、command、instance进行赋值
+ option=start
+ shift
+ command=org.apache.spark.deploy.master.Master
+ shift
+ instance=1
+ shift# 通过.加上文件名临时执行load-spark-env.sh脚本
## 设置SPARK_HOME、SPARK_SCALA_VERSION环境变量
+ . /usr/local/spark/bin/load-spark-env.sh
++ '[' -z /usr/local/spark ']'
++ '[' -z '' ']'
++ export SPARK_ENV_LOADED=1
++ SPARK_ENV_LOADED=1
++ export SPARK_CONF_DIR=/usr/local/spark/conf
++ SPARK_CONF_DIR=/usr/local/spark/conf
++ '[' -f /usr/local/spark/conf/spark-env.sh ']'
++ set -a
++ . /usr/local/spark/conf/spark-env.sh
+++ JAVA_HOME=/usr/local/jdk
+++ HADOOP_CONF_DIR=/usr/local/spark/hadoop/etc/hadoop
+++ SPARK_LOCAL_IP=s101
++ set +a
++ '[' -z '' ']'
++ ASSEMBLY_DIR2=/usr/local/spark/assembly/target/scala-2.11
++ ASSEMBLY_DIR1=/usr/local/spark/assembly/target/scala-2.12
++ [[ -d /usr/local/spark/assembly/target/scala-2.11 ]]
++ '[' -d /usr/local/spark/assembly/target/scala-2.11 ']'
++ export SPARK_SCALA_VERSION=2.12
++ SPARK_SCALA_VERSION=2.12+ '[' '' = '' ']'
+ export SPARK_IDENT_STRING=hadoop
+ SPARK_IDENT_STRING=hadoop# 设置SPARK_PRINT_LAUNCH_COMMAND环境变量
+ export SPARK_PRINT_LAUNCH_COMMAND=1
+ SPARK_PRINT_LAUNCH_COMMAND=1# 日志相关
+ '[' '' = '' ']'
+ export SPARK_LOG_DIR=/usr/local/spark/logs
+ SPARK_LOG_DIR=/usr/local/spark/logs
+ mkdir -p /usr/local/spark/logs
+ touch /usr/local/spark/logs/.spark_test
+ TEST_LOG_DIR=0
+ '[' 0 = 0 ']'
+ rm -f /usr/local/spark/logs/.spark_test
+ '[' '' = '' ']'# 设置spark进程目录
+ SPARK_PID_DIR=/tmp# 定义log和pid变量
+ log=/usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out
+ pid=/tmp/spark-hadoop-org.apache.spark.deploy.master.Master-1.pid# 设置默认的调度优先级
+ '[' '' = '' ']'
+ export SPARK_NICENESS=0
+ SPARK_NICENESS=0# 使用option参数进行匹配,调用方法,传入不同的参数
+ case $option in
# 调用run_command方法,传入class参数以及上个脚本传入的参数
+ run_command class --host s101 --port 7077 --webui-port 8080# run_command方法内容
+ mode=class
+ shift
# 创建进程目录
+ mkdir -p /tmp
# 判断进程文件是否存在,如果存在则给出提示:进程已存在,请先停止
+ '[' -f /tmp/spark-hadoop-org.apache.spark.deploy.master.Master-1.pid ']'
+ '[' '' '!=' '' ']'
+ spark_rotate_log /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out
+ log=/usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out
+ num=5
+ '[' -n '' ']'
+ '[' -f /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out ']'
+ '[' 5 -gt 1 ']'
++ expr 5 - 1
+ prev=4
+ '[' -f /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out.4 ']'
+ mv /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out.4 /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out.5
+ num=4
+ '[' 4 -gt 1 ']'
++ expr 4 - 1
+ prev=3
+ '[' -f /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out.3 ']'
+ mv /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out.3 /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out.4
+ num=3
+ '[' 3 -gt 1 ']'
++ expr 3 - 1
+ prev=2
+ '[' -f /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out.2 ']'
+ mv /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out.2 /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out.3
+ num=2
+ '[' 2 -gt 1 ']'
++ expr 2 - 1
+ prev=1
+ '[' -f /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out.1 ']'
+ mv /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out.1 /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out.2
+ num=1
+ '[' 1 -gt 1 ']'
+ mv /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out.1
+ echo 'starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out'
starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-s101.out# 使用mode值:class进行匹配
+ case "$mode" in
# 调用execute_command方法
+ execute_command nice -n 0 /usr/local/spark/bin/spark-class org.apache.spark.deploy.master.Master --host s101 --port 7077 --webui-port 8080#execute_command方法内容
+ '[' -z ']'
+ newpid=3150
+ echo 3150
+ for i in '{1..10}'
++ ps -p 3150 -o comm=# 调用spark-class脚本
+ nohup -- nice -n 0 /usr/local/spark/bin/spark-class org.apache.spark.deploy.master.Master --host s101 --port 7077 --webui-port 8080
+ [[ bash =~ java ]]
+ sleep 0.5
+ for i in '{1..10}'
++ ps -p 3150 -o comm=
+ [[ java =~ java ]]
+ break
+ sleep 2
++ ps -p 3150 -o comm=
+ [[ ! java =~ java ]]

spark源码解析:2.2 start-daemon.sh脚本分析相关推荐

  1. ConcurrentHashMap源码解析_02 预热(内部一些小方法分析)

    前面一篇文章中介绍了并发HashMap的主要成员属性,内部类和构造函数,下面在正式分析并发HashMap成员方法之前,先分析一些内部类中的字方法函数: 首先来看下ConcurrentHashMap内部 ...

  2. spark源码解析之基本概念

    从两方面来阐述spark的组件,一个是宏观上,一个是微观上. 1. spark组件 要分析spark的源码,首先要了解spark是如何工作的.spark的组件: 了解其工作过程先要了解基本概念 官方罗 ...

  3. android glide流程解析,Glide 源码解析(一):简单流程分析

    这篇文章上次修改于 839 天前,可能其部分内容已经发生变化,如有疑问可询问作者. 这篇文章是这个系列的第一篇文章,我第一次写这样连续系列的文章,我先一层一层的剥开 Glide ,如果谁有更好的想法欢 ...

  4. spark源码解析之scala基本语法

    1. scala初识 spark由scala编写,要解析scala,首先要对scala有基本的了解. 1.1 class vs object A class is a blueprint for ob ...

  5. [源码解析] 深度学习分布式训练框架 horovod (10) --- run on spark

    [源码解析] 深度学习分布式训练框架 horovod (10) - run on spark 文章目录 [源码解析] 深度学习分布式训练框架 horovod (10) --- run on spark ...

  6. [源码解析] 深度学习分布式训练框架 horovod (11) --- on spark --- GLOO 方案

    [源码解析] 深度学习分布式训练框架 horovod (11) - on spark - GLOO 方案 文章目录 [源码解析] 深度学习分布式训练框架 horovod (11) --- on spa ...

  7. Flink 全网最全资源(视频、博客、PPT、入门、原理、实战、性能调优、源码解析、问答等持续更新)

    Flink 学习 https://github.com/zhisheng17/flink-learning 麻烦路过的各位亲给这个项目点个 star,太不易了,写了这么多,算是对我坚持下来的一种鼓励吧 ...

  8. Flink 全网最全资源(视频、博客、PPT、入门、实战、源码解析、问答等持续更新)...

    Flink 学习 github.com/zhisheng17/- 麻烦路过的各位亲给这个项目点个 star,太不易了,写了这么多,算是对我坚持下来的一种鼓励吧! 本项目结构 博客 1.Flink 从0 ...

  9. Spring源码解析 - AbstractBeanFactory 实现接口与父类分析

    2019独角兽企业重金招聘Python工程师标准>>> 我们先来看类图吧: 除了BeanFactory这一支的接口,AbstractBeanFactory主要实现了AliasRegi ...

最新文章

  1. vue怎么vw布局好用_vue 实现 rem 布局的 或者 vw 布局的方法
  2. 通过libVirt抓取kvm虚拟机监控指标数据
  3. Spring Cloud Alibaba迁移指南(三):极简的 Config 1
  4. java中程序跳转_java程序中先后台交互的两种实现方式以及页面之间的跳转
  5. mvc html.dropdownlist,ASP.NET MVC4中使用Html.DropDownListFor的方法示例
  6. c51随机数不重复_怎么让51单片机产生随机数?
  7. 算法——X^3+Y^3+Z^3=XYZ(水仙花数)
  8. [Android] Android 锁屏实现与总结 (一)
  9. 2021四川高考成绩等位分查询,四川省教育考试院:2021年四川高考成绩查询入口、查分系统...
  10. 关于hibernate的缓存使用
  11. snprintf/strncpy/strlcpy速度测试
  12. (转)投资AI的核心标准是场景和数据
  13. 手机语音混响软件_手机混响软件 如何把微信里的语音转发出去 有什么好用的变声软件 安卓微信语音转发插件...
  14. 跨国面板数据(1960-2020)二:国民核算、经常账户、贸易、fdi、运输旅游、保险金融(stata版)
  15. 2015三十本好书推荐及理由
  16. java 中介模式_中介者模式
  17. 苹果手机如何远程控制华为安卓平板电脑
  18. ORACLE查询基本语句
  19. 为什么毕业的第一份工作要进FLAG?
  20. Windows如何找到相应的COM组件

热门文章

  1. C语言程序设计习题集(中国大学MOOC翁凯)02
  2. 云计算中的 10 种虚拟化类型
  3. 流行的通讯库/消息中间件
  4. 在uniapp 中使用百度统计 【精华版】
  5. html iso标准文档,ISO9001-2015-标准中英文.doc
  6. Linux驱动开发: 网络设备驱动开发
  7. 用dumpcpp工具生成的excel.h/excel.cpp来操纵Excel
  8. SSM之一步一坑:将date类型存入到datetime类型数据表 时差八小时
  9. 深度学习分类任务常用评估指标——总结(重点)
  10. 【日记】c# 读取网页json数据