为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】
【概述】 场景 + 问题概述
在一个过亿的数据表中, 需要根据当前表的数据,经过一定的业务操作修改数据,再把数据回填到当前表中,简单的说就是根据当前数据修改数据。
目前计划是通过tispark,但因为spark 目前好像还不支持update操作,操作方式是append;
故在spark使用了insert int xxx() ON DUPLICATE KEY UPDATE 的方式;不过目前测试下来,性能不佳,请问各位大佬,有什么良策呢?
【背景】 做过哪些操作
【现象】 业务和数据库现象
【问题】 当前遇到的问题
【业务影响】
【 TiDB 版本】
tidb-v5.1.1
【附件】 相关日志及监控(https://metricstool.pingcap.com/)
若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。
1 个赞
xfworld
(魔幻之翼)
2
3 个赞
xfworld
(魔幻之翼)
4
1 个赞
数据小黑
(数据小黑)
5
请问你是通过哪种方式写回tidb的?是jdbc方式还是直写tikv的操作?直写tikv的方式类似
从你的描述来看,应该是通过jdbc的方式,建议尝试一下直写tikv的方式。
直写tikv参考:
// tispark will send
lock table
command to TiDB via JDBC
val tidbOptions: Map[String, String] = Map(
“tidb.addr” → “127.0.0.1”,
“tidb.password” → “”,
“tidb.port” → “4000”,
“tidb.user” → “root”,
“spark.tispark.pd.addresses” → “127.0.0.1:2379”
)
val customer = spark.sql(“select * from customer limit 100000”)
customer.write
.format(“tidb”)
.option(“database”, “tpch_test”)
.option(“table”, “cust_test_select”)
.options(tidbOptions)
.mode(“append”)
.save()
这种方式,不支持几个场景,针对2.4.1版本,2.5.0还在测试中:
1.聚簇表不支持
2.分区表不支持
3.auto random 列不支持
4.generated column不支持
1 个赞
tispark 官网上,通过 sql 来 insert 的方式是可以直连 tikv 的,但需要一些额外步骤https://github.com/pingcap/tispark/blob/master/docs/datasource_api_userguide.md#use-data-source-api-in-sparksql
但还是更推荐使用 write api ,指定 replace true 即可。https://github.com/pingcap/tispark/blob/master/docs/datasource_api_userguide.md#tidb-data-source-api-user-guide
1.想问一下您 insert 的方式是官网这种方式吗?看起来更像是使用了 spark jdbc connector,这就没有办法 bypass tidb
2.性能不佳:能否分享一些您想达到的性能与目前测试下来的性能?如果后面使用了 tispark 写入也可以分享一下基于 tispark 的性能
system
(system)
关闭
7
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。