RawKVClient#batchPut不能写入

【 TiDB 使用环境】
【 TiDB 版本】
5.4.3
tikv-client-java:3.3.8

【遇到的问题:问题现象及影响】
因为数据量极大,在数据写入时选择 batchPut api 使用 flink 自定义 sink 写入,但是经过实验发现,不能写入,任务阻塞。
并报错如下:

org.tikv.common.exception.TiKVException: TimeOut Exceeded for current operation.
	at org.tikv.common.util.ClientUtils.getTasks(ClientUtils.java:181)
	at org.tikv.raw.RawKVClient.doSendBatchPut(RawKVClient.java:756)
	at org.tikv.raw.RawKVClient.batchPut(RawKVClient.java:260)

使用 put 可以写入,将 key 设置为 时间戳字符串,batchPut 又可以写入。
经搜索得知 key 需要有序,将 key 使用 treeMap 排序后 还是不能写入。

代码如下:

    private void insert() {
        TreeMap<String, String> orderedPairs = new TreeMap<>();
        for (FurionSceneResult element : elements) {
//            String key = String.format(tikvKey, element.getPrimaryKey(), element.getSceneId()) ;// 不能写入
            String key = "key_" + System.currentTimeMillis();// 可以写入
            String value = element.toHbaseString();
            orderedPairs.put(key, value);
        }
        Map<ByteString, ByteString> kvPairs = new HashMap<>();
        for (String key : orderedPairs.keySet()) {
            kvPairs.put(ByteString.copyFromUtf8(key), ByteString.copyFromUtf8(orderedPairs.get(key)));
        }
        tiKVClient.batchPut(kvPairs, TTL);
        log.info("==================== batchPut success ====================");
        elements.clear();
    }

【资源配置】
PD节点:cpu: “32” memory: 48Gi
KV节点:cpu: “16” memory: 32Gi
KV节点 16个

直接用 client 的 batchPut api 写入呢? 不通过 flink

可以的。
我觉得跟 flink 没啥关系,问题出在 key 哪里,我正常业务 key ,就写不进去,但是用时间戳就可以。
补充,key 是长度为 34 的字符串,每批大小 1000。

key 只是一个键值的描述而已, 怎么生成,怎么使用,均是自由选择

既然 Flink 的自定义 sink 存在处理上的问题,建议好好跟踪一下

RawKV API 已经经历过很多次压测了,版本也经历了多次迭代,很成熟了~

单 put 插入也很慢。

模拟key,一个真实 用户主键 + 时间戳,代码如下:

    private void insert() {
        TreeMap<String, String> orderedPairs = new TreeMap<>();
        for (FurionSceneResult element : elements) {
//            String key = String.format(tikvKey, element.getPrimaryKey(), element.getSceneId());
            String key = String.format(tikvKey, "xxxxxxxxb_xxxxTuxxxsWV6Jxxxx", element.getSceneId());
            String value = element.toHbaseString();
            orderedPairs.put(key, value);
        }
        Map<ByteString, ByteString> kvPairs = new HashMap<>();
        for (String key : orderedPairs.keySet()) {
            kvPairs.put(ByteString.copyFromUtf8(key), ByteString.copyFromUtf8(orderedPairs.get(key)));
        }
        tiKVClient.batchPut(kvPairs, TTL);
        log.info("==================== batchPut success ====================");
        elements.clear();
    }

可以写入,并且速度很快。

我想问一下,个人猜测,用户每天是 千万级别 ,这个的 scene 是 1000 ,因此我也无 key 会非常多,会引起找 region 慢,这里的 key 是如何影响写入过程的。

热点问题咯,可以参考下这篇,进行排查

性能上的可以参考以下的文档,进行排查

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。