Flink 通过tikvClient 写数据太慢

【 TiDB 使用环境】测试
【 TiDB 版本】v5.4.0
【复现路径】通过flink +TIKV Client 写入数据较慢
【遇到的问题:问题现象及影响】 现在遇到 tidb 写瓶颈,想通过tikv 两阶段提交 来优化写

使用flink Stream API 开发 自定义Sink :

两阶段提交代码如下可参考:

public void KVSet(TiSession session, @Nonnull List pairs) {
System.out.println("最后要进行put .size() = " + pairs.size());
Iterator iterator = pairs.iterator();
if (!iterator.hasNext()) {
return;
}

    twoPhaseCommitter = new TwoPhaseCommitter(session, session.getTimestamp().getVersion());
    BytePairWrapper primaryPair = iterator.next();

    try {
        twoPhaseCommitter.prewritePrimaryKey(
                ConcreteBackOffer.newCustomBackOff(2000),
                primaryPair.getKey(),
                primaryPair.getValue());

        if (iterator.hasNext()) {
            twoPhaseCommitter.prewriteSecondaryKeys(
                    primaryPair.getKey(), iterator, 2000);
        }

        twoPhaseCommitter.commitPrimaryKey(
                ConcreteBackOffer.newCustomBackOff(1000),
                primaryPair.getKey(),
                session.getTimestamp().getVersion());
        System.out.println("这里提交了两阶段提交");

    } catch (Throwable ignored) {
        System.out.println("这里出现异常");
        ignored.printStackTrace();
    } finally {
        try {
            twoPhaseCommitter.close();
        } catch (Exception e) {
            System.out.println("这里又出现异常");

            e.printStackTrace();
        }

    }
}

写入测试 后的数据记录:

条数 时间s
14127 114
255 2
1 0
13623 97
330 2
1 0
27644 194
441 3
1 0
26576 201
7309 56
511 4
1 0
25397 205
156 1
1 0
13105 98
471 3
1 0
1152 9
25517 206
359 2
1 0
54 0
20234 156
574 4
1 0
19090 153
39 0
6347 46
464 3
1 0
16867 129
280 2
1 0
23832 179
529 4
1 0
30000 228
6101 49
212 1
1 0
22112 180
1 0
20835 167
331 2
1 0
23988 193
192 1
1 0
6216 50
105 0
1 0
24433 197
68 0
1619 13
35 0
18363 148
415 3
1 0
3944 31
248 1
1 0
2351 18
411 3
1 0
17074 124
419 3
1 0
1780 14
290 2
1 0
8375 67
35 0
1 0
23907 194
296 2
1 0
23032 182
400 3
1 0
10695 86
557 4
1 0
8764 57
488 3
1 0
1451 11
279 2
1 0
15296 107
306 2
1 0
7985 57
556 4
1 0
19561 143
230 1
1 0
11910 91
6 0
59 0
17334 131
232 1
1 0
10884 76
133 0
1 0
29803 230
64 0
1 0
27620 209
283 2
1 0
26211 196
288 2
1 0
609 4
72 0
1 0
13061 100
161 1
1 0
8906 72
396 3
1 0
9419 74
346 2
1 0
12576 101
227 2
1 0
1087 8
6608 53
2 0
11010 88
473 3
1 0
18498 150
593 4
1 0
4146 33
456 3
1 0
16378 126
394 3
1 0
1547 12
45 0
13211 101
226 1
1 0
25327 191
420 3
1 0
25971 196
91 0
1 0
16258 120
48 0
2 0
20119 153
213 1
1 0
1451 11
1 0
20958 159
297 2
2 0
14308 109
39 0
2852 22
447 3
1 0
2269 17
368 2
1 0
16736 126
130 1
1 0
18719 150
71 0
1 0
16420 132
476 3
2 0

平均 每秒 130.2条/s

写入设置:最大批次 写入条数 30000条,最大 批次 时间1s

同时我也进行了 最大批次 3000 条数据,最大批次时间1s

结果也是差不多;

我写的方式是单个task ,单线程写入,完全不及JDBC ,大失所望 :face_holding_back_tears:

这里再分享一下自己汇总的 tidb Column.type 和java 数据类型的转化对比 type

最后一个疑问: 我们通过tidb JDBC 写入数据在底层实现也是 tikv kvClient put /get /delete 实现的么?是我自己写的方式需要优化么?

哦,对了,没有使用 tikv rawClient ,rawClien 没有找到 encode & decode 相关资料

需要注意以下几点:

  1. 请确保您的 TiKV 集群已经正确配置和部署,并且您的 Java 客户端已经正确连接到 TiKV 集群。
  2. 请确保您的代码中使用的 TiKV Java 客户端版本与您的 TiKV 集群版本兼容。您可以在 TiKV Java 客户端的 GitHub 仓库中查看版本兼容性信息。
  3. 请注意,使用两阶段提交可能会对性能产生一定的影响。在实际使用中,您需要根据具体情况进行测试和优化。

另外,如果您遇到 TiDB 写入性能问题,您可以首先检查 TiDB 相关的仪表盘,如 TiKV-FastTune 仪表盘。如果问题在存储端,您可以在 TiKV-FastTune 仪表盘中查看可能导致性能问题的原因,并检查相应的图表。

你的资源配置是什么样的?

测试环境16G内存四核 3台 机器,部署 Tidb 3, tikv 3, tipd 3 flink 本地部署,16G+12核,但是使用单并行度进行写操作

TiKV-FastTune 仪表盘 这个还没有研究过,得看下

可以 类似 Doris 做 flink-connect-tidb 来优化flink 写 tidb

突然想到,flink操作tikv 是单线程操作,使用本地资源,但是jdbc不是,它会调用集群的资源去写,如此,jdbc 写入速度是单独操作tikv 的 集群总线程的倍数,如此解释好像会合理一些