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

本文解析了Flink的Bash脚本sql-client.sh,它用于启动SQL客户端,管理类路径,包括查找并添加JAR文件,以及提供多种用法示例。脚本从Flink官方获取配置并支持自定义日志路径和JAR路径查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 的官方地址中找到相关介绍:

<think>嗯,用户是Flink的初学者,用sql-client.sh提交同步作业,但发现Flink重启后作业都没了。想用FileSystemCheckpointStorage来持久化作业。需要详细步骤。 首先,用户可能不太了解Flink的作业生命周期。FlinkSQL客户端默认情况下,作业可能是在会话模式下运行的,一旦集群重启,作业就丢失了。需要启用checkpoint和外部持久化来恢复作业状态。 用户提到FileSystemCheckpointStorage,这应该是配置checkpoint的存储位置到文件系统,比如HDFS或本地路径。但还需要确保作业本身是使用保存点(savepoint)停止,或者在配置中启用了可恢复的特性。 接下来,步骤可能包括修改配置文件,设置checkpoint的存储路径,调整作业的SQL语句或配置参数,确保checkpoint被正确触发。另外,用户可能需要在提交作业时指定持久化的存储,或者在Flink的配置文件中全局设置。 需要注意,使用sql-client.sh的话,可能需要在SQL客户端配置中启用checkpoint,并配置正确的存储路径。同时,作业提交可能需要使用CREATE语句指定必要的配置选项,比如SET语句来设置execution.checkpointing.interval等参数。 另外,用户可能混淆了checkpoint和savepoint的概念。Checkpoint用于故障恢复,而savepoint用于有计划的手动备份和升级。如果用户希望作业在重启后自动恢复,可能需要配置高可用性(HA)设置,比如ZooKeeper,并确保checkpoint存储在外部系统。 可能需要分步骤指导:1. 配置flink-conf.yaml中的checkpoint存储路径和高可用性设置;2.SQL客户端中设置相关参数;3. 提交作业时启用checkpoint;4. 测试配置是否生效,重启后作业是否恢复。 同时,用户可能没有正确配置重启策略,或者作业本身没有从checkpoint恢复的逻辑。需要确保作业在启动时指定从最近的checkpoint恢复,或者在配置中设置自动恢复。 可能还需要检查Flink的日志,确认checkpoint是否成功生成,存储路径是否正确,权限是否有问题。如果使用HDFS,需要确保Flink集群能够访问HDFS服务。</think>以下是使用 FileSystemCheckpointStorage 持久化 Flink SQL 作业的详细步骤: --- ### **1. 配置 flink-conf.yaml** ```yaml # 设置 checkpoint 存储路径(本地/HDFS) state.checkpoints.dir: hdfs:///flink/checkpoints # 或本地路径(需确保集群所有节点可访问): # state.checkpoints.dir: file:///opt/flink/checkpoints # 设置恢复策略(至少配置一个 checkpoint) execution.checkpointing.interval: 5min execution.savepoint.restore-mode: claim # 可选:启用高可用(建议生产环境使用) high-availability: zookeeper high-availability.storageDir: hdfs:///flink/ha ``` --- ### **2. 提交 SQL 作业时显式启用 Checkpoint** 在 SQL Client 中执行以下配置: ```sql -- 设置 Checkpoint 间隔(需在 DML 语句前执行) SET execution.checkpointing.interval = 60s; -- 提交作业时指定 Savepoint 路径(可选) SET execution.savepoint.path = 'hdfs:///flink/checkpoints/savepoint-xxx'; -- 编写你的 CREATE TABLE 和 INSERT INTO 语句 CREATE TABLE kafka_source (...); CREATE TABLE jdbc_sink (...); INSERT INTO jdbc_sink SELECT ... FROM kafka_source; ``` --- ### **3. 手动触发 Savepoint(可选)** ```bash # 查找运行的 JobID flink list # 手动触发 Savepoint flink savepoint <job-id> [target-dir] ``` --- ### **4. 作业恢复流程** 当集群重启后,通过以下方式恢复: ```bash # 方式一:自动从最新 Checkpoint 恢复(需配置 HA) ./sql-client.sh # 方式二:手动指定 Savepoint 路径 ./sql-client.sh -s hdfs:///flink/checkpoints/savepoint-xxx ``` --- ### **关键验证点** 1. 检查 `flink-conf.yaml` 路径是否正确 2. 查看 Web UI 的 "Checkpoints" 选项卡确认是否生成 3. 检查目标存储系统(如 HDFS)是否包含 `/flink/checkpoints` 目录 4. 作业重启后观察日志是否包含 `Restoring from Checkpoint/Savepoint` 字样 --- ### **常见问题排查** - **权限问题**:HDFS 路径需要 Flink 进程有写权限 - **路径不可达**:确保所有 TaskManager 能访问存储路径 - **配置未生效**:检查配置是否在提交作业的 Flink 环境中生效 - **状态不兼容**:修改拓扑结构后需重新生成 Savepoint 建议使用 HDFS/MinIO 等分布式存储代替本地文件系统,确保 Checkpoint 数据高可用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BigDataMLApplication

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

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

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

打赏作者

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

抵扣说明:

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

余额充值