如何提升Flink写入tidb的速率

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】
数仓储存

【概述】 场景 + 问题概述
数仓全量数据在tidb中,有时需要全量复写或者新增全量数据。使用flink jdbc批量写入但是写入的速率和单条数据的写入速率差不多没有量级的提升,请问一下这个是什么原因。是我缺失什么设置了吗。

【Flink + TiDB 上下游关系和逻辑】
flink etl后将数据写入tidb
【背景】 做过哪些操作
1.使用Flink jdbc写入
2.在连接中新增rewriteBatchedStatements=true
3.在连接中新增 useServerPrepStmts = true & cachePrepStmts = true
【现象】 业务和数据库现象
使用flink jdbc批量写入和自己实现单条写入效率差不多
flink10个并发,写入tidb的速率:
JDBC批量写入:5000/min
单条写入:4300/min
【问题】 当前遇到的问题
tidb写入过慢
【业务影响】
全量数量往往需要刷新10几个小时甚至可以到一天多
【 TiDB 版本】
4.0.12、k8s环境
【Flink 版本】
1.12.3
【附件】 相关日志及监控(https://metricstool.pingcap.com/)

本次测试是非ssd的后更新到ssd的磁盘开始测试
测试结果

疑问1: &useServerPrepStmts=true&cachePrepStmts=true好像没有生效 从grafana的 Query Summary > QPS By Instance没有看见COM_STMT_EXECUTE和COM_STMT_PREPARE数据的起伏。这个应该如何排查原因?
疑问2:从并行度10和并行度30的速率上看,并行度和写入速率不是线性关系。但是我从grafana上看资源没有达到瓶颈。这个需要从哪里着手调优?

图里 withBatchIntervalMs 这个 1000ms 说起来不少了,不过还是可以试试把 withBatchSize 设置上给一个比较大的 batch 尺寸上限看看。

另外建议直接使用 TiBigData 项目的 connector,目前他的写入端实现虽然也是用的 JDBC 但默认开启了上面的 batch 模式,也可以很方便的用 table properties 来修改。然后这块儿还会不断的演进,后面会加上 Global Transaction 的能力 bypass 掉 TiDB,在性能和事务尺寸上都能够达到更好的状态。

TiBigData 项目地址在这里: http://github.com/tidb-incubator/TiBigData

Hi,

正常情况下,Flink JDBC 批量写入不会这么慢,这种一定是遇到了某个阻塞情况。

建议对 JVM 进行一些采样(Sampling)和剖析(Profiling),以及绘制一下火焰图(Java 自带的 FlightRecorder 就可以),看下时间片主要是花在哪里,这样才方便着手优化。

1 个赞

您好,我更新了一些新的线索,期待您新的回复

我将这次的测试更新到ssd的磁盘后重新开始。
测试结束后有两个疑问希望可以解答一下。
疑问1: &useServerPrepStmts=true&cachePrepStmts=true好像没有生效 从grafana的 Query Summary > QPS By Instance 没有看见COM_STMT_EXECUTE和COM_STMT_PREPARE数据的起伏。这个应该如何排查原因?
疑问2:从并行度10和并行度30的速率上看,并行度和写入速率不是线性关系。但是我从grafana上看资源没有达到瓶颈。这个需要从哪里着手调优?

看上去攒更大的批很关键,并发度这个可以给下 job graph 么,看看实际并行度情况。另外也建议按照 @kylemeow 的提示跑一下客户端的 profiling,看看是等待在哪里。

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