【 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个