flink job 非正常终止, 事务在 PREPARED 状态, 一直不回滚

【详述】

  • 存算一体集群,
  • flink 1.18.1 通过 flink-connector-starrocks:1.2.9_flink-1.18 写入 SR ,
  • 未配置 sink.label-prefix 参数
  • 任务停止后, 事务超时不终止

步骤:

  1. flink 任务stop 后, 给表添加字段, 一直是 WAITING_TXN 状态
  2. 查看 FE 日志, 发现提示等待前面的事务完成
2024-04-28 16:10:41.212+08:00 INFO (schema change|17) [SchemaChangeJobV2.runWaitingTxnJob():464] wait transactions before 126640 to be finished, schema change job: 29914
  1. 使用事务排查语句 SHOW TRANSACTION FROM oks WHERE id = 126637;
    一个一个的减少事务 id 后, 发现有一个flink 的 事务是 PREPARED 状态一直没有回滚, 即便是超过 10 分钟了(默认超时 600秒) 也没回滚

  2. 通过 label 手动取消事务后, 给表增加字段的任务执行成功

    curl --location-trusted -u oks_etl:vniwe_834w2u4 -H "label:flink-5411628e-628e-4469-b610-436432630db2" \
        -H "Expect:100-continue" \
        -H "db:xxxx" \
        -XPOST http://sr-fe02:18030/api/transaction/rollback

【背景】执行 flink job 的 cancel 操作, 终止任务
【业务影响】 由于事务不终止, 导致给表增加字段失败, 提示 WAITING_TXN
【是否存算分离】否,
【StarRocks版本】例如:3.2.6
【集群规模】例如:3fe + 3be(fe与be独立部署)

【表模型】聚合模型
【导入或者导出方式】Flink
【附件】
这是我手动取消后的事务状态

补充:
如果是 执行 /bin/flink cancel 命令停止任务, 会触发此问题

如果执行的 /bin/flink stop 命令, 可以优雅的停止 job, 就不会触发此问题

通过查看源代码知道大概了解问题所在了.
文档中 https://docs.starrocks.io/zh/docs/loading/Flink-connector-starrocks/
指出, sink 保证 exactly-once 语义相关配置, 需要配置 label 前缀,可以防止事务超时被自动清理,

通过 查看 com.starrocks.connector.flink.table.sink.StarRocksDynamicSinkFunctionV2 源码发现

 if (labelPrefix == null ||
                sinkOptions.getSemantic() == StarRocksSinkSemantic.AT_LEAST_ONCE ||
                !sinkOptions.isEnableExactlyOnceLabelGen()) {
            labelGeneratorFactory = new LabelGeneratorFactory.DefaultLabelGeneratorFactory(
                    labelPrefix == null ? "flink" : labelPrefix);

如果没指定前缀, 会默认给执行一个 ‘flink’ 前缀,
我的理解是, 由于有了前缀, 所以事务不会被超时清理,

但是文档中 https://github.com/StarRocks/starrocks-connector-for-apache-flink/blob/v1.2.9/docs/content/connector-sink.md 写的默认值为 none

这块文档应该修改下, :slight_smile: :grinning:

之前也遇到flink job 异常的问题,也是通过rollback解决
还有一个现象是不能alter的时候,可以重命名表