flink脚本系列sql-client.sh源码解析
脚本主要功能
该脚本是一个用于启动 Flink SQL 客户端的 Bash 脚本。它主要完成以下功能:
- 解析脚本所在的路径,并获取 Flink 的配置信息。
- 设置日志文件路径和相关配置。
- 检查是否已经将 Flink SQL 客户端的 JAR 文件添加到类路径中。
- 如果未添加,则检查是否存在指定目录下的 flink-sql-client*.jar 文件,并将其添加到类路径中。
- 最后,使用 Java 运行时执行 Flink SQL 客户端。
脚本加上中文注释
################################################################################
# Adopted from "flink" bash script
################################################################################
target="$0"
# 对于直接通过符号链接运行的情况,通过迭代跟随符号链接找到正确的 bin 路径。
# 注意:为了与 POSIX 兼容,这里不能使用 readlink 实用程序。
iteration=0
while [ -L "$target" ]; do
if [ "$iteration" -gt 100 ]; then
echo "无法解析路径:$target 中存在循环符号链接。"
break
fi
ls=`ls -ld -- "$target"`
target=`expr "$ls" : '.* -> \(.*\)$'`
iteration=$((iteration + 1))
done
# 将相对路径转换为绝对路径
bin=`dirname "$target"`
# 获取 flink 配置
. "$bin"/config.sh
if [ "$FLINK_IDENT_STRING" = "" ]; then
FLINK_IDENT_STRING="$USER"
fi
CC_CLASSPATH=`constructFlinkClassPath`
################################################################################
# SQL client specific logic
################################################################################
log=$FLINK_LOG_DIR/flink-$FLINK_IDENT_STRING-sql-client-$HOSTNAME.log
log_setting=(-Dlog.file="$log" -Dlog4j.configuration=file:"$FLINK_CONF_DIR"/log4j-cli.properties -Dlog4j.configurationFile=file:"$FLINK_CONF_DIR"/log4j-cli.properties -Dlogback.configurationFile=file:"$FLINK_CONF_DIR"/logback.xml)
# 获取 /opt 目录下的 flink-sql-client*.jar 的路径
FLINK_SQL_CLIENT_JAR=$(find "$FLINK_OPT_DIR" -regex ".*flink-sql-client.*.jar")
# 将 flink-python.jar 添加到类路径中
if [[ ! "$CC_CLASSPATH" =~ .*flink-python.*.jar ]]; then
FLINK_PYTHON_JAR=$(find "$FLINK_OPT_DIR" -regex ".*flink-python.*.jar")
if [ -n "$FLINK_PYTHON_JAR" ]; then
CC_CLASSPATH="$CC_CLASSPATH:$FLINK_PYTHON_JAR"
fi
fi
# 检查 SQL 客户端是否已经在类路径中,无需手动添加
if [[ "$CC_CLASSPATH" =~ .*flink-sql-client.*.jar ]]; then
# 启动不带 jar 包的客户端
exec "$JAVA_RUN" $JVM_ARGS "${log_setting[@]}" -classpath "`manglePathList "$CC_CLASSPATH:$INTERNAL_HADOOP_CLASSPATHS"`" org.apache.flink.table.client.SqlClient "$@"
# 检查 /opt 目录下是否存在 SQL 客户端的 JAR 包
elif [ -n "$FLINK_SQL_CLIENT_JAR" ]; then
# 启动带 jar 包的客户端
exec "$JAVA_RUN" $JVM_ARGS "${log_setting[@]}" -classpath "`manglePathList "$CC_CLASSPATH:$INTERNAL_HADOOP_CLASSPATHS:$FLINK_SQL_CLIENT_JAR"`" org.apache.flink.table.client.SqlClient "$@" --jar "`manglePath $FLINK_SQL_CLIENT_JAR`"
# 输出错误消息到 stderr
else
(>&2 echo "[ERROR] 在类路径和 /opt 目录下均未找到 Flink SQL 客户端 JAR 文件 'flink-sql-client*.jar',应位于 $FLINK_OPT_DIR 目录中。")
# 强制退出进程以标志失败
exit 1
fi
该脚本多种用法及其代码示例
这个脚本主要用于启动 Flink SQL 客户端,并根据不同的情况设置类路径。以下是一些示例用法:
- 启动 Flink SQL 客户端(已将 flink-sql-client*.jar 添加到类路径):
./sql-client.sh
- 启动 Flink SQL 客户端(未将 flink-sql-client*.jar 添加到类路径):
./sql-client.sh --jar /path/to/flink-sql-client.jar
- 启动 Flink SQL 客户端(在 /opt 目录下查找 flink-sql-client*.jar):
export FLINK_OPT_DIR=/opt/flink
./sql-client.sh
- 设置日志文件路径:
export FLINK_LOG_DIR=/path/to/logs
./sql-client.sh
官方链接
该脚本是从 Flink 的 bash 脚本中采用的一部分。您可以在 Flink 的官方地址中找到相关介绍: