#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# 1.如果SPARK_HOME没有设置( -z 判定变量空串)
if [ -z "${SPARK_HOME}" ]; then
source "$(dirname "$0")"/find-spark-home
fi
# 2.加载 spark-env.sh ,主要是配置文件,其次scala路径等信息
. "${SPARK_HOME}"/bin/load-spark-env.sh
# 3.查找JAVA_HONE ( -n 判定变量非空)
if [ -n "${JAVA_HOME}" ]; then
RUNNER="${JAVA_HOME}/bin/java"
else
if [ "$(command -v java)" ]; then
RUNNER="java"
else
echo "JAVA_HOME is not set" >&2
exit 1
fi
fi
# 4.查找spark jars, 如果${SPARK_HOME}/jars目录不存在,则使用复合包(所有依赖的class都打包在一个jar里)
if [ -d "${SPARK_HOME}/jars" ]; then
SPARK_JARS_DIR="${SPARK_HOME}/jars"
else
SPARK_JARS_DIR="${SPARK_HOME}/assembly/target/scala-$SPARK_SCALA_VERSION/jars"
fi
# check 如果spark jars 没有发现,且不是在做test,直接退出
if [ ! -d "$SPARK_JARS_DIR" ] && [ -z "$SPARK_TESTING$SPARK_SQL_TESTING" ]; then
echo "Failed to find Spark jars directory ($SPARK_JARS_DIR)." 1>&2
echo "You need to build Spark with the target \"package\" before running this program." 1>&2
exit 1
else
LAUNCH_CLASSPATH="$SPARK_JARS_DIR/*"
fi
# 5.如果设置的有前置的class,加入classpath
if [ -n "$SPARK_PREPEND_CLASSES" ]; then
LAUNCH_CLASSPATH="${SPARK_HOME}/launcher/target/scala-$SPARK_SCALA_VERSION/classes:$LAUNCH_CLASSPATH"
fi
# check如果是测试,下掉yarn配置,hadoop配置
if [[ -n "$SPARK_TESTING" ]]; then
unset YARN_CONF_DIR
unset HADOOP_CONF_DIR
fi
# 6.启动
#
# 启动器库将打印由 NULL 字符分隔的参数,以允许带有由 shell 以其他方式解释的字符的参数。
# 在 while 循环中读取,填充将用于执行最终命令的数组。
#
# 启动器的退出码附加到输出中,是为了父 shell 将其从命令数组中删除,并通过检查该值来确认是否成功启动。
build_command() {
"$RUNNER" -Xmx128m -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "$@"
printf "%d\0" $?
}
# ========================================================
# 注意!注意!注意!重要的事说三遍,真实的启动其实还没有开始,
# org.apache.spark.launcher.Main做的工作,只是 导航(参数解析 + 启动命令构建)而已,
# 比如:
# 1.用户执行的是spark-submit命令,就构建submit需要参数
# 2.如果执行的启动master,worker,连接history等命令时,就构建对应的参数
# 上面的构建结果是一个完整的可执行命令,会打印到标准输出,然后由本脚本的,最后两行命令触发执行
# =====================================================
# 关闭posix模式,因为它不允许进程替换
set +o posix
CMD=()
while IFS= read -d '' -r ARG; do
CMD+=("$ARG")
done < <(build_command "$@")
COUNT=${#CMD[@]}
LAST=$((COUNT - 1))
LAUNCHER_EXIT_CODE=${CMD[$LAST]}
# 某些 JVM 故障会导致错误被打印到 stdout(而不是 stderr),这会导致解析启动器输出的代码变得混乱。
# 在这些情况下,检查退出代码是否为整数,如果不是,则将其作为特殊错误情况处理。
if ! [[ $LAUNCHER_EXIT_CODE =~ ^[0-9]+$ ]]; then
echo "${CMD[@]}" | head -n-1 1>&2
exit 1
fi
if [ $LAUNCHER_EXIT_CODE != 0 ]; then
exit $LAUNCHER_EXIT_CODE
fi
# hello everyone , 真正的提交在这里哦
# 注意,如果想把执行的命令打印出来,将设置环境变量SPARK_PRINT_LAUNCH_COMMAND=true
CMD=("${CMD[@]:0:$LAST}")
exec "${CMD[@]}"
spark bin 之 spark-class.sh
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 原因JDK的安装目录与kafka的默认安装目录不一致 解决将JDK的安装目录下的java文件夹目录指向kafka的...
- CentOS7中安装kafka_2.12-2.4.0,启动kafka自带的zk单节点实例 命令:systemctl...
- 可以出来是路径找不到,应该是FLUTTER_ROOT这个全局变量没有取到值的原因 1、检查xcode_backen...
- 1,检查路径是否存在文件,如果存在: Xcode-- PROJECT--Build Setting--FLUTTE...
- 在shell脚本的开头往往有一句话来定义使用哪种sh解释器来解释脚本。 目前研发送测的shell脚本中主要有以下两...