【flink脚本系列】sql-client.sh功能用法示例源码解析

flink脚本系列sql-client.sh源码解析

脚本主要功能

该脚本是一个用于启动 Flink SQL 客户端的 Bash 脚本。它主要完成以下功能:

  1. 解析脚本所在的路径,并获取 Flink 的配置信息。
  2. 设置日志文件路径和相关配置。
  3. 检查是否已经将 Flink SQL 客户端的 JAR 文件添加到类路径中。
  4. 如果未添加,则检查是否存在指定目录下的 flink-sql-client*.jar 文件,并将其添加到类路径中。
  5. 最后,使用 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 客户端,并根据不同的情况设置类路径。以下是一些示例用法:

  1. 启动 Flink SQL 客户端(已将 flink-sql-client*.jar 添加到类路径):
./sql-client.sh
  1. 启动 Flink SQL 客户端(未将 flink-sql-client*.jar 添加到类路径):
./sql-client.sh --jar /path/to/flink-sql-client.jar
  1. 启动 Flink SQL 客户端(在 /opt 目录下查找 flink-sql-client*.jar):
export FLINK_OPT_DIR=/opt/flink
./sql-client.sh
  1. 设置日志文件路径:
export FLINK_LOG_DIR=/path/to/logs
./sql-client.sh

官方链接

该脚本是从 Flink 的 bash 脚本中采用的一部分。您可以在 Flink 的官方地址中找到相关介绍:

好的,您可以按照以下的方式来编写docker-compose.yml文件: ``` version: '3.7' services: jobmanager: image: flink:1.17.0 command: jobmanager ports: - "8081:8081" taskmanager: image: flink:1.17.0 command: taskmanager depends_on: - jobmanager links: - jobmanager:jobmanager environment: - JOB_MANAGER_RPC_ADDRESS=jobmanager - FLINK_TASK_MANAGER_MEMORY_PROCESS_SIZE=1024m elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2 environment: - discovery.type=single-node ports: - "9200:9200" mysql: image: mysql:8.0 environment: - MYSQL_ROOT_PASSWORD=<your_password> - MYSQL_USER=<your_user> - MYSQL_PASSWORD=<your_password> - MYSQL_DATABASE=<your_database> ports: - "3306:3306" postgres: image: postgres:13.1 environment: - POSTGRES_USER=<your_user> - POSTGRES_PASSWORD=<your_password> - POSTGRES_DB=<your_database> ports: - "5432:5432" flink-job: image: flink:1.17.0 volumes: - ./flink-conf.yaml:/opt/flink/conf/flink-conf.yaml - ./lib/flink-sql-connector-elasticsearch7-3.0.1-1.17.jar:/opt/flink/lib/flink-sql-connector-elasticsearch7-3.0.1-1.17.jar - ./lib/flink-sql-connector-mysql-cdc-2.3.0.jar:/opt/flink/lib/flink-sql-connector-mysql-cdc-2.3.0.jar - ./lib/flink-sql-connector-postgres-cdc-2.3.0.jar:/opt/flink/lib/flink-sql-connector-postgres-cdc-2.3.0.jar command: jobmanager depends_on: - jobmanager - elasticsearch - mysql - postgres links: - elasticsearch:elasticsearch - mysql:mysql - postgres:postgres environment: - JOB_MANAGER_RPC_ADDRESS=jobmanager - FLINK_TM_HEAP_SIZE=1024m - FLINK_PROPERTIES= - FLINK_ENV_JAVA_OPTS= - FLINK_ENV_JAVA_TOOL_OPTIONS= - FLINK_CONF_DIR=/opt/flink/conf - FLINK_LIB_DIR=/opt/flink/lib - FLINK_PLUGINS_DIR=/opt/flink/plugins - FLINK_OPT_DIR=/opt/flink/opt - FLINK_LOG_DIR=/opt/flink/log - FLINK_HOME=/opt/flink volumes: - ./job.jar:/opt/flink/job.jar - ./flink-conf.yaml:/opt/flink/conf/flink-conf.yaml ``` 其中需要注意的是: 1. 在 `flink-job` 服务中,我们使用了 `volumes` 来挂载 `flink-conf.yaml` 和三个依赖的jar包到容器的 `/opt/flink/conf` 和 `/opt/flink/lib` 目录中。 2. 我们在 `flink-job` 服务的环境变量中设置了 `FLINK_PROPERTIES`,因为 Flink 在启动时会读取这个环境变量中的配置信息。 3. 我们在 `flink-job` 服务的环境变量中设置了 `FLINK_LIB_DIR`,这是因为 Flink 在启动时会从这个目录中加载依赖的jar包。 4. 我们在 `flink-job` 服务的环境变量中设置了 `FLINK_CONF_DIR`,这是因为 Flink 在启动时会读取这个目录中的配置文件。 5. 我们在 `flink-job` 服务的环境变量中设置了 `FLINK_HOME`,这是因为 Flink 在启动时需要知道它的安装路径。 上述的docker-compose.yml文件可以满足您的要求,在启动容器后,您可以使用以下的命令来进入到flink-job容器中: ``` docker-compose run flink-job /bin/bash ``` 然后,您可以在容器中运行Flink任务了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值